Mosh on Mona が OS 側の改善でかなり速く起動するようになった

グラフを見れば一目瞭然。ファイルシステムに block cache を導入。リンカ・ローダーに PE cache を導入したらこんなに高速化した。グラフ上は目標値は Ubuntu amd64 で実際に Mosh を起動して測定した物。Mona が起動している KVM のホストなので目標値そのものに到達するのは無理だと思われる。


block cache

block driver が処理する block 単位で cache をする block cache を導入。OS の起動が目に見えて速くキビキビした。disk read が遅いというのは知識や経験からも知っているのだが自分の OS だとさらに深く感じるものがある。

PE cache

オブジェクトファイルの parse やイメージ作成を全てキャッシュする。変更がなかったバイナリファイルはキャッシュしておいて即座にロードしたほうが速い。
以下計測時のメモ。
前回 Mona に block cache を導入したがまだ Linux と比較してかなりの開きがあることが分かる。比べて見てよう。

empty.sps
  • 目標値: 60 msec
    • Mona: 160 msec (main から exit まで 80 msec) 100 msec(55%) がプロセス外
    • Linux: 51 msec (main から exit まで 42 msec) 9 msec(17%) がプロセス外
test-imports.sps
  • 目標値: 130msec
    • Mona: 270 msec (main から exit まで 170 msec) 100 msec(37%) がプロセス外
    • Linux: 101 msec (main から exit まで 91 msec) 10 msec(9%) がプロセス外
遅いのはプロセス外部

上の計測により Mosh の main 突入以前に 100 msec ほど使っていて足枷になっていることが分かった。
更に計測するとプロセス外は全て monapi_call_process_execute_file_get_tid で消費されていることが分かった。

  • > Process Server の ExecuteFile で全て
  • > 100 msec のうち ExecuteProcess 20 msec、MSG_PROCESS_CREATE_IMAGE に 80 msec
  • > PELinker pe(msg.str, msg.arg1 == MONAPI_TRUE); が 80 msec
  • > これは PE リンカ。バイナリが変更されていなかったらキャッシュすれば良い。
  • > 現時点では CD-ROM がマウントされている /APPS 以下のバイナリはキャッシュしてしまおう
  • > MSG_PROCESS_CREATE_IMAGE が 10msec 以下になった
empty.sps
  • 目標値: 60 msec
    • Mona: 90 msec (main から exit まで 70 msec) 20 msec(22%) がプロセス外
    • Linux: 51 msec (main から exit まで 42 msec) 9 msec(17%) がプロセス外
test-imports.sps
  • 目標値: 130msec
    • Mona: 190 msec (main から exit まで 170 msec) 20 msec(10%) がプロセス外
    • Linux: 101 msec (main から exit まで 91 msec) 10 msec(9%) がプロセス外

さて ExecuteProcess が 20 msec だったがこれを削れないだろうか。見てみたがシステムコール内でプロセスを生成しているだけだった。ここはとばそう。
次に気になるのは mosh 内の main から exit までだ。比較している Linux はホストかつ amd64Mona はゲストで IA32 なのでこういう比較はフェアではないかもしれない。