天天看點

nginx新版本Nginx1.20.2性能調優之buffer參數優化

我們經常會碰到nginx 

2022/04/01 13:20:58 [warn] 56080#0: *729482 an upstream response is buffered to a temporary file /usr/local/server/nginx/tmp/fastcgi/5/71/0000029715 while reading upstream, client: 223.104.41.76, server: new.wdmcake.cn, request: "POST /api/category HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "new.wdmcake.cn", referrer: "https://servicewechat.com/wxf511174b6ab138e3/60/page-frame.html"

2022/04/01 13:21:21 [warn] 56080#0: *729713 an upstream response is buffered to a temporary file /usr/local/server/nginx/tmp/fastcgi/6/71/0000029716 while reading upstream, client: 223.104.39.1, server: new.wdmcake.cn, request: "POST /api/category HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "new.wdmcake.cn", referrer: "https://servicewechat.com/wxf511174b6ab138e3/60/page-frame.html"

2022/04/01 13:21:52 [warn] 56080#0: *729910 an upstream response is buffered to a temporary file /usr/local/server/nginx/tmp/fastcgi/7/71/0000029717 while reading upstream, client: 123.117.126.67, server: new.wdmcake.cn, request: "POST /api/category HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "new.wdmcake.cn", referrer: "https://servicewechat.com/wxf511174b6ab138e3/60/page-frame.html"

類似這樣的錯誤:

an upstream response is buffered to a temporary file  while reading upstream

出現這樣的錯誤提示就是nginx的記憶體的buffer不夠用了,需要進一步的優化,我們先來了解一下nginx的buffer機制

nginx新版本Nginx1.20.2性能調優之buffer參數優化

對于來自 FastCGI Server 的 Response,Nginx 将其緩沖到記憶體中,然後依次發送到用戶端浏覽器。緩沖區的大小由 fastcgi_buffers 和 fastcgi_buffer_size 兩個值控制

fastcgi_buffers 控制 nginx 最多建立 8 個大小為 4K 的緩沖區,而 fastcgi_buffer_size 則是處理 Response 時第一個緩沖區的大小,不包含在前者中。是以總計能建立的最大記憶體緩沖區大小是 8*4K+4K = 36k。而這些緩沖區是根據實際的 Response 大小動态生成的,并不是一次性建立的。比如一個 8K 的頁面,Nginx 會建立 2*4K 共 2 個 buffers。

當 Response 小于等于 36k 時,所有資料當然全部在記憶體中處理。如果 Response 大于 36k 呢?fastcgi_temp 的作用就在于此。多出來的資料會被臨時寫入到檔案中,放在這個目錄下面。

Buffer Size 優化

buffer的大小是你需要調優最重要參數。如果buffer size太小就會到導緻nginx使用臨時檔案存儲response,這會引起磁盤讀寫IO,流量越大問題越明顯。

client_body_buffer_size 處理用戶端請求體buffer大小。用來處理POST送出資料,上傳檔案等。client_body_buffer_size 需要足夠大以容納如果需要上傳POST資料。

fastcgi_buffers,proxy_buffers 處理後端響應。如果這個buffer不夠大,同樣會引起磁盤都系IO。需要注意的是它們有一個上限值,這個上限值受 fastcgi_max_temp_file_size 、 proxy_max_temp_file_size控制。

FastCGI緩沖設定主要參數

fastcgi_buffers 4 64k

這個參數指定了從FastCGI程序到來的應答,本地将用多少和多大的緩沖區讀取,假設一個PHP或JAVA腳本所産生頁面大小為256kb,那麼會為其配置設定4個64kb的緩沖來緩存;若頁面大于256kb,那麼大于256kb的部分會緩存到fastcgi_temp指定路徑中,這并非是個好辦法,記憶體資料處理快于硬碟,一般該值應該為站點中PHP或JAVA腳本所産生頁面大小中間值,如果站點大部分腳本所産生的頁面大小為256kb,那麼可把值設定為16 16k,4 64k等。

fastcgi_buffer_size=64k

讀取fastcgi應答第一部分需要多大緩沖區,該值表示使用1個64kb的緩沖區讀取應答第一部分(應答頭),可以設定為fastcgi_buffers選項緩沖區大小。

fastcgi_connect_timeout=300

連接配接到後端fastcgi逾時時間,機關秒,下同。

fastcgi_send_timeout=300

向fastcgi請求逾時時間(這個指定值已經完成兩次握手後向fastcgi傳送請求的逾時時間)

fastcgi_reAd_timeout=300

接收fastcgi應答逾時時間,同理也是2次握手後

了解了nginx buffer機制後根據自已的服務的響應的包大小高整buffer參數

我的服務調整成:

fastcgi_buffers      8 4K;
fastcgi_buffer_size  4K;
           

後,上面的錯誤資訊就很少了

繼續閱讀