一、前言
在日常使用过程中,我们使用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文章来源:https://www.toymoban.com/news/detail-821937.html |
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://www.toymoban.com/news/detail-821937.html |
到了这里,关于LINUX中内存缓存占比优化参考的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!