前阵子 apache httpd 很不稳定,有时候监控突然报警 app 的响应慢了,然后去查监控指标发现有丢包的情况,从 ss -antlp 看就是 Recv-Q 比 Send-Q 大 1 ( Send-Q 是 128,sysctl.conf 配置的),正常情况 Recv-Q 是不应该出现非 0 的情况的( LISTEN 状态),当大于 1 了,就表示全连接队列满了,然后只能丢包了。今天特意观察了一段时间这个 httpd 进程还有他的连接,发现有点意思,过段时间这个 Recv-Q 就会变大(不超过 128 ),然后很快降下来了,等降下来了立马查看 httpd 进程,发现有 1 个僵尸进程,然后再等 1S 左右这个僵尸进程被杀掉了。感觉就是有连接积压了就代表某个 httpd 的 worker 进程可能 hang 住了,然美国服务器后 master 进程杀掉他,并启动一个新的进程,但是为什么变成僵尸进程杀不掉了,这个暂时没有查到,没有错误日志。我的问题就是:怎么能知道 Recv-Q 积压对应的是哪个连接?或者怎么能抓到导致 Recv-Q 积压的包?
下面是积压的截图、进程启动时间的截图
> 当大于 1 了,就表示全连接队列满了,然后只能丢包了
不一定。这个是 backlog 可能排队几 ms 又能处理了。
从监控上和 netstat -s 都可以看到丢包了
TcpExt.ListenOverflows 这个参数
就是 somaxconn 。系统默认最高 128 。如果你能处理的过来不一定丢包的。丢包就是直接 timeout 了。
但是已经在 ListenOverflows 计数了不是丢包了吗?
反正不管怎么样,我想看到 Recv-Q 对应的连接,不知道有啥方法
systemtap
https://github.com/cloudflare/cloudflare-blog/tree/master/2018-01-syn-floods
看过 cloudflare 的文章,但是忽略了这个脚本,太感谢了!!
都搞不懂你在查什么,图一你的 Recv-Q 43 是 falcon-agent 的,我查了下是小米监控?是你小米健康 master 繁忙?
图二都是 apache,ppid 也都是 root 起的 15483 没毛病啊,master 删进程都是正常现象啊,apache 也有 MaxConnectionsPerChild,每个进程最大处理请求数,过了就会 kill 掉它再起来一个新的没毛病啊
1 你看串了是 apache 的 2 进程几十秒一死正常吗? QPS 上千都费劲单台
哦 1 我看错了,那你只需要抓 apache 的 event 看看卡在哪
sysdig 'proc.name=httpd'