診斷緩慢/超時的 Web 應用程序
我看到了
load average: 12.41, 11.94, 11.59
在基於 linux 的機器上服務 Web 應用程序的平均載入時間。它有 16 個核心,因此平均負載不會高到無法控制。但是,當我嘗試連接到它時,這個 Web 應用程序經常超時。這可能是什麼原因造成的?這有點曲折。
所有 CPU 的 CPU 使用率都徘徊在 ~50% 左右(根據
top
)。的值wa
介於0.0
和之間3.0
。根本沒有使用交換記憶體,並且有大量可用記憶體。
iostat
顯示%iowait
值為0.51
。其他統計數據如下:Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 4.88 1.02 2136.25 12365497 25895371840 sdb 0.00 0.00 0.00 9456 0 sdc 0.95 0.00 452.44 4781 5484405440
寫入/秒很高 - 這是一個寫入/繁重的應用程序。
iotop
顯示來自pgbouncer
程序(postgresql 連接池)、非同步任務隊列和 nginx 工作程序(可能寫入訪問日誌)的寫入。我在IO>
列中看不到任何高於 6% 的內容 - 大多數行都有 0.00%。SWAPIN
貫穿始終0.00%
。簡而言之,CPU 使用率並沒有達到頂峰,記憶體使用率不是問題,並且沒有跡象表明與 I/O 相關的過度等待正在發生。為什麼當我嘗試訪問 Web 應用程序時會無限載入/超時?可能是我的網路伺服器中的問題
sysctl.conf
或與我的網路伺服器有關的問題嗎?這裡需要專家意見。有問題的伺服器是 Ubuntu 14.04 LTS。Nginx 是網路伺服器,用作 Gunicorn(基於 Django 的網路應用程序)的反向代理。後端是 Postgresql 9.3,Redis 也在發揮作用。數據庫駐留在單獨的 VM 中。
如果您正在處理大量 TCP 連接並且正在通過像 nginx 這樣的反向代理,您可能會遇到TCP Port Exhaustion。總之,理論上有65535個TCP埠。如果您有一個來自 IP 192.168.1.1 的反向代理在 192.168.1.2:80 的埠 80 上連接到您的 Web 伺服器,因此您可以通過 65535 的反向代理與您的 Web 上的埠 80 建立理論上的最大同時連接數伺服器。之後,您用完了要使用的源埠(稱為臨時埠)。
但它比這更複雜一點:Linux 預設情況下被調整為僅使用大約 30000 個(對於較舊的核心/發行版 - 低至 1024 個)這些埠,即使這樣,它也會使用一種算法來隨機嘗試找到一個免費源埠供使用。越接近 30000 標記,核心嘗試隨機選擇空閒埠的次數就越多,找到空閒埠所需的時間就越長。嘗試使用netstat、grep 和 wc來計算您擁有的連接數,如果您接近 30,000,這可能是您超時的原因。如果是這種情況,您可以查看 NGINX 解決此問題的建議。