kernel:Memory Manage(1) Page Cache & Writeback

  • Linuxでは空いているMemoryは積極的にファイル用のCacheに使用する
  • MemoryはPageという単位で分割して管理されており、Cacheに使用されているMemoryをPage Cacheと呼ぶ
  • Memoryのチューニングのポイントは無駄なPage Cacheを残さないこと
  • Page Cacheにデータを書き込んだ時点でProcessからの書き込み処理は終了するが、実際のデータの書き込みはHDDに後に書き込まれる(Writeback処理)
  • LinuxにおけるWriteback処理は、"pdflush"というデーモンが担当する

"pdflash"デーモンのパラメータ

パラメータ 内容
vm.dirty_backgroudo_ratio Processの書き込み処理は終了したがまだWritebackされていないPageの、全物理Pageに対する割合(%)が"vm.darty_backgroud_ratio"で指定した値を超えているとpdflashによるWriteback処理が実行される。よって、値を小さくすればするほど頻繁にWriteback処理が実施されることになる。"vm.darty_ratio"値よりも大きな値を設定しても無視される。一般的に"vm.darty_ratio"の半分の値が用いられ、デフォルトでは10%が設定されている
vm.dirty_ratio "vm.darty_ratio"値を超えてProcessがPageを作成したタイミングで、Page Cacheを作成したProcess自身がWriteback処理を行う。Page Cacheの割合が、"vm.darty_background_ratio"よりも高く、"vm.darty_ratio"よりも低い場合にはWriteback処理はバックグラウンドで実行される(優先度は低く実行される)。逆に"vm.darty_ratio"よりも高い場合にはWriteback処理はフォアグラウンドで実行される(優先度は高く実行される)。最小値は5%、デフォルト値は40%
vm.dirty_expire_centisecs "vm.darty_expire_centisecs"で指定した時間間隔で強制的にWriteback処理が実行される。デフォルト値は3000(10ms単位)
vm.dirty_writeback_centisecs "pdflash"デーモンが起動される間隔。定期的に Page CacheをWritebackする。デフォルト値は500(10ms単位)
  • 最も効果のあるパラメータは"vm.darty_ratio"の値を小さくし、Writeback処理を頻繁に、かつ優先度を高く実行させるように設定すること

パラメータ変更の方法

  1. "/etc/systl.conf"書き換え
  2. "sysctl"コマンド
  3. "procfs"による

CentOS5のデフォルトの"/etc/sysctl.conf"

[root@tkcent1 etc]# cat sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536

# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

デフォルトのパラメータ値が"/etc/sysctl.conf"に記述されていない状態での"vm.dirty_ratio"値を確認する

[root@tkcent1 etc]# /sbin/sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
[root@tkcent1 etc]# /sbin/sysctl vm.dirty_ratio
vm.dirty_ratio = 40

"/etc/sysctl.conf"ファイルを修正し、修正内容を適用する(ここでは"vm.darty_ratio = 30"を追加記述した)

[root@tkcent1 etc]# /sbin/sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
vm.dirty_ratio = 30

現在の"sysctl.conf"ステータスを確認する

[root@tkcent1 etc]# /sbin/sysctl vm.dirty_ratio
vm.dirty_ratio = 30

"sysctl"コマンドを使用して"vm.dirty_ratio"値を変更する(ここでは値を30から40に変更する)

[root@tkcent1 etc]# /sbin/sysctl -w vm.dirty_ratio=40
vm.dirty_ratio = 40
[root@tkcent1 etc]# /sbin/sysctl vm.dirty_ratio
vm.dirty_ratio = 40

procで"vm.dirty_ratio"値を確認する

[root@tkcent1 ~]# cat /proc/sys/vm/dirty_ratio 
40

procで"vm.dirty_ratio"値を変更する

[root@tkcent1 ~]# echo 30 > /proc/sys/vm/dirty_ratio 
[root@tkcent1 ~]# cat /proc/sys/vm/dirty_ratio 
30

sysctlコマンドやprocによる修正は再起動により無効になるため、パラメータの調整をこれらの方法により行い、最適値を確認の上で"/etc/sysctl.conf"ファイルへの修正を行う