Mellanox NICで"ethtool --set-priv-flags"ができないのはドライバに原因があった
Mellanox connectx-3 pro を使ってパケットのやりとりをしているんですが、なぜかCPU割り込みが特定のCPUに偏る問題に直面しました
こんな感じ
CPU8とCPU11あたりに偏っているのが分かりますよね
そこでRSSのハッシュ関数が悪いのかと思い、ここの3.7.1にあるのRSS Hash Tuningにあることをやろうと
# ethtool --set-priv-flags p3p1 mlx4_rss_xor_hash_function on
とコマンドを打ったら
No private flags defined
と怒られました。なんだこれ?
そこでいろいろ調査していたらどうも僕の使っているmellanoxのデバイスドライバが悪いということが分かりました
自分はlinuxカーネルのソースコードをダウンロードし、その中のmlx4のドライバを再構築してできた*.ko
ファイルをinsmodして使っていました
実はそれがあまり良くなく、mellanoxの公式サイトから純正ドライバを使うべきだったみたい
そこで、mellanoxの公式サイトからドライバをダウンロードしてそれを使ってみたら
ethtool --set-priv-flags <interface> mlx4_rss_xor_hash_function on
が機能しました
pingでSourceIPやらDestIPを変えたらちゃんと複数のCPUに割り込みが分散しました!この通り8つのCPUに分散されています
なんで16このCPUに分散されないのかと言うのは多分この論文のfigure3にあるようにあるように、NICにつながっているCPUが特定のCPUだけで1つのNICからじゃ届かないCPUがあるのが原因じゃないかな?たぶん
ここについては要調査が必要かも。けれど、とりあえずここまで分散されればオッケーなので今回はここまでにしておきます
結論:linuxカーネルのソースコードの中にあるドライバを過信するのはよくないですね。ちゃんと公式のものをダウンロードして使おう
その他学んだもの
大量にpingをうつオプション
# ping -f
これ地味に便利。こんなオプションがあったなんて知らなかった
ただ、rootでしか使えないのは注意