Linux 调优 VM(内存)子系统
我有带有多个 SCSI 磁盘的快速 RAID-10 磁盘子系统。在现代 Linux 内核下运行的应用程序不会直接写入磁盘。它们将其写入由 Linux 内核虚拟内存管理器管理的文件系统缓存。由于我有高性能 RAID 控制器,因此我需要减少刷新次数。如何在 Linux 操作系统下调整虚拟内存子系统以获得更好的性能?
Linux 允许您调整 VM 子系统。但是,调整内存子系统是一项艰巨的任务。错误的设置会影响系统的整体性能。我建议您一次修改一个设置并监视系统一段时间。如果性能提高,请保留设置,否则请恢复原状。
向 /proc/sys/vm 问好
此目录中的文件可用于调整 Linux 内核的虚拟内存(VM)子系统的操作:
示例输出:
cd /proc/sys/vm
ls -l
total 0 -rw-r--r-- 1 root root 0 Oct 16 04:21 block_dump -rw-r--r-- 1 root root 0 Oct 16 04:21 dirty_background_ratio -rw-r--r-- 1 root root 0 Oct 16 04:21 dirty_expire_centisecs -rw-r--r-- 1 root root 0 Oct 16 04:21 dirty_ratio -rw-r--r-- 1 root root 0 Oct 16 04:21 dirty_writeback_centisecs -rw-r--r-- 1 root root 0 Oct 16 04:21 drop_caches -rw-r--r-- 1 root root 0 Oct 16 04:21 flush_mmap_pages -rw-r--r-- 1 root root 0 Oct 16 04:21 hugetlb_shm_group -rw-r--r-- 1 root root 0 Oct 16 04:21 laptop_mode -rw-r--r-- 1 root root 0 Oct 16 04:21 legacy_va_layout -rw-r--r-- 1 root root 0 Oct 16 04:21 lowmem_reserve_ratio -rw-r--r-- 1 root root 0 Oct 16 04:21 max_map_count -rw-r--r-- 1 root root 0 Oct 16 04:21 max_writeback_pages -rw-r--r-- 1 root root 0 Oct 16 04:21 min_free_kbytes -rw-r--r-- 1 root root 0 Oct 16 04:21 min_slab_ratio -rw-r--r-- 1 root root 0 Oct 16 04:21 min_unmapped_ratio -rw-r--r-- 1 root root 0 Oct 16 04:21 mmap_min_addr -rw-r--r-- 1 root root 0 Oct 16 04:21 nr_hugepages -r--r--r-- 1 root root 0 Oct 16 04:21 nr_pdflush_threads -rw-r--r-- 1 root root 0 Oct 16 04:21 overcommit_memory -rw-r--r-- 1 root root 0 Oct 16 04:21 overcommit_ratio -rw-r--r-- 1 root root 0 Oct 16 04:21 pagecache -rw-r--r-- 1 root root 0 Oct 16 04:21 page-cluster -rw-r--r-- 1 root root 0 Oct 16 04:21 panic_on_oom -rw-r--r-- 1 root root 0 Oct 16 04:21 percpu_pagelist_fraction -rw-r--r-- 1 root root 0 Oct 16 04:21 swappiness -rw-r--r-- 1 root root 0 Oct 16 04:21 swap_token_timeout -rw-r--r-- 1 root root 0 Oct 16 04:21 vfs_cache_pressure -rw-r--r-- 1 root root 0 Oct 16 04:21 zone_reclaim_mode
pdflush
键入以下命令来查看 pdflush 的当前唤醒时间:
# sysctl vm.dirty_background_ratio
示例输出:
sysctl vm.dirty_background_ratio = 10
vm.dirty_background_ratio 包含 10,这是系统总内存的百分比,即 pdflush 后台写回守护程序开始写出脏数据的页面数。但是,对于基于快速 RAID 的磁盘系统,这可能会导致大量脏内存页面刷新。如果将此值从 10 增加到 20(较大的值),将导致刷新频率降低:
# sysctl -w vm.dirty_background_ratio=20
交换性
键入以下命令来查看当前默认值:
# sysctl vm.swappiness
示例输出:
vm.swappiness = 60
值 60 定义将内存页面交换到磁盘的积极程度。如果您不想交换,请降低此值。但是,如果您的系统进程长时间处于休眠状态,则可以通过增加此值来获得积极的交换行为。例如,您可以通过增加或减少该值来更改交换行为:
# sysctl -w vm.swappiness=100
脏值
键入以下命令:
# sysctl vm.dirty_ratio
示例输出:
vm.dirty_ratio = 40
值 40 是系统总内存的百分比,即生成磁盘写入的进程本身开始写出脏数据的页面数。这只不过是应用程序磁盘写入创建的脏页被刷新到磁盘的比率。值 40 表示数据将写入系统内存,直到文件系统缓存的大小达到服务器 RAM 的 40%。因此,如果您有 12GB RAM,数据将写入系统内存,直到文件系统缓存的大小达到 4.8G。您可以按如下方式更改脏页比率:
# sysctl -w vm.dirty_ratio=25
永久更改虚拟机
您需要将设置添加到 /etc/sysctl.conf。请参阅我们之前的常见问题解答,永久更改 /proc 文件系统。
参考:
- /proc 文件系统
- 手册页 sysctl