閱讀624 返回首頁    go 汽車大全


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

最近我們的集群業務量增加了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。而這個加載的過程延時非常高,以至於引發了性能問題。

最後更新:2017-04-03 16:48:54

  上一篇:go 曬一下招聘騙子的一些手段
  下一篇:go Spark簡介及其在ubuntu下的安裝使用