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でしか使えないのは注意
1つのNICに複数のIPアドレスを割り当てる方法
ip addコマンドを使います
意外と簡単だった
設定例
# ip addr add 192.168.20.2 dev eth0
確認方法
$ ip addr
リバースポートフォワーディングのあれこれ
なぜかしょっちゅう接続がきれててあーってなってました
その対策方法をようやく見つけて基本的にここに答えらしきものが書いてあった
要はkeychainを使えばうまくいくとのことで、まずはkeychainを入れます。
sudo apt-get install keychain
そして、以下のコマンドを自分は.bashrcに追加した
keychain --nogui id_rsa
そしてさらに、create_ssh_tunnel.shの中のsshを実行する部分の前に以下のコードを追加した
. ~/.keychain/$HOSTNAME-sh
これで、crontabからsshで繋がるようになった。
ただ再起動したら.bashrcが実行されないといけないのでコマンドプロンプトを開く必要がある(改善できそう)
VisualStudio2015で画像ビューアを作る [3]
前回の記事 korechi.hatenablog.comの続きです。
フォームへダイアログの追加
- Toolbox > Dialog > OpenFileDialogとColorDialogをダブルクリック
フォームデザイナーの下にopenFileDialog1というアイテムを確認できるはずです。
openFileDialogを選択し、Filterプロパティの値を以下にセット
JPEG Files (*.jpg)|*.jpg|PNG Files (*.png)|*.png|BMP Files (*.bmp)|*.bmp|All files (*.*)|*.*
- TitleプロパティをSelect a picture fileに変更
画像の表示
- ピクチャの表示ボタンをダブルクリック
Form1.cs内の***_Click()に移動するはずです。 以下のようにコードを記入します。
private void showButton_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { pictureBox1.Load(openFileDialog1.FileName); } }
- デバッグしてみます
ピクチャの表示ボタンを押してうまいことできたら成功です!
今回結構進んだ感じしますね。さりげなくコードのお作法やら学んでいきましょう。
他ボタンの動作
下をコピペすればよいです。各自解読してください。
private void clearButton_Click(object sender, EventArgs e) { // ピクチャを消す pictureBox1.Image = null; } private void backgroundButton_Click(object sender, EventArgs e) { // カラーパレット選択アイコンを表示 if (colorDialog1.ShowDialog() == DialogResult.OK) pictureBox1.BackColor = colorDialog1.Color; } private void closeButton_Click(object sender, EventArgs e) { // Close the form. this.Close(); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { // チェックボックスの値によってピクチャのサイズを変化 if (checkBox1.Checked) pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; else pictureBox1.SizeMode = PictureBoxSizeMode.Normal; }
これで基本操作のチュートリアルは終了です!!お疲れ様でした!
あとはこれを応用して、いろんな機能をつけて遊ぼうと思います。
VisualStudio2015で画像ビューアを作る [2]
前回の記事korechi.hatenablog.comの続きです。
フォームにコントロール(ピクチャBox)を追加
- Toolbox > Common Controls内のPictureBoxをダブルクリック この時、前記事でTableLayoutPanelがフォームをfillするよう設定されているので、自動的にPanel内にPictureBoxが配置されるはずです。
- PictureBoxの三角矢印を押し、親コンテナーにドッキングするを選択
- PictureBuxを選択し、ColumnSpanを2に変更し、BorderStyleをFixed3Dに変更しサイズをうまいこと調整
- CheckBoxを追加
- CheckBoxのTextプロパティをStrechに変更すると以下のようになる
- Toolbox > containers内のFlowLayoutPanelを選択し、親にドッキング
フォームへボタンを追加
- FlowLayoutPanelを選択
- Toolbox > Common Controls内のButtonをダブルクリック
button1がFlowLayoutPanel内に追加されます。同様の操作をもう一度やりbutton2を追加します。
コピペでbuttonを増やすこともできます。 - button1のTextプロパティをピクチャの表示に変更し、それ以降のボタンをピクチャの消去, 背景色の設定, 閉じるに変更
- 複数のbuttonを並べるため、FlowlayoutPanelを選択し、FlowDirectionプロパティの値をRightToLeftに変更
- ボタンを並び替えて下のように配置
- ボタンを全て選択後、AutoSizeプロパティの値をtrueに
ctrlを押しながら選択すれば複数選択可
ボタンに名前をつける
- ボタンを選択し、(Name)プロパティの値をそれぞれ分かりやすい名前に変更
- フォーム内のどれかボタンをダブルクリックするとエディタが表示されます
この時、同時にshowButton_Click()が追加されています。
checkBoxについても同様にやるとコード内にcheckBox1_CheckedChanged()が追加されます。これらの追加された関数はEventHandlerから呼び出されます。
そしてダブルクリックしたら自動的にEvent時に呼ばれる関数が追加されることを覚えておきましょう。
VisualStudio2015で画像ビューアを作る [1]
はじめてVisualStudioを使って1からアプリケーションを作ります!
このチュートリアル(Tutorial 1: Create a Picture Viewer)にそって進めていきます。
まずは簡単な画像ビューアを作成します。
Windows Form Applicationの作成
- File > New Project を選択
- Installedの項目の中からVisual C#を選択し、Windows Forms Applicationを選択
- NameとLocationを各自編集
- File > Save Allを選択し保存
これでアプリケーションのひな形ができました!
プログラムの実行
- 以下の3つのうちどれかでプログラムを実行します
- F5キーを押す
- メニューバーにあるDebug, StartDebuggingを選択
- ツールバーにあるStartボタンを押す
- 赤い四角のボタンを押してプログラムを停止します
フォームのプロパティのセット
プロパティとは、属性値のこと。フォームはアプリケーションそのもので複数のプロパティを持ちます。 つまり、フォームのプロパティということは、アプリケーション内のさまざまなもののパラメータです。(少し正しくないかも)
1. タブからForm1.cs [Design]を選択
フォームを選択するとPropertiesウィンドウの中にいろいろ値が表示されるのでいじってみましょう。
TableLayoutPanelの操作
TableLayoutPanelはWordのテーブルのようなもの。行と列から構成されたボックスの集合です。
1. ツールボックスタブ内のコンテナー内のTableLayoutPanelを選択
2. これでフォーム内にTableLayoutPanelが追加されるので、それを選択
3. プロパティ内の上部にあるアイコンの左から3つ目を選択
4. Dockを選択し、値としてFillを選択
5. あとは好きなようにテーブルデザインを変更するために三角ボタンを選択し、ちょこちょこ編集します
続きは