- 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処理を頻繁に、かつ優先度を高く実行させるように設定すること
パラメータ変更の方法
- "/etc/systl.conf"書き換え
- "sysctl"コマンド
- "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"ファイルへの修正を行う