諸卿もご存知の通り、Linuxのメモリアロケーションはmalloc(), mmap()した段階ではメモリ割付をせず、最初にメモリにアクセスしたときに行うという俗に「first touch」と呼ばれるアロケーションポリシーを採用している。
さて、んでは、このmmap()したけどまだ実際にはメモリ割付されているないアドレスにたいしてmlock()したらどうなるか。
というと、この時点でメモリ割付が走る。
走るのはいいんだが、これがまたベラボーに遅い。
別にLinuxカーネルのアルゴリズムが悪いわけではなくて、メモリ割付をする=そのページを0クリアするという事なので、DRAMのアクセス速度が超えられない壁となって立ちはだかるわけだ。
じゃあ、どのくらい時間がかかるか計算してみよう。
まず、DRAMをDDR2 PC5300と仮定しよう。イマドキ、こんなもんよね。
これでアクセス速度理論値 5300/2=2650MB/s(=2.65GB/s).
mlockするサイズを150GBと仮定すると150 / 2.65 =~ 56.6 sec
うむ、約1分かかるな。
ただ、この1分はただの1分ではなくカーネル空間での1分であるので、
Linuxのつくりの問題で
・CPUが何個あろうと1分かかる
(mlockをcallしたCPUで全処理走るから)
・その間、スケジューラは一切走らず別のプロセスは動作できない
(CONFIG_PREEMPT無効の場合。Redhat Enterprise Linuxとかは無効)
という事態になる。
ところで、世の中にはサーバーが無反応になったら自動的にリブートが走るという便利なサービスを提供しているソフトがいっぱいあってな・・・
かつ、Linuxではevent/n スレッドはper CPUなスレッドであるから、
あるスレッドが動けない状態になっても別スレッドは助けてくれない仕組みになっておってな・・・
まあ、このevent/nスレッドはwork queueとか使うと勝手に使われる仕組みなので、知らない間につかってしまっている事も多いのだが。
・・・・
あとは・・・分かるな? ・゚・(ノД`)・゚・
PS. 計算式にメモリのデュアルチャンネルありなしが入っていないのはおいらが詳しくないから。あれって、シーケンシャルアクセスにも効果あるんだっけ?
ロック! ランキング!
さて、んでは、このmmap()したけどまだ実際にはメモリ割付されているないアドレスにたいしてmlock()したらどうなるか。
というと、この時点でメモリ割付が走る。
走るのはいいんだが、これがまたベラボーに遅い。
別にLinuxカーネルのアルゴリズムが悪いわけではなくて、メモリ割付をする=そのページを0クリアするという事なので、DRAMのアクセス速度が超えられない壁となって立ちはだかるわけだ。
じゃあ、どのくらい時間がかかるか計算してみよう。
まず、DRAMをDDR2 PC5300と仮定しよう。イマドキ、こんなもんよね。
これでアクセス速度理論値 5300/2=2650MB/s(=2.65GB/s).
mlockするサイズを150GBと仮定すると150 / 2.65 =~ 56.6 sec
うむ、約1分かかるな。
ただ、この1分はただの1分ではなくカーネル空間での1分であるので、
Linuxのつくりの問題で
・CPUが何個あろうと1分かかる
(mlockをcallしたCPUで全処理走るから)
・その間、スケジューラは一切走らず別のプロセスは動作できない
(CONFIG_PREEMPT無効の場合。Redhat Enterprise Linuxとかは無効)
という事態になる。
ところで、世の中にはサーバーが無反応になったら自動的にリブートが走るという便利なサービスを提供しているソフトがいっぱいあってな・・・
かつ、Linuxではevent/n スレッドはper CPUなスレッドであるから、
あるスレッドが動けない状態になっても別スレッドは助けてくれない仕組みになっておってな・・・
まあ、このevent/nスレッドはwork queueとか使うと勝手に使われる仕組みなので、知らない間につかってしまっている事も多いのだが。
・・・・
あとは・・・分かるな? ・゚・(ノД`)・゚・
PS. 計算式にメモリのデュアルチャンネルありなしが入っていないのはおいらが詳しくないから。あれって、シーケンシャルアクセスにも効果あるんだっけ?
ロック! ランキング!
コメント
コメント一覧 (6)
ていうかまだ続いてるのですね。すごい!!!
読んでみたくなりましたよ(わたしはアニメ版のしか知らないけど^^;)
連続したアドレスにアクセスする場合は効くんじゃないでしょうか。
1バイトずつ書き込む処理でもキャッシュから書き戻す時にがつんとやってくれるのでは…
いやいや、SMPで死活監視をするのに、特定のCPUにバインドされたスレッドでやってはいけないのは常識で、なんだけど、work queueとかを使うと知らない間にそれが簡単に起こってしまうので、気をつけなくちゃね。
というお話なのです。
死活監視はあくまで、生死を監視しているのであって、負荷があがったぐらいでリブートしてちゃあきまへん(´・ω・`)
だいたい、使うメモリをmmapしまくるデーモンは世の中に腐るほどいて、かつ、搭載メモリを増やすと勝手に消費メモリが増えていくプログラムなんていくらでもあるのに、そんなの気をつけれないですよ。
自分でつくったプログラムじゃないんで。
rnaさん>
おおお、こやつはrnaさんの作品でしたか。ぐぐる画像検索でみつかったのを適当にひっぱってきてるので、全然気が付きませんでした。未承諾で使ってしまい申し訳ありませぬ。
相変わらずいいセンスをお持ちですね(⌒▽⌒)