ネットワーク名前空間を常に作成および削除する 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 を使用しています。