Apache-2.4

TCP 記憶體不足

  • September 3, 2019

我正在使用 Debian 執行一個 gcloud g1-small 實例來為一台 Node 伺服器和一台 Apache 伺服器供電。我使用 Node Bouncy 將 http 請求重定向到 Node 或 Apache,具體取決於req.headers.host. 我的兩個網站中的每一個都是低流量的,每天訪問量低於 10k。

在中斷執行大約兩週後,我的 Apache 和 Node 網站都停止了響應。我也無法通過 SSH 連接到實例。重新啟動並檢查日誌後,我發現以下內容:

/var/log/kern.log:
kernel: [timestamp] TCP: out of memory -- consider tuning tcp_mem
(multiple times)

/var/log/apache2/error.log:
[Timestamp] [core:warn] [pid 573] (105)No buffer space available: AH00056: connect to listener on 0.0.0.0:8001
(multiple times)

我的節點日誌文件中沒有任何內容。

如何防止此錯誤再次發生?

我增加了一些 TCP 值,允許使用更多記憶體。我已將這些行添加到伺服器的啟動腳本中:

sysctl -w net.ipv4.tcp_mem='116730 155640 233460'
sysctl -w net.ipv4.tcp_max_orphans='24576'

雖然這不應該永遠解決問題,但它應該在伺服器崩潰之前為我爭取更多的正常執行時間。我每月重新啟動一次伺服器,到目前為止沒有任何問題。

但是,真正的解決方案是首先修復導致此問題的記憶體洩漏。

最近我們遇到了一個有趣的生產問題。此應用程序在 Elastic Load Balancer 後面的多個 AWS EC2 實例上執行。該應用程序在 GNU/Linux OS、Java 8、Tomcat 8 應用伺服器上執行。突然之間,其中一個應用程序實例變得無響應。所有其他應用程序實例都在正確處理流量。每當 HTTP 請求從瀏覽器發送到此應用程序實例時,我們都會在瀏覽器上列印以下響應。

代理錯誤

代理伺服器收到來自上游伺服器的無效響應。代理伺服器無法處理請求 GET /。

原因:從遠端伺服器讀取錯誤

讓我們看看如何通過在伺服器中為這些屬性分配值來解決這個問題:

net.core.netdev_max_backlog=30000 net.core.rmem_max=134217728 net.core.wmem_max=134217728 net.ipv4.tcp_max_syn_backlog=8192 net.ipv4.tcp_rmem=4096 87380 67108864 net.ipv4.tcp_wmem=409886873

TCP:記憶體不足 — 考慮調整 tcp_mem

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