Linux

診斷緩慢/超時的 Web 應用程序

  • September 23, 2017

我看到了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 解決此問題的建議。

引用自:https://serverfault.com/questions/875070