Olap router由于historical节点内存换页导致的RT突然飙高问题排查:
https://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system-2.html
一、现象描述
收到上层业务调用超时报警,
二、问题分析
内存的去向主要有3个:1. 进程消耗。 2. slab消耗 3.pagetable消耗。
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
1.分析10:16:01 PM时的内存情况:
1.主缺页(majflt/s)为0,说明没有从磁盘(swap)读数据到内存;
2.pgpgin/s是0,说明没有产生到磁盘或swap空间到内存的输入/输出。
3.最后pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff的输出都是0,说明物理内存够用,而系统没有必要对cache进行清理,以释放空间和对swap扫描以置换空间.
2.分析10:18:01 PM时的内存情况:
pgsteal/s是317/s,说明系统的空闲内存已经无法满足程序对内存的请求,开始回收cache所占用的内存空间给当前程序,同时对swap和物理内存进行扫描,以获得更多的内存。
所以这里pgscank/s涨到93/s,pgscand/s涨到231/s,回收cache和系统需求的比率为97%,说明物理内存已经不能满足需要。
pgfree/s代表已经释放到空闲队列的内存总量.
3.内核参数vm.vfs_cache_pressure讲解
增大这个参数设置了虚拟内存回收directory和inode缓冲的倾向,这个值越大。越易回收
该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。
参考文档:http://blog.itpub.net/23721637/viewspace-1056735/
三、解决方法
对内存的内核参数进行调整,执行命令变更内核参数:
sudo sysctl -w vm.extra_free_kbytes=1024000
sudo sysctl -w vm.vfs_cache_pressure=10000
这个sysctl -w vm.extra_free_kbytes=1024000需要根据业务场景调整大小,我们的Druid historical节点由于数据量大,我们调整到了10240000,才解决问题。意思就是预留10G的空闲内存。调整的依据是根据sar -r命令查看到RT高时,释放了多少内存决定的。
调整前后空闲内存如下图,有所增加。
四、使用说明
这类调整适合数据量特别大,且需要缓存在内存的场景。