前面提到多進程的并行可以提高并發(fā)度,那么進程是越多越好?一般遇到這種問題都回答不是,事實上,很多大型項目都不會同時開太多進程。
下面以支持100K并發(fā)量的Nginx服務器為例。
Nginx是一個高性能、高并發(fā)的Web服務器,也就是說它可以同時處理超過10萬個HTTP請求,而它建議的啟動的進程數不要超過CPU個數,為什么呢?
我們首先要知道Nginx是Master-worker模型,Master進程只負責管理Worker進程,而Worker進程是負責處理真實的請求。每個Worker進程能夠處理的請求數跟內存有關,因為在Linux上Nginx使用了epoll這種多路復用的IO接口,所以不需要多線程做并行也能實現并發(fā)。
而多進程有一個壞處就是帶來了CPU上下文切換時間,所以一味提高進程個數反而使系統(tǒng)性能下降。當然如果當前進程小于CPU個數,就沒有充分利用多核的資源,所以Nginx建議Worker數應該等于CPU個數。
我們想想進程數應該等于CPU數,但是如果進程有阻塞呢?這時是應該提高進程數增加并行數的。
在Nginx的例子中,如果Nginx主要負責靜態(tài)內容的下載,而服務器內存比較小,大部分文件訪問都需要讀磁盤,這時候進程很容易阻塞,所以建議提高下Worker數目。
一般情況下除了確保進程數等于CPU數,我們還可以綁定進程與CPU,這就保證了最少的CPU上下文切換。
在Nginx中可以這樣配置。
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
這是通過系統(tǒng)調用sched_setaffinity()實現了,感興趣大家可以自行學習這方面的知識。
通過這個例子大家對進程的并發(fā)與并行應該有更深入的理解,接下來了解下進程狀態(tài)的概念。