如果說nginx比Apache性能高是因為nginx用的c?
快不快和語言關系不大,快的原因得益于nginx的epoll模型 apache是多線程或者多進程,在工作的時候,當來了一個http響應,一個進程接收(listen)–>識別處理—>返回請求,在此過程中,一個進程全部處理,apche 對于套接字的I/O,讀或者寫,但是讀或者寫都是阻塞的,阻塞意味著進程就得掛起進入sleep狀態,那么一旦連接數很多,Apache必然要生成更多的進程來響應請求,一旦進程多了,CPU對于進程的切換就頻繁了,很耗資源和時間,所以就導致apache性能下降了,說白了就是處理不過來這么多進程了。
Nginx采用epoll模型,異步非阻塞。對于Nginx來說,把一個完整的連接請求處理都劃分成了事件,一個一個的事件。比如accept(), receive(),磁盤I/O,send()等,每部分都有相應的模塊去處理,一個完整的請求可能是由幾百個模塊去處理。真正核心的就是事件收集和分發模塊,這就是管理所有模塊的核心。只有核心模塊的調度才能讓對應的模塊占用CPU資源,從而處理請求。拿一個HTTP請求來說,首先在事件收集分發模塊注冊感興趣的監聽事件,注冊好之后不阻塞直接返回,接下來就不需要再管了,等待有連接來了內核會通知你(epoll的輪詢會告訴進程),cpu就可以處理其他事情去了。一旦有請求來,那么對整個請求分配相應的上下文(其實已經預先分配好),這時候再注冊新的感興趣的事件(read函數),同樣客戶端數據來了內核會自動通知進程可以去讀數據了,讀了數據之后就是解析,解析完后去磁盤找資源(I/O),一旦I/O完成會通知進程,進程開始給客戶端發回數據send(),這時候也不是阻塞的,調用后就等內核發回通知發送的結果就行。整個下來把一個請求分成了很多個階段,每個階段都到很多模塊去注冊,然后處理,都是異步非阻塞。異步這里指的就是做一個事情,不需要等返回結果,做好了會自動通知你。