百萬併發下 Nginx 的優化之道!
實現百萬併發不僅靠 Nginx 本身性能,還要操作系統、網絡、配置的全面協同 @mikechen
連接配置優化
理論最大併發連接數 = worker_processes × worker_connections
。
worker_connections 65535;
每個 worker 進程可以獨立處理多個連接,增加 worker 進程數可以提高並行處理能力。
除此之外,增加單個 worker 進程可以打開的最大文件描述符數,以支持更多的併發連接。
worker_rlimit_nofile 65535;
每個連接都需要一個文件描述符,增加限制可以支持更多連接。
連接處理優化
epoll
是 Linux 下性能最好的事件處理機制,適合高併發。
events {
use epoll;
multi_accept on;
}
在 events
塊中,使用 use epoll;
等高效的事件驅動模塊,Nginx 通常會自動選擇最佳的可用模塊。
select
通常有文件描述符數量的硬性限制(通常是 1024),poll
雖然沒有這個限制。
但在實現上仍然可能受限,這使得它們難以處理大規模併發連接,epoll
的出現徹底改變了 Linux 下高併發網絡編程的方式。
epoll
不是每次都輪詢所有的文件描述符,而是採用事件通知的方式。
當某個文件描述符上的事件(如可讀、可寫)發生時,內核纔會主動通知應用程序。這避免了無謂的遍歷和檢查,效率大大提高。
緩存與壓縮優化
啓用 Gzip 壓縮(減少帶寬佔用),如下所示:
gzip on;
gzip_min_length 1k;
gzip_types text/plain text/css application/json;
gzip_comp_level 5;
Gzip 減小響應體大小,提高傳輸效率。
gzip_min_length 控制多小的文件值得壓縮(避免浪費 CPU)。
文件傳輸優化
使用內核零拷貝機制直接將文件內容從磁盤發送到網絡套接字,減少數據在用戶空間和內核空間之間的拷貝次數,提高文件傳輸效率。
sendfile on;
使用內核零拷貝機制,直接將文件內容從磁盤發送到網絡套接字。
減少數據在用戶空間、和內核空間之間的拷貝次數,提高文件傳輸效率。
總之,避免用戶態↔內核態拷貝,加快靜態文件傳輸速度。
通過以上這些優化策略的組合應用,可以顯著提升 Nginx 在高併發場景下的性能。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/rwB_X4Pt1JN-fvDvmHhptA