3

ネットワーク名前空間を常に作成および削除する Linux アプリケーション (C で記述) があります。通常、作成/削除サイクルには約 300 ミリ秒かかります。

パフォーマンスの調査中に、プログラムで strace を実行して、どのシステム コールに最も時間がかかっているかを調べました。strace の出力から、私のシステムでは unshare の最初の呼び出しに 4 ミリ秒しかかからないようですが、その後の呼び出しには 200 ミリ秒近くかかります。

strace -p <pid> -T
unshare(CLONE_NEWNET)                   = 0 <0.004150>
unshare(CLONE_NEWNET)                   = 0 <0.192055>
unshare(CLONE_NEWNET)                   = 0 <0.192872>
unshare(CLONE_NEWNET)                   = 0 <0.190303>
unshare(CLONE_NEWNET)                   = 0 <0.193062>

サイクル (内部制御サイクル) の開始時にネットワーク名前空間を作成し、サイクルの最後に名前空間を削除するように構成されたプログラム。

実験のために、制御サイクルの最後にネットワーク名前空間を削除しないようにアプリケーションを変更しました。新しいネットワーク名前空間のみを作成し、決して削除しないでください。これにより、パフォーマンスが大幅に向上し、システム コールの共有を解除するための後続の呼び出しで遅延が発生しなくなりました。各 unshare システム コールには 2 ~ 3 ミリ秒かかります。

strace -p <pid> -T    
unshare(CLONE_NEWNET)                   = 0 <0.003102>
unshare(CLONE_NEWNET)                   = 0 <0.002980>
unshare(CLONE_NEWNET)                   = 0 <0.003070>
unshare(CLONE_NEWNET)                   = 0 <0.003124>
unshare(CLONE_NEWNET)                   = 0 <0.002952>

明らかに、ネットワーク名前空間を削除すると、その後のネットワーク名前空間の作成に何らかの影響/遅延が生じます。

ここで何が起こっているのでしょうか?これをさらにデバッグするにはどうすればよいですか?

Linux カーネル 3.12.9-301.fc20.x86_64 を使用しています。

4

1 に答える 1

3

Linux ftrace は、システム コールのデバッグ/プロファイリングに非常に役立ちます。

以下の記事を参照

  1. http://lwn.net/Articles/365835/
  2. http://lwn.net/Articles/366796/

ftrace-cmd ( http://lwn.net/Articles/410200/ ) は、迅速なデバッグに便利なフロント エンドを提供します。ただし、きめ細かいデバッグの場合は、ネイティブの ftrace インターフェイスの方が優れており、かなり簡単です。

私にとって何がうまくいったか -

  1. 関心のある領域でのみトレース ポイントを有効/無効にするコードをインストルメント化します。これには基本的に、debug-fs の下のファイル「tracing-on」に「1」(有効) または「0」(無効) を書き込む必要があります。
  2. debug-fs の下のファイル「set_ftrace_pid」にアプリケーション pid を挿入します。
  3. set_trace_filter に 1 つ以上のシステム コールを追加します。使用可能なシンボルは、debug-fs の下のファイル available_filter_function にあります。
  4. お気に入りのトレーサーを使用して current_tracer をファイルします。function_graph を使用しました。

ステップ 1 と 2 は必須ではありませんが、多くのノイズをフィルター処理して、調査対象に関連するデータを取得するのに役立ちます。

要約すると、ftrace ルール!!!

于 2015-03-03T19:30:26.560 に答える