百萬併發下 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