libcurl在ipv6被禁止的情况下的性能下降

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: <p style="border:0px; font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:15px; margin-top:0px; margin-bottom:1.625em; outline:0px; padding-top:0px; padding-bottom:0px; vertical-ali

最近我们的集群业务量增加了3T/天。然后发现集群的cpu使用率和load上升的非常高,load最高达到了60。团队分析了性能原因,发现发送结果数据到另一个集群的逻辑消耗了大部分的cpu,于是对这部分发送逻辑进行了优化。

在优化发送逻辑后,cpu下降了一半,load也下降了。但是效果并不明显。有一个机器,load仍然很高。持续的调查发现,在load较高的机器上出现间隔出现多个modprob -q — net-pf-10进程(其中net-pf-10为ipv6模块的别名),行为上似乎在不断的重新加载ipv6模块,但是由于32内核机器modprobe.d中配置了disable_ipv6,因此该模块是被禁止,所以每次加载都无法成功。

对于modprob应该是网络链接访问过程中尝试解析ip地址,涉及网络通信的只有调用libcurl访问存储集群。而且大量modprobe进程的出现与写存储的qps的变化大致吻合。由此怀疑libcurl初始化时会尝试用IPv4和IPv6两种协议对地址解析并在IPv6模块未加载的情况下初始化时会增加额外的延时(大概5-8ms),modprobe命令或许是由于libcurl触发产生。

对比libcurl解析ip地址的代码,调用ioctl(dummy, SIOCGIFADDR, &req)函数对地址进行解析,该函数在判断ipv6模块已经安装的情况下加载相关模块,会触发内核在workqueue中加入modprobe任务尝试加载相关模块,因此在每次curl的调用都会导致modprobe调用产生。这种情形发生在安装了ipv6,但是ipv6被禁止的机器上。而在未安装ipv6的机器,并不存在这个问题。

最终的结论是,libcurl存在一个bug,如果机器安装了ipv6,而且禁止了ipv6,那么libcurl每次调用都会尝试加载ipv6。而这个加载的过程延时非常高,以至于引发了性能问题。

目录
相关文章
|
5月前
|
缓存 负载均衡 网络协议
Linux的TCP连接数量与百万千万并发应对策略
【8月更文挑战第15天】在Linux系统中,关于TCP连接数量的一个常见误解是认为其最大不能超过65535个。这一数字实际上是TCP端口号的上限,而非TCP连接数的直接限制。实际上,Linux服务器能够处理的TCP连接数远远超过这一数字,关键在于理解TCP连接的标识方式、系统配置优化以及应用架构设计。
629 2
|
5月前
|
网络协议 安全 网络安全
|
5月前
|
网络协议 测试技术 Linux
在Linux中,如何进行网络性能的峰值测试?
在Linux中,如何进行网络性能的峰值测试?
|
消息中间件 网络协议 JavaScript
Linux的TCP连接数量最大不能超过65535?那服务器是如何应对百万千万的并发的?
Linux的TCP连接数量最大不能超过65535?那服务器是如何应对百万千万的并发的?
Linux的TCP连接数量最大不能超过65535?那服务器是如何应对百万千万的并发的?
|
网络协议 NoSQL Linux
性能提升 57% ,SMC-R 透明加速 TCP 实战解析
TCP 协议作为当前使用最为广泛的网络协议,场景遍布移动通信、数据中心等。对于数据中心场景,通过弹性 RDMA 实现高性能网络协议 SMC-R,透明替换应用 TCP 协议,实现应用网络透明加速。
306 0
性能提升 57% ,SMC-R 透明加速 TCP 实战解析
|
网络协议 应用服务中间件 Linux
|
算法 网络协议 Linux
Debian升级内核开启TCP_BBR 实现网络单边加速
自从锐速发布以来,这款牛逼的单边加速神器的确为一些线路不太优秀的服务器带来了更优秀的体验。但是呢,过高的价格和不再低端售卖。导致了我们并无法实现一个免费好用的单边加速功能。 但是谷歌为我们带来了干货 新的 TCP 拥塞控制算法 BBR (Bottleneck Bandwidth and RTT)。
2947 0