一台老服务器上的 send(, , ,MSG_MORE) bug

上次研究完 HAProxy,觉得这东西搭配 Postfix 挺好,就安排给运维了,结果运维同学反馈,加持了 HAProxy 以后,返回 220 欢迎信息时间显著变长,于是昨天就抽时间和运维一起分析这个事儿

我的第一反应是 Postfix 处理 Proxy Protocol 有延时,比如反向DNS查询什么的,于是首先在 Postfix 服务器上执行 tcpdump

观察到,当客户端连接 HAProxy 之后,立即 HAProxy 就和 Postfix 完成了3WHS,然后足足等了 3 秒,才从 HAProxy 发来了 "PROXY X.X.X.X XXXX"

现在可确认延时发生在 HAProxy 上,接着去 HAProxy 机器上 strace -tt HAProxy进程

观察到,当完成和后台 Postfix 的 3WHS 之后,的确就立即把 "PROXY X.X.X.X ... "发送了,但是等了3秒,才recvfrom后面的 220

问题出在哪里呢??仔细看传送"PROXY X.X.X.X ..."的系统调用,原来是用的 send() syscall,而且,它使用了 MSG_MORE 这个参数... (不明白什么是 TCP_CORK 的同学可自行搜索,HAProxy 在这里使用 MSG_MORE 是很有道理的)

但为什么这个延时长达3秒实在理解不能,在我自己的机器上试了一下,是200ms,查看 sysctl 里面的 tcp 设置也没有头绪,对于这种古老的RHEL4服务器只能出大招了:因为这个HAProxy是为SMTP代理专用的,直接修改HAProxy源码,把MSG_MORE注释变成0就一切正常了

Topic: 技术