Closed cospotato closed 2 months ago
traefik:v3.0.4
traefik-safeline-plugin:v1.3.0
safeline-detector
snserver 5.0.9-r2-0d62db6d
traefik : : write tcp 10.97.172.218:32976->10.0.1.130:8000: write: broken pipe
traefik 部署在 k8s 集群中,运行几分钟后就会出现上述报错,但是重启 traefik 后就会正常运行一段时间,又继续报错,一旦出现上述报错,雷池中就看不到任何的流量了。
traefik
ulimit 已经设置过了
root@6b9ba2ccc5ec:/# /detector/snserver -V snserver 5.0.9-r2-0d62db6d root@6b9ba2ccc5ec:/# ulimit -n 1073741816 root@6b9ba2ccc5ec:/# exit exit [root@safeline-demo safeline]# ulimit -n 65535 [root@safeline-demo safeline]#
进一步抓包显示 10s 发送了 28000+ 个 TCP 包,经过确认是 Heartbeat 的包
Heartbeat
初步定位到问题代码是 https://github.com/chaitin/traefik-safeline/blob/eb8434cd3199eee1930a5a96e93279e27ee81de0/vendor/github.com/xbingW/t1k/server.go#L69-L71
此处的问题是从 chan 里取出 connection ,发送 heartbeat,然后放回 chan,又因为 chan 是有 buffer 的,所以非阻塞,紧接着又能从 chan 里拿出来,基本上永远走不到 default 里。
可能的修复方向是,调整发起 Heartbeat() 的方式,例如由每个 conn 自行管理 Heartbeat(),如果出现错误,自行退出,Server 对象只需要定期或者接受 conn 退出时的事件检查 Pool 中的 conn 数量是否足够,不足的补足即可。
Heartbeat()
Server
预期应该如 plugin 中配置的一样,每 20s 只发出 100 个心跳包。
1.4.0 版本修复了
版本
traefik:v3.0.4
traefik-safeline-plugin:v1.3.0
safeline-detector
:snserver 5.0.9-r2-0d62db6d
报错
traefik : : write tcp 10.97.172.218:32976->10.0.1.130:8000: write: broken pipe
traefik
部署在 k8s 集群中,运行几分钟后就会出现上述报错,但是重启 traefik 后就会正常运行一段时间,又继续报错,一旦出现上述报错,雷池中就看不到任何的流量了。ulimit 已经设置过了
进一步抓包显示 10s 发送了 28000+ 个 TCP 包,经过确认是
Heartbeat
的包初步定位到问题代码是 https://github.com/chaitin/traefik-safeline/blob/eb8434cd3199eee1930a5a96e93279e27ee81de0/vendor/github.com/xbingW/t1k/server.go#L69-L71
此处的问题是从 chan 里取出 connection ,发送 heartbeat,然后放回 chan,又因为 chan 是有 buffer 的,所以非阻塞,紧接着又能从 chan 里拿出来,基本上永远走不到 default 里。
可能的修复方向是,调整发起
Heartbeat()
的方式,例如由每个 conn 自行管理Heartbeat()
,如果出现错误,自行退出,Server
对象只需要定期或者接受 conn 退出时的事件检查 Pool 中的 conn 数量是否足够,不足的补足即可。预期
预期应该如 plugin 中配置的一样,每 20s 只发出 100 个心跳包。