1.问题描述
我们将软件的底层RHEL版本从6.7升级到7.5后,在千万用户级别的业务量上发送UDP packet的行为,但偶尔出现几次发送失败的问题:gen_udp:send/4函数返回{error,einval},einval(POSIX error codes)即是“invalid argument”,这个error code其实还是蛮奇怪的。
2.分析
发送失败是很低概率的事件,并且在相同的IP、Port上其余时间都是可以发送正常的,这种偶发性的事件会与网络环境有关系吗,还是因为系统版本升级时配置上的改变所致?
最开始我们去查看网络环境是否有问题,例如机柜之间的连接不稳定或参数配置等问题,可是发现发送方和接收方在同一台服务器内部(simulator和driver的部署),所以可能在这里出问题的可能性很低。
我们向OTP support team寻求帮助,通过对四个参数的debug结果(判断其有效性),对方认为并不是OTP的问题,所有的擦拭农户都是正确的。考虑到RHEL版本升级,他们怀疑是kernel层sendto函数返回的这个错误,建议我们RHEL support寻求帮助。
RHEL support希望我们能够提供最直接的证据来证明确实是kernel层抛出来这个错误。他们帮助我们使用strace命令成功捕获到系统调用(得益于shell脚本的强大助力。最开始并不顺利,因为当我们没有指定特定的几个系统调用时,即捕获所有的,这会对系统产生很大的负载压力,后来我们指定几个相关的,例如socket,getsockopt,setsockopt,socketcall,sendto,poll,sendmsg),sendmsg的确返回了einval的错误。