合 文件系统脏页缓存参数dirty_ratio、dirty_background_ratio、dirty_background_bytes、dirty_bytes、dirty_expire_centisecs、dirty_writeback_centisecs介绍
Tags: LinuxOS优化缓存dirty_background_bytesdirty_background_ratioIO优化dirty_writeback_centisecsdirty_ratiodirty_expire_centisecsdirty_bytes脏页
简介
文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM
中读取数据)。写缓存比较复杂,Linux
内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。
当然,也存在缓存被写爆的情况。还可能出现一次性往磁盘写入过多数据,以致使系统卡顿。这些卡顿是因为系统认为,缓存太大用异步的方式来不及把它们都写进磁盘,于是切换到同步的方式写入。
这些都是可控制的选项,根据工作负载和数据,你可以决定如何设置它们:
1 2 3 4 5 6 7 8 | $ sysctl -a | grep dirty vm.dirty_background_bytes = 0 vm.dirty_background_ratio = 10 vm.dirty_bytes = 0 vm.dirty_ratio = 20 vm.dirty_writeback_centisecs = 500 vm.dirty_expire_centisecs = 3000 vm.dirtytime_expire_seconds = 43200 |
vm.dirty_background_ratio
是内存可以填充脏数据的百分比。这些脏数据稍后会写入磁盘,pdflush/flush/kdmflush
这些后台进程会稍后清理脏数据。比如,我有32G内存,那么有3.2G的脏数据可以待着内存里,超过3.2G的话就会有后台进程来清理。vm.dirty_ratio
是可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O
块都会被阻塞,直到脏数据被写入磁盘。这通常是长I/O
卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。vm.dirty_background_bytes
和vm.dirty_bytes
是另一种指定这些参数的方法。如果设置_bytes
版本,则_ratio
版本将变为0,反之亦然。vm.dirty_expire_centisecs
指定脏数据能存活的时间。在这里它的值是30秒。当pdflush/flush/kdmflush
在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。毕竟数据在内存里待太久也会有丢失风险。vm.dirty_writeback_centisecs
指定多长时间pdflush/flush/kdmflush
这些进程会唤醒一次,然后检查是否有缓存需要清理。
- dirty_ratio:与dirty_background_ratio相似,但是该值是作为系统内存中脏页的百分比来表示。当脏页的数量超过该比例时,后台进程开始清除脏页。
- dirty_background_ratio:与dirty_background_bytes相似,但该值是作为系统内存总量的百分比来表示。
- dirty_background_bytes:当脏页的数量达到该值时,后台进程(如pdflush)开始清除脏页。该值通常设置为系统内存的5%。
- dirty_bytes:内存中当前脏页的总大小。
- dirty_expire_centisecs:当一段时间(以百分之一秒为单位)过去后,内核认为脏页已经过期并需要被清除。该值通常设置为系统内存中脏页的1%。
- dirty_writeback_centisecs:当一段时间(以百分之一秒为单位)过去后,内核将尝试写回一些脏页。该值通常设置为dirty_expire_centisecs的一半。
这些参数是Linux内核用于控制内存中脏页的机制,以确保系统能够正常运行,并避免数据丢失。它们通常是根据系统内存的大小和使用情况进行调整的。
dirty_background_bytes更关注的是内存中的实际脏页大小,而dirty_ratio更关注的是内存中脏页所占的比例。
统计
可以通过下面方式看内存中有多少脏数据:一共有106页的脏数据
1 2 3 4 5 6 | $ cat /proc/vmstat | egrep "dirty|writeback" nr_dirty 106 nr_writeback 0 nr_writeback_temp 0 nr_dirty_threshold 3934012 nr_dirty_background_threshold 1964604 |
查看
1 2 3 4 5 6 | cat /proc/sys/vm/dirty_ratio cat /proc/sys/vm/dirty_background_ratio cat /proc/sys/vm/dirty_background_bytes cat /proc/sys/vm/dirty_bytes cat /proc/sys/vm/dirty_expire_centisecs cat /proc/sys/vm/dirty_writeback_centisecs |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@PT-Test-12 ~]# cat /proc/sys/vm/dirty_ratio 30 [root@PT-Test-12 ~]# cat /proc/sys/vm/dirty_background_ratio 10 [root@PT-Test-12 ~]# cat /proc/sys/vm/dirty_background_bytes 0 [root@PT-Test-12 ~]# cat /proc/sys/vm/dirty_bytes 0 [root@PT-Test-12 ~]# cat /proc/sys/vm/dirty_expire_centisecs 3000 [root@PT-Test-12 ~]# cat /proc/sys/vm/dirty_writeback_centisecs 500 [root@PT-Test-12 ~]# |
修改
要将dirty_ratio设置为20%,将dirty_background_bytes设置为10 MB:
临时修改:
1 2 | echo 20 > /proc/sys/vm/dirty_ratio echo 10485760 > /proc/sys/vm/dirty_background_bytes |