korechi’s diary

とあるVR/ARエンジニアのブログ

Mellanox NICで"ethtool --set-priv-flags"ができないのはドライバに原因があった

Mellanox connectx-3 pro を使ってパケットのやりとりをしているんですが、なぜかCPU割り込みが特定のCPUに偏る問題に直面しました
こんな感じ
f:id:korechi:20160906204110j:plain
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に分散されています f:id:korechi:20160906205648p:plain なんで16このCPUに分散されないのかと言うのは多分この論文のfigure3にあるようにあるように、NICにつながっているCPUが特定のCPUだけで1つのNICからじゃ届かないCPUがあるのが原因じゃないかな?たぶん
ここについては要調査が必要かも。けれど、とりあえずここまで分散されればオッケーなので今回はここまでにしておきます


結論:linuxカーネルソースコードの中にあるドライバを過信するのはよくないですね。ちゃんと公式のものをダウンロードして使おう

その他学んだもの

大量にpingをうつオプション

# ping -f 

これ地味に便利。こんなオプションがあったなんて知らなかった
ただ、rootでしか使えないのは注意