LINUX中内存缓存占比优化参考

发布时间:2024年01月22日

一、前言

? ? 在日常使用过程中,我们使用free查看系统内存使用率情况时,经常可以发现cache被使用的比较大,这种现象其实是linux内核的高速IO处理机制,在RHEL 4,5,6,7操作系统中,页高速缓存是动态调整的, 并没有特定的内核参数可以直接调整其大小;然而,通过调整虚拟内存的一些参数,可以间接影响页告诉缓存的大小。本文主要对影响cache的这些参数进行介绍和优化推荐。

二、参数介绍

通过调整sysctl中的一些参数来控制页高速缓存的大小:

  • vm.vfs_cache_pressure?(默认值 = 100)
    • 默认值vfs_cache_pressure=100,在回收页高速缓存(page cache)和交换缓存(swap cache)时,内核会以"相对公平"的比例回收dentries和inodes。
    • 调整内核更趋向于回收内存中保存的目录项缓存(dentry)和索引节点对象 (inode objects)。
    • 减少vfs_cache_pressure值,会使内核更倾向于保留目录项对象(dentry)以及索引节点缓存(inode caches); 增加vfs_cache_pressure 超过100 会使内核更倾向于释放目录项对象(dentry)以及索引节点缓存(inode caches)。
    • 可以通过增加vfs_cache_pressure的值,来使内核更倾向于释放上述缓存,从而限制页高速缓存(page cache)的大小。
  • vm.dirty_background_ratio?(默认值 = 10)
    • 此参数的值代表脏页占总内存的百分比, 当系统中脏页数量达到此值时,内核线程pdflush开始把脏页数据写入存储。
    • 可以通过减少此值,来使pdflush进程更早把脏页写入存储,从而限制页高速缓存的大小。
  • vm.dirty_ratio?(默认值 = 20)
    • 这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(默认值20%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外部存储);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。
    • 减少此值可使 系统更早来处理内存中的脏页,从而限制页高速缓存的大小。
  • vm.dirty_writeback_centisecs?(Red Hat Enterprise Linux 4 & 5: 默认值 = 499, Red Hat Enterprise Linux 6 and 7: 默认值 = 500)
    • pdflush进程会定时被唤醒,把脏页中的数据写入硬盘。单位是 1/100 秒。缺省数值是500,也就是pdflush进程5秒钟会被唤醒一次。
    • 减少此值可以更频繁的唤醒pdflush进程来处理脏页, 从而限制页高速缓存的大小。
  • vm.dirty_expire_centisecs?(Red Hat Enterprise Linux 4 and 5: 默认值= 2999, Red Hat Enterprise Linux 6 and 7: 默认值 = 3000)
    • 这个参数声明Linux内核写缓冲区里面的数据多“旧”了之后,被唤醒的pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,pdflush进程被唤醒后,将会把“旧”的数据写入磁盘。
    • 减少此值意味着脏页会更快变“旧”,并被pdflush进程写入磁盘,从而限制页高速缓存的大小。
  • vm.swappiness?(RHEL 5 and 6:默认值 = 60, RHEL 7:默认值 = 30)
    • 此参数控制内核是否更趋向于交换非活动内存页页至交换分区(此值越高,代表非活动内存页越可能被交换至交换分区)。
    • 减少此值使内核更倾向于保持非活动内存页在物理内存中,从而释放页高速缓存中的页, 从而限制页高速缓存的大小。

三、场景参考

场景一:Oracle数据库和TT数据库主机

开启hugepage大页,使热数据常驻内存,不占用cache空间

参数

默认值

建议值

vm.dirty_background_bytes

0

vm.dirty_background_ratio

10

3

vm.dirty_bytes

0

vm.dirty_ratio

20

vm.dirty_expire_centisecs

3000

vm.dirty_writeback_centisecs

500

vm.swappiness

30

10

场景二:redis、memcache等菲关系型内存数据库

对cache依赖较大,一般尽量减少数据刷

参数

默认值

建议值

vm.dirty_background_bytes

0

vm.dirty_background_ratio

10

50

vm.dirty_bytes

0

vm.dirty_ratio

20

50

vm.dirty_expire_centisecs

3000

vm.dirty_writeback_centisecs

500

360000

vm.swappiness

30

10

场景三:对数据文件读写频繁的应用

参数

默认值

建议值

vm.dirty_background_bytes

0

vm.dirty_background_ratio

10

50

vm.dirty_bytes

0

vm.dirty_ratio

20

80

vm.dirty_expire_centisecs

3000

vm.dirty_writeback_centisecs

500

vm.swappiness

30

10

场景四:对数据文件读写不频繁的应用

参数

默认值

建议值

vm.dirty_background_bytes

0

vm.dirty_background_ratio

10

5

vm.dirty_bytes

0

vm.dirty_ratio

20

10

vm.dirty_expire_centisecs

3000

vm.dirty_writeback_centisecs

500

vm.swappiness

30

10

场景五:分布式消息中间件

参数

默认值

建议值

vm.dirty_background_bytes

0

vm.dirty_background_ratio

10

50

vm.dirty_bytes

0

vm.dirty_ratio

20

50

vm.dirty_expire_centisecs

3000

vm.dirty_writeback_centisecs

500

360000

vm.swappiness

30

1

文章来源:https://blog.csdn.net/vincent0920/article/details/135739648
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。