我们有一个基于 Ubuntu 16.04 的 Web 服务器,主内存 128GB,32 个 vCPU。它运行 nginx、php-fpm、postgresql、mysql 和 beanstalkd 应用程序。
当 Web 服务器的吞吐量很高时,它会从不同的应用程序发出一些连接错误。在正常情况下,一切都正常。
PostgreSQL的:
[PDOException]
SQLSTATE[08006] [7] could not connect to server: Connection timed out
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?
Mysql:
[PDOException]
SQLSTATE[HY000] [2002] Connection timed out
Beanstalkd:
fwrite(): send of 8192 bytes failed with errno=32 Broken pipe
服务器的哪些设置(可能是 sysctl.conf)会影响这些限制?如何增加这些限制以避免错误?
答案1
嗨,如果您有大量连接到此服务器的连接,您可能需要开始监视主机服务器的连接数。如果超出 Linux 内核内置的连接数限制,您可能会在高峰时段看到连接失败。在内核日志中,您可能会看到以下行
nf_conntrack: table full, dropping packet
查看连接数限制:
sysctl net.ipv4.netfilter.ip_conntrack_max
查看当前连接数
wc -l /proc/net/ip_conntrack
如果您发现当前连接数已达到限制,则问题就解决了。您可以尝试通过以下命令增加限制,但内核通常会根据其运行的硬件选择一个数字,如果限制超过硬件可以处理的范围,则在分配新连接时也会导致已建立的连接中断。
增加此限制(重启后不保留)
sysctl -w net.ipv4.netfilter.ip_conntrack_max=12000
或者,将以下行添加到 /etc/sysctl.conf 文件以在重启后保留此设置:
net.ipv4.netfilter.ip_conntrack_max=12000
我推荐使用http://conntrack-tools.netfilter.org/
sudo apt-get install conntrack
该工具将让你查看连接列表(-L)、计数器(-C)和包括丢弃的数据包在内的统计数据(-S)
有用链接: https://www.cyberciti.biz/faq/ip_conntrack-table-ful-dropping-packet-error/