- List item
TCP计数器ListenOverflows大量增加
查看方法
cat /proc/net/netstat | awk ‘/TcpExt/ { print $21,$22 }’
原因
系统调用listen函数(int listen(int sockfd, int backlog);)的队列长度由min(backlog ,内核参数 net.core.somaxconn ) 决定,对应socket的listen 队列已满的情况下,在新增一个连接时的情况,ListenOverflows计数器加 1 。
解决方案
调整系统参数 net.core.somaxconn = 65535 #默认为128
cat 65535 > /proc/sys/net/core/somaxconn
HAProxy 耗尽cpu问题
现象
HAProxy绑定4核cpu、8核cpu、16核cpu,压测的时候,都会出现CPU 100%被使用的情况。
追查过程
-
通过 mpstat -P ALL 1 命令查看cpu 都用在哪里,可以看到cpu都绝大部分用在 sys态上。
-
通过 strace -p pid -c 查看HAProxy 进程那个系统调用占用cpu 最多,看到cpu 都用在了 connect系统调用上。
-
HAProxy连接后端会使用connect系统调用,查看HAProxy配置,发现HAProxy连接后端就只有两个后端,即这种情况: vegeta(40台压测机器)-》HAProxy-》httptest(2台HAProxy后端),其中 HAProxy连接后端最多只能有63000个端口左右,大量的连接积压在HAProxy机器上,导致cpu被耗尽了。
解决方案
大量增加HAProxy的后端,解决HAProxy后端过少的瓶颈。
网卡 drop 数据包
现象
压测的时候,ifconfig发现网卡eth0 RX 出现 droppped。
解决方案
- 调大网卡Ring buffer
查看:ethtool -g eth0
设置Ring buffer到上限:ethtool -G eth0 rx 4096;ethtool -G eth0 tx 4096
- 调网卡队缓存队列
net.core.netdev_max_backlog = 2000000 #默认为1000,内核参数配置时,有具体的解释
最新稳定版HAProxy性能
系统自带版本 1.5.18
编译HAProxy 最新稳定版本(1.7.5 )