高流量下的 nginx:日誌寫入磁碟時網路中斷?
具有 2 個 vCPU、Ubuntu 20.04 和 nginx 的 VPS。
日誌沒有任何變化:在 nginx、rsyslogd 或 journald 上都沒有。
我從附近的 VPS 啟動 ab (apache-benchmark),如下所示:
ab -k -c 300 -n 3000000 'https://example.com'
然後,在提供者圖表中,我可以看到當磁碟寫入增加時****網路如何下降(吞吐量和每秒數據包)。這每隔30 秒發生一次。
磁碟寫入吞吐量增加,但磁碟 iops 保持較低,在所有基準測試期間為 1 或 2 IOPS,系統中沒有其他內容,但我的 SSH 在內部介面中,帶有 nginx 日誌的 tail -f。
所以我懷疑這可能是 nginx 將日誌寫入磁碟的方式,或者可能是預設的 sysctl,以及核心將更改同步到磁碟的方式(?)
我在 30 秒時沒有看到太多 sysctl 設置:
# sysctl -a | grep '30$' kernel.acct = 4 2 30 net.core.xfrm_acq_expires = 30 net.ipv4.ipfrag_time = 30 net.ipv4.neigh.default.gc_interval = 30 net.ipv6.neigh.default.gc_interval = 30 net.ipv6.route.gc_interval = 30 vm.max_map_count = 65530
但是在 3000 厘秒處有這個:
# sysctl -a | grep '3000$' vm.dirty_expire_centisecs = 3000
會是那個嗎?
dirty_expire_centisecs 此可調參數用於定義臟數據何時足夠老,可以被核心刷新執行緒寫出。它以百分之一秒錶示。記憶體中臟的時間超過此時間間隔的數據將在下次刷新執行緒喚醒時被寫出。
我擔心的是流量每 30 秒從 7K pps 變為零,並在磁碟寫入完成後返回。
可以做些什麼來避免這種行為?
這是圖表的圖像,顯示了所描述的問題:VPS 性能圖表
編輯: sysctl 發現
更新
它與 nginx 日誌無關。
根據@berndbausch 的指示,確實查看了客戶端,並且有相同的網路下降圖。
重複板凳:
access_log /var/log/nginx/access.log combined buffer=64K flush=5s;
和:
sysctl -w vm.dirty_expire_centisecs=500
磁碟 IOP 從 1 增加到 +/- 10,磁碟吞吐量圖每 5 秒出現一次峰值,但網路圖在伺服器和客戶端中仍然以 30 秒的間隔執行相同的“下降到 0”。
更有趣的是,通過以下方式重複基準:
access_log off;
磁碟圖保持為 0,但網路圖保持不變。
在這張圖片中,可以看到兩個基準測試,每 5 秒刷新一次,右側沒有訪問日誌:
更新 2
在埠 443 上執行 iperf 雙重測試…伺服器圖形在 1 Gbps 時很簡單,但是 iperf 客戶端具有相同的行為,網路輸出圖形每 30 秒下降到 0。
將嘗試使用不同的客戶端,或者稍微調整客戶端作業系統、限制和 sysctl,讓我們看看。
更新 3
這看起來像是控制面板中的一個監控錯誤。
確實重複了其他 VPS 作為客戶端和專用伺服器(裸機)的基準測試,總是相同的圖表……
但是,如果我在測試期間在雙方都啟動 bmon ……它看起來很簡單:
接收方與發送方相同。兩個 VPS 之間的 10 Gbps 和從專用伺服器到 VPS 的 1 Gbps。始終以 1 秒解析度顯示。
所以……謎團解決了。
看起來我的評論/問題是答案:
(1) 如何測量網路輸入/輸出?
(2) 我沒有看到磁碟 IO 和網路輸出之間存在如此大的相關性,並且
(3) 與 CPU 使用率沒有相關性。然而,(4)網路輸入和網路輸出相關。
如果在 NIC 處測量網路輸入/輸出(即使在其他地方測量),我想知道問題是否在
ab
側面。即執行的 VPSab
每 30 秒就會出現呼吸問題。