goupaz / goupaz.com

Community driven open source accelerator
MIT License
220 stars 32 forks source link

Web Framework Benchmarks - TechEmpower #57

Open elgunhuseynli opened 5 years ago

elgunhuseynli commented 5 years ago

Maraqlıdır: Siz növbəti layihənizi php-laraveldə yox js/c#/rust kimi dillərdə yazsanız server xərciniz ~900 dəfə aşağı düşəcək.

lang req/s
rust 7,007,513
c++ 7,004,608
go 6,995,436
java 6,994,344
c# 6,993,704
nodejs 997,327
laravel-php 7,215

https://www.techempower.com/benchmarks/

TechEmpower'in web frameworkları üçün etdiyi benchmarkı buraya əlavə etmək istəyirəm. Sizin düşüncələriniz maraqlıdır. Sizcə niyə bəzi frameworklar bu qədər bad performance göstərərkən digərləri çox öndədir?

Qıssaca olaraq öz fikirlərimi bildirmək istəyirəm. Bir zamanların web development üçün ən məşhur dil olan PHP təəssüf ki bu benchmarkda ən axırlarda özünü göstərir. İlk öncə gəlin PHP'nin niyə bu qədər pis nəticə verdiyinə baxaq.

Fikrimcə PHP dil olaraq o qədər də pis bir dil deyil, amma web serverlərlə (http) olan inteqrasiyası onun scalable olmasının qarşısını alır. apache, nginx kimi http serverlərə hər gələn request üçün server yeni bir php processi yaradır. bunu çoxlu-request-çoxlu-process modeli adlandıraq. Bu modelin çox mənfi cəhətləri mövcuddur. İlk öncə bu yaradılan process gərək php source kodlarını başdan ayağa oxuyaraq yenidən parse edə ki execute edə bilsin. Bu time-consuming taskdır. Bundan əlavə olaraq memorydə duplicate data yaranmasına gətirib çıxarır. Hər PHP processi o qədər də balaca deyil (ortalama 10MB filan olur). Təsəvvür etdikdə ki serverə saniyədə minlərlə request gələcək, bizim bolluca memoryə ehtiyyacımız olacaq. Bir digər problem isə bu modeldə asenxron proqramlamanın faydasız olmasıdır.

Bu modelə alternativ isə çoxlu-request-tək-process modelidir. Bu modeldə bütün requestlər sadəcə 1 process tərəfindən idarə edilir. Hər yeni request gəldikdə process daxilindəki uyğun funksiyaları çağırır. (yeni process yaratmaq əvəzinə sadəcə olaraq jump olur) Concurrent requestləri qarşılamaq üçün isə IO loop'dan istifadə edilərək scheduling yaradılır. (bir başqa adı asenxron proqramlaşdırmadır, səhvim varsa düzəldin).

Nümunə olaraq NodeJS'i göstərə bilərik. NodeJS cross-platform asenxron i/o librarysi olan libuv'ni işlədir. libuv linuxdakı epoll()'un windowsdakı IOCP, osx'deki kqueue() event portlarının üzərinə qurulmuş bir wrapperdir.

Bu modelin müsbət cəhəti daha az memory işlətməsi, daha qıssa response time olmasıdır.

Bunu edən sadəcə NodeJS deyil, NodeJS'dən də yaxşı edən dillər/frameworklar mövcudur. Məsələn .NET Core (C#) JIT sayəsində benchmarkda NodeJS'i qabaqlayıb. C++ dilində isə ASIO kitabxanası asenxron proqramlaşdırma üçün populyardır. (c++23'də ISO standardlarına girəcək ASIO)

Birincilikdə isə Rust dilinin actix frameworkunu görürük. saniyədə 7 milyon+ request handle edərək rekordu öz əlində tutur. Buna səbəb compiled dil olmasında görürəm.

resurs: https://en.wikipedia.org/wiki/C10k_problem https://en.wikipedia.org/wiki/Event_loop https://en.wikipedia.org/wiki/FastCGI https://en.wikipedia.org/wiki/Epoll

sakows commented 5 years ago

@elgunhuseynli elaa!