pagein した後でもスワップブロックは解放されない2017年12月20日 11時44分37秒

FreeBSD のコードと、動作の観察によると、FreeBSD では pagein した後でも、消費されているスワップのブロックはそのプロセスが終了するまで解放されない。そのため、実質の利用メモリよりも大幅にスワップ領域が消費される様だ。

例えば、clang をコンパイルすると、一つずつのプロセスが大量のメモリを必要とする。make buildworld -j 30 等とすると、あっと言う間にメモリが無くなる。実メモリが足りないとスワップデバイスに書き出される。それが、実メモリに呼び戻されて、メモリの内容が変更される。これの時、スワップデバイスは古いメモリの内容を保持し続ける。

このプロセスが、実メモリを 300MB 使っていたとしよう。このうち 100MB がスワップアウトされたとする。この時、このプロセスは実メモリを 200MB とスワップデバイスを 100MB 消費している事になる。この後、50MB がスワップインされてると、実メモリを 250MB 利用し、スワップデバイスを 100MB 利用する事になる。

もし、この 50MB の内容が更新されてもスワップデバイスはまだ、100MB 占有されている。つまり、実メモリ的には 300MB あれば、十分なのだが、350MB 分の記憶領域を保持していることになる。

この 50MB が更新されていなくて、メモリ掃除の対象になったら、既にスワップデバイスに同じ物があるので、そのままメモリの内容が破棄される。

まだ、この新しいメモリがスワップアウトする時に、何処に書き出されるかは掴めていない。

簡略すると、スワップ領域を大量に出し入れ使う状態に陥ると、必要以上のメモリ領域が浪費される。古いメモリの内容がスワップデバイスに残って、スワップ領域を無駄にするようだ。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2017/12/20/8751689/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。