一台线上的虚拟机,ping localhost 时出现了sendmsg: Invalid argument
的错误,偶尔会正常,同时ping 同网段的机器都有问题,但ping 跨网段的机器没有问题。但使用的ping 命令并没有附加什么参数。
查看strace 的结果,发现是在sendto 的系统调用中返回的EINVAL 错误,检查man 2 sendto
,也只是说Invalid argument passed
,但对比正常机器,strace 中输出的函数调用传参并无问题。
尝试了加路由,ifdown/ifup 等操作后,都没什么进展,之后做了些搜索,有人遇到过相同的问题,但没有回答。
考虑到ping 同网段也有相同问题,可能不是lo 网卡故障,是否跨网段涉及到arp 问题,马上用ip neigh 命令进行检查,发现只有网关的一条arp cache. 马上尝试手动添加arp cache,却出现了buffer 不足无法添加的报错,问题呼之欲出。
考虑到这台机器用作运行docker,通过ip netns list 查看到有多个network 的namespace(有名字的),通过ip netns exec <name> ip neigh 发现q已经有较多的arp cache,而这个docker 正好是用桥的方式使用网络,且是一个/22 的网段,多个netns 中大量的arp cache 占满了buffer,导致ping 同网段时没办法缓存新的ip-mac 映射。之后修改了net.ipv4.neigh.default.gc_thresh3 问题得到解决。
不过通过ip neigh 来看ping lo 没有产生127.0.0.1 的arp cache,似乎不需要,但是ping 也失败了,不知道为啥=。=