2-PageCachechan产生释放及优化( 五 )


其中 min、low、high 分别对应上图中的三个内存水位 。你可以观察一下调整前后 min、low、high 的变化 。需要提醒你的是,内存水位是针对每个内存 zone 进行设置的,所以/proc/ 里面会有很多 zone 以及它们的内存水位,你可以不用去关注这些细节 。
系统中脏页过多引起 load 飙高
直接回收过程中,如果存在较多脏页就可能涉及在回收过程中进行回写,这可能会造成非常大的延迟,而且因为这个过程本身是阻塞式的,所以又可能进一步导致系统中处于D 状态的进程数增多,最终的表现就是系统的 load 值很高
(D: 不接受任何异步信号的休眠状态 。通常是在处理一些不可中断的任务)
脏页引起系统 load 值飙高的问题场景图
系统中既有快速 I/O 设备,又有慢速 I/O 设备(比如图中的 ceph RBD 设备,或者其他慢速存储设备比如 HDD),直接内存回收过程中遇到了正在往慢速 I/O 设备回写的 page,就可能导致非常大的延迟
解决方案是控制好系统中积压的脏页数据 。很多人知道需要控制脏页,但是往往并不清楚如何来控制好这个度,脏页控制的少了可能会影响系统整体的效率,脏页控制的多了还是会触发问题,所以我们接下来看下如何来衡量好 这个“度”
脏页注解:
不能直接修改硬盘上的数据,而是先将数据从硬盘读入到内存的data cache,然后在内存中修改(被修改过的页称为脏数据页),最后再从内存回写到硬盘 。下述进程都可能将脏页回写到硬盘
首先你可以通过 sar -r 来观察系统中的脏页个数:
$ sar -r 107:30:01 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %com09:20:01 PM 5681588 2137312 27.34 0 1807432 193016 209:30:01 PM 5677564 2141336 27.39 0 1807500 204084 209:40:01 PM 5679516 2139384 27.36 0 1807508 196696 209:50:01 PM 5679548 2139352 27.36 0 1807516 196624 2
就是系统中的脏页大小,它同样也是对 /proc/ 中的解析 。你可以 通过调小如下设置来将系统脏页个数控制在一个合理范围:
vm.dirty_background_bytes = 0vm.dirty_background_ratio = 10vm.dirty_bytes = 0vm.dirty_expire_centisecs = 3000vm.dirty_ratio = 20
调整这些配置项有利有弊,调大这些值会导致脏页的积压,但是同时也可能减少了 I/O 的次数,从而提升单次刷盘的效率;调小这些值可以减少脏页的积压,但是同时也增加了I/O 的次数,降低了 I/O 的效率
至于这些值调整大多少比较合适,也是因系统和业务的不同而异,我的建议也是一边调整一边观察,将这些值调整到业务可以容忍的程度就可以了,即在调整后需要观察业务的服务质量 (SLA),要确保 SLA 在可接受范围内 。调整的效果你可以通过 /proc/ 来查看:
$ grep "nr_dirty_" /proc/vmstatnr_dirty_threshold 366998nr_dirty_background_threshold 183275
系统 NUMA 策略配置不当引起的 load 飙高
系统中还有一半左右的 free 内存,但还是频频触发,导致业务抖动得比较厉害 。后来经过排查发现是由于设置了,这是 NUMA 策略的一种
置的目的是为了增加业务的 NUMA 亲和性,但是在实际生产环境中很少会有对 NUMA 特别敏感的业务,这也是为什么内核将该配置从默认配置 1 修改为了默认配置 0
配置为 0 之后,就避免了在其他 node 有空闲内存时,不去使用这些空闲内存而是去回收当前 node 的 Page Cache
我们可以通过来查看服务器的 NUMA 信息,如下是两个 node 的服务器:
$ numactl --hardwareavailable: 2 nodes (0-1)node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29 30 31 32 33 34 35node 0 size: 130950 MBnode 0 free: 108256 MBnode 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 36 37 38 39 40 41 42 43 44 45node 1 size: 131072 MBnode 1 free: 122995 MBnode distances:node 0 10: 10 211: 21 10