大量のメモリを使用するプログラムからコマンドを実行する方法というのを読んだ
メモリを多く使用したプロセスから繰り返しfork()する場合,performance issuesになりうるという話.
StackOverflow linux - 大量のメモリを使用するプログラムからコマンドを実行する方法 - スタック・オーバーフロー
実際困ることあるらしく
昨日今日ちょっと話題になったお話。fork()はあまり速くはないシステムコールですが、では1回あたり何ミリ秒かかるでしょう。個人的な感覚値としては0.3ミリ秒ぐらいという感覚で、実際測ってみると「動かしたて」のプロセスなら現代のCPUならこんなものです。しかし……
— mayah (@mayahjp) 2016, 1月 27
@mayahjp メモリを使ったりファイルを開いたりした状態だと、fork()がコピーするものが増えるのでfork()に時間がかかるようになります。malloc(4)を1M回呼んだ状態では、fork()が突然1ミリから2ミリ秒かかるようになります。
— mayah (@mayahjp) 2016, 1月 27
...
@mayahjp 改善案としては、fork()のときにいろいろコピーするのをやめればよいので、fork()/exec()の代わりにposix_spawn()を使うとちょっとだけましになります。こっちは共有するものが少ないので。あとはfork()専用の軽いプロセスを作って……
— mayah (@mayahjp) 2016, 1月 27
@mayahjp そのプロセスをfork()するようにコードを直すという感じでしょうか。すごく軽いプロセスからのposix_spawn()は、秒間1万回ぐらいは呼べます。
— mayah (@mayahjp) 2016, 1月 27
結論としてはposix_spawn()使えというのが良いそうだ.
リンクされているvforkの話も面白かった. http://www.a-k-r.org/d/2014-09.html#a2014_09_06
vfork速いけどメモリ空間をコピーしない特性上クセはある.子プロセスがデッドロックするのでマルチスレッドでforkしたら直後にexecしろというのと同様,vforkしたら直後にexecするべきなのだろう.(しない有用な例はあまり思いつかないけれど)
UNIX上でのC++ソフトウェア設計の定石 (3) - memologue
マルチプロセス難しいなー.