我正在使用 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)
我的 Node 日志文件中没有任何内容。
我怎样才能防止此错误再次发生?
答案1
我增加了一些 TCP 值,以便使用更多内存。我在服务器的启动脚本中添加了以下几行:
sysctl -w net.ipv4.tcp_mem='116730 155640 233460'
sysctl -w net.ipv4.tcp_max_orphans='24576'
虽然这不能彻底解决问题,但它应该能让我获得更多的正常运行时间,以免服务器崩溃。我每个月都会重启一次服务器,到目前为止没有出现任何问题。
然而,真正的解决方案是首先修复导致此问题的内存泄漏。
答案2
最近,我们遇到了一个有趣的生产问题。此应用程序在 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=4096 87380 67108864