OS
Linux
sysctl.conf

只有设置在 /etc/sysctl.conf 中的参数才是重启后也生效的,用 sysctl -w 设置的参数重启后就失效了。

内存相关 (opens in a new tab)

vm.swappiness

vm.swappiness 用于定义 swap 分区交换的积极性,值越大,越积极的使用 swap 空间。值为 0 代表最大限度使用物理内存。单位是百分比,默认值为 60,范围为 0-100。

vm.vfs_cache_pressure

vm.vfs_cache_pressure 用于定义虚拟内存回收 directory 和 inode 缓冲的倾向,在默认值 vfs_cache_pressure=100 时,内核将试图以一个“公平”的速度回收 pagecache 和 swapcache。降低该值会使内核倾向于保留 Dentry 和 inode 缓存,当值为 0 时,内核将不会回收 Dentry 和 inode 缓存,这很容易导致内存不足。当值超过 100 时,内核将倾向于回收 Dentry 和 inode 缓存。

vm.dirty_ratio

vm.dirty_ratio 同步刷脏页,会阻塞应用程序。这个参数控制文件系统的同步写写缓冲区的大小,单位是百分比。表示当写缓冲使用到系统内存多少的时候(即指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如 10%)),开始向磁盘写出数据,即系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存),在此过程中很多应用进程可能会因为系统转而处理文件 IO 而阻塞。

增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值。

vm.dirty_background_ratio

vm.dirty_background_ratio 异步刷脏页,不会阻塞应用程序,这个参数控制文件系统的后台进程,在何时刷新磁盘。单位是百分比。表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候,就会触发 pdflush/flush/kdmflush 等后台回写进程运行,将一定缓存的脏页异步地刷入外存。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值。

注意:如果 dirty_ratio 设置比 dirty_background_ratio 大,可能认为 dirty_ratio 的触发条件不可能达到,因为每次肯定会先达到 vm.dirty_background_ratio 的条件,然而,确实是先达到 vm.dirty_background_ratio 的条件然后触发 flush 进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于 flush 进程刷出的量那自然会达到 vm.dirty_ratio 这个参数所设定的坎,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程。

vm.dirty_expire_centisecs

vm.dirty_expire_centisecs 表示脏页在内存中的最长存活时间,单位是1/100 秒。当脏页在内存中存活的时间超过这个值时,那么在下一次刷新线程唤醒时就会被写入磁盘。缺省是 3000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致 IO 提高太快。建议设置为 1500,也就是 15 秒算旧。当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十 M),那么这个值还是大些的好。

调优思路

尽量使用内存,减少 swap,同时,尽早 flush 到外存,早点释放内存给写 cache 使用。---特别在持续的写入操作中,此优化非常有效。

调优措施:

vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 500
vm.vfs_cache_pressure = 500