UDP包发送失败(einval)与kernel gc_thresh参数

在将RHEL版本从6.7升级到7.5后,遇到UDP包发送失败(einval)的问题。经过分析,可能是由于kernel层sendto函数返回的错误。通过strace捕获到sendmsg返回einval,解决方案是增大gc_thresh参数。同时,这个问题与RHEL7.5后CPU平均负载过高问题有关,增大gc_thresh参数解决了这两个问题。可能是由于gc_thresh值过小导致ARP缓存垃圾回收过于频繁,引发资源竞争和CPU负载增加。
摘要由CSDN通过智能技术生成

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的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值