### 進程越多越好?
前面提到多進程的并行可以提高并發度,那么進程是越多越好?一般遇到這種問題都回答不是,事實上,很多大型項目都不會同時開太多進程。
下面以支持100K并發量的Nginx服務器為例。
### 舉個例子: Nginx
Nginx是一個高性能、高并發的Web服務器,也就是說它可以同時處理超過10萬個HTTP請求,而它建議的啟動的進程數不要超過CPU個數,為什么呢?
我們首先要知道Nginx是Master-worker模型,Master進程只負責管理Worker進程,而Worker進程是負責處理真實的請求。每個Worker進程能夠處理的請求數跟內存有關,因為在Linux上Nginx使用了epoll這種多路復用的IO接口,所以不需要多線程做并行也能實現并發。
而多進程有一個壞處就是帶來了CPU上下文切換時間,所以一味提高進程個數反而使系統系能下降。當然如果當前進程小于CPU個數,就沒有充分利用多核的資源,所以Nginx建議Worker數應該等于CPU個數。
### 特殊情況
我們想想進程數應該等于CPU數,但是如果進程有阻塞呢?這是是應該提高進程數增加并行數的。
在Nginx的例子中,如果Nginx主要負責靜態內容的下載,而服務器內存比較小,大部分文件訪問都需要讀磁盤,這時候進程很容易阻塞,所以建議提高下Worker數目。
### 綁定CPU
一般情況下除了確保進程數等于CPU數,我們還可以綁定進程與CPU,這就保證了最少的CPU上下文切換。
在Nginx中可以這樣配置。
~~~
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
~~~
這是通過系統調用sched_setaffinity()實現了,感興趣大家可以自行學習這方面的知識。
通過這個例子大家對進程的并發與并行應該有更深入的理解,接下來了解下進程狀態的概念。
- 前言
- 致謝
- 概述
- 使用代碼
- 使用Docker
- 進程基礎
- 進程是什么
- Hello World
- PID
- PPID
- 使用PID
- 進程名字
- 進程參數
- 輸入與輸出
- 并發與并行
- 進程越多越好
- 進程狀態
- 退出碼
- 進程資源
- 死鎖
- 活鎖
- POSIX
- Nohup
- 運行進程
- Go編程實例
- 衍生新進程
- 執行外部程序
- 復制進程
- 進程進階
- 文件鎖
- 孤兒進程
- 僵尸進程
- 守護進程
- 進程間通信
- 信號
- Linux系統調用
- 文件描述符
- Epoll
- 共享內存
- Copy On Write
- Cgroups
- Namespaces
- 項目實例Run
- 項目架構
- 代碼實現
- 注意事項
- 創建目錄權限
- 捕獲SIGKILL
- Sendfile系統調用
- 后記
- 參考書籍
- 項目學習
- 再次感謝