優化方法論
(1)從軟件層面提升硬件使用效率
①增大CPU的利用率
②增大內存的利用率
③增大磁盤IO的利用率
④增大網絡帶寬的利用率
(2)提升硬件規格
①網卡:萬兆網卡,例如10G,25G,40G等
②磁盤:固態硬盤,關注IOPS和BPS指標
③CPU:更快的主頻,更多的核心,更大的緩存,更優的架構
④內存:更快的訪問速度
(3)超出硬件性能上限後使用DNS
如何增大nginx使用CPU的有效時長?
(1)能夠使用全部CPU資源
①master-worker多進程架構
②worker進程數量應當大於等於CPU核數(master進程只是負責管理,worker進程爲實際工作進程)
(2)Nginx進程間不做無用功浪費CPU資源
①worker進程不應在繁忙時,主動讓出CPU(多個worker進程間不應由於爭搶造成資源耗散。worker進程應當等於CPU核數)
②worker進程不應調用一些API導致主動讓出CPU,拒絕類似的第三方模塊
(3)不被其他進程爭搶資源
①提升優先級佔用CPU更長時間
②減少操作系統上耗資源的非Nginx進程
1.worker_processes 指令
語法:worker_processes number | auto(選用auto時,自動選擇跟CPU核數相同)
默認:worker_processes 1;
放置位置:main
爲何一個CPU就可以同時運行多個進程?
在宏觀上並行,微觀上串行
把進程的運行時間分爲一段段的時間片,OS調度系統依次選擇每個進程,最多執行時間片指定的時長
阻塞API引發的時間片內主動讓出CPU
(1)速度不一致引發的阻塞API(硬件執行速度不一致,例如CPU和磁盤)
(2)業務場景產生的阻塞API(例如同步讀網絡報文)
減少進程間的切換(是指CPU從一個進程或線程切換到另一個進程或線程。花費5us)
(1)使nginx worker進程儘可能處於運行狀態
(2)儘可能減少進程間切換(Linux命令: vstat,dstat, pidstat -w -p 進程號 1)
(3)綁定CPU
什麼決定CPU時間片的大小?
(1)Nice靜態優先級:-20 —— 19 (越小優先級越高,一般把nginx調到-20)
1.worker_priority指令(設置worker進程的靜態優先級)
語法:worker_priority number;
默認:worker_priority 0;
放置位置:main
(2)Priority動態優先級:0——139
提升CPU緩存命中率:worker_cpu_affinity
1.worker_cpu_affinity指令(綁定worker到指定CPU)
語法:worker_cpu_affinity cpumask.......; worker_cpu_affinity auto(自動一個worker綁定一顆CPU)
默認:空
放置位置:main