Mercurial-2.6の並列になったupdateの注意点
いくつか注意点があることを id:flying-foozy さんに指摘してもらったので紹介します。
並列updateで10万規模のファイルを一度に更新するとlinux kernelでsoft lockupと誤認される
10万規模のファイルを更新するとlinux kernelでsoft lockupと誤認されるようです。
バグとして登録されているのですが、linux kernel側の問題ということで、mercurial側で対応する気はないようです。
soft lockupとはタスクやカーネルスレッドがCPUを一定時間専有している状態(一定時間割り込みが禁止されている状態)を指すらしく、 通常はカーネルのバグかハードウェアのバグで発生するみたいです。(遭遇したこと無い、、)
そもそも10万ファイルあるような巨大なリポジトリを利用するケースは少ないと思いますが、*1 この問題に遭遇した場合は、次で紹介するworker.numcpusで調整すると良いかもしれません。
@troter #mercurialjp 10万規模を一気にupdateする場合、条件次第ではLinuxカーネルの問題からsoft lockup扱いされるケースがある模様 bz.selenic.com/show_bug.cgi?i… なので、一応ブログに注記等を入れておいた方が良いかも?
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年4月24日
並列実行のworker数はhgrcのworker.numcpusで設定可能
並列実行のworker数はhgrcのworker.numcpusで設定可能です。
[worker] numcpus = 1 # 並列実行しない
未設定の場合、worker数はCPU数に応じて4から32の間になります。
@troter #mercurialjp カーネルパラメータを弄る手もあるみたいですが kb.vmware.com/selfservice/mi…Mercurial 側で worker.numcpus 設定値を明示的に1とかに下げておくのが妥当(&簡単)かな?
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年4月24日
非POSIX環境(≒Windows)では並列updateが利用できない
非POSIX環境ではworkerの起動コスト1e30という非常に大きな値にする事によって実質並列updateが行われないように調整されています。
@troter #mercurialjp もう一点注意事項を見つけました。非POSIX環境≒Win環境だと、並列実行されない模様 selenic.com/repo/hg/file/f… プロセス周りの挙動が違うしなぁと思ったら、そもそも win だと os.fork() がなかった。
— FUJIWARA Katsunoriさん (@flyingfoozy) 2013年4月28日
気になった点
よく見ると、この2つのif文の条件は両方ともif os.name == 'posix'で良い気がします。