PID名前空間で名前空間を普通の時と多段にしたときでgetpid(2)にかかる速度を見てみる

PID名前空間名前空間をとくに使わない時(CONFIG_PID_NS=yな環境で特に分離させてない時)とPID名前空間の分離を多段でやってみた時で、getpid(2)に影響があるのかどうかというのを見てみました。 まず、getpid(2)の仕組みですが、これは以前書いたCLONE_NEWPIDを調べる:getpid()とpid namespace - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモを見てみてください。自分はマウント名前空間の処理とごっちゃになってたので、名前空間の探索にループがあると思ってたけど、見なおしたらループはありませんでしたw

まず使ったものは、PID名前空間の分離は手を抜いてlwn.netにあるns_child_exec.c [LWN.net]で行いました。その他、使ったものはgistに上げました。

gist.github.com

getpid(2)の実行はpidns_tester.cでやってます。getpidはlibcのラッパーを使わずにsyscall(2)で実行してます。実行にかかった時間は、時間ではなくてクロック数でとっています。 内容としてはfork(2)して子プロセスがgetpid(2)して共有メモリにかかったクロック数を書き込んで終了。親プロセスは子プロセスが終了するまで待って、終わったら次のループという感じになってます。

計測は1回のテストで100000回のgetpid(2)を実行して、それを5セットです。

実行結果はこうなりました。

クロック数平均

pidnsなし pidns 5段階 pidns 10段階
35558.81541 38438.74045 33723.59867
34981.49544 35868.07209 34241.29666
33820.61964 34375.09794 35546.38836
38316.59297 32984.40835 37544.71303
35215.90891 34550.26301 36613.06395

f:id:masami256:20150920161831p:plain

クロック数中央値

pidnsなし pidns 5段階 pidns 10段階
42438 34527 39011
31590 32817 31515
35322 33440 36672
40734 38241 35301
47516 31677 35103

f:id:masami256:20150920161953p:plain

この結果から見えてくるのは、なんですかね。。。 PID名前空間名前空間を分離してもしなくても明確に差が出ることは無さそうってことでしょうか。中央値でみるとpidnsを分離していないやつのがクロック数を多く使うことが多いけど、試行回数を増やせばもっとフラットになるのかな?

Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)

Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)