Linux查看哪些进程占⽤的系统buffercache较⾼
(hcache,lsof)命令
本篇主要说明以下问题:
1、服务器 buffer/cache 的产⽣原因和释放buffer/cache 的两种⽅式(⾃动 & ⼿动)
2、⽣产环境遇到服务 buffer/cache 过⾼如何排查是由那⼏个进程引起的(hcache ,lsof 的使⽤⽅式)
服务器 buffer/cache 的产⽣原因和释放buffer/cache 的两种⽅式(⾃动 & ⼿动)
1、什么是buffer/cache ?
buffer/cache 其实是作为服务器系统的⽂件数据缓存使⽤的,尤其是针对进程对⽂件存在 read/write 操作的时候,所以当你的服务进程在对⽂件进⾏读写的时候,Linux内核为了提⾼服务的读写速度,则将会把⽂件放在此处的 buffer/cache 中进⾏缓存使⽤,由于 Linux服务的特点便是任何事物都会以⽂件的形式进⾏存在,所以你会发现不管你是否对⽂件做了⼤规模的读写,机器的 buffer/cache 是⼀直都存在的,并且持续的增⾼不下,这是因为服务器所产⽣的⽹络连接也好,⽤户协议的(UDP)套接字也好,这部分的数据系统都会为应⽤程序创建对应的⽂件描述符,⽽这些⽂件描述符的使⽤,则⼜都会重新进⼊ buffer/cache 中做读写使⽤,所以这也是你的机器始终都会存在较⾼
buffer/cache 的原因,(因为所有的⽂件读写都会⽤到 buffer/cache,在内存合理的情况下)
2、buffer/cache 需要注意的⼀些特点
在服务内存够⽤的情况下,Linux内核为了加快对⽂件的读写效率会将⽂件放⼊之 buffer/cache 中以保证读写效率,但其实,尽管当你的应⽤程序对⽂件的读写运⾏结束后,buffer/cache 也不会⾃动释放该部分内存,⽽是作为缓冲进⾏保留,等到你的服务进程在下⼀次进⾏相同⽂件的读写时就可以直接使⽤,省去了各种重新进⾏内存初始化的操作;所以这将会导致,当你的应⽤进程频繁对不同的⽂件进⾏读写时,你会发现服务所可以直接使⽤的free内存将会越来越少的⼀个重要原因;难道 buffer/cache 在这样⽆休⽌的缓存当中就不会⾃动释
放?当然不是,当服务器在内存压⼒较⼤的情况下时,则将会⾃动进⾏内存的回收,作为free空间分给其它进程使⽤,这其中主要回收的⼀个内存则是 buffer/cache 的缓冲区内存块;
3、如何进⾏⼿动 buffer/cache 回收?
除了在系统进程内存使⽤较⼤压⼒的情况下进⾏内存的回收外,我们也可以进⾏⼿动的buffer/cache回收,但由于buffer/cache主要是⽤于⽂件的读写使⽤,所以进⾏⽂件回收时,⼀般常伴随系统的IO彪⾼,因为系统内核也对⽐cache中的数据与硬盘中的数据是否⼀致,如果不⼀致需要写会,然后才能进⾏内存的回收;
将内存中数据强制先刷新到磁盘中
sync;
清理Buffer缓存区域
echo 3 > /proc/sys/vm/drop_caches 表⽰清除pagecache和slab分配器中的缓存对象
echo 1 > /proc/sys/vm/drop_caches:表⽰清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表⽰清除回收slab分配器中的对象(包括⽬录项缓存和inode缓存)。slab分配器是内核中管理内存的⼀种机制,其中很多缓存数据实现都是⽤的pagecache。
关于buffer/cache 的相关描述,具体也可以参考如下链接:
linux内核文件放在哪⽣产环境遇到服务 buffer/cache 过⾼如何排查是由那⼏个进程引起的(hcache 的使⽤⽅式)
1、hcache的下载地址
hcache的github地址:
hcache的下载地址:
2、 hcache的使⽤⽅式
当前下载完对应的hcache后,则直接是⼀个对应的 bin⽂件,此时直接将对应的bin⽂件进⾏ chmod 授权后即可使⽤
将该bin⽂件设置为可执⾏⽂件
chmod 755 hcache
将该hcache移动到usr的bin⽬录中,使其可以被全局调⽤该命令
mv hcache /usr/local/bin/
3、hcache常⽤命令
全局显⽰10个最⼤的被缓存⽂件
hcache --top 10
| Name | Size (bytes) | Pages | Cached | Percent |
|-----------------------------------------------------------------------------------+----------------+-
| /app/java/jdk1.8.0_92/jre/lib/amd64/server/libjvm.so | 41943040 | 10240 | 8682 | 084.785 |
| libmergedlo.so | 101021431 | 24664 | 5858 | 023.751 |
| dockerd-current | 33398384 | 8154 | 3425 | 042.004 |
| libjvm.so | 16938578 | 4136 | 2429 | 058.728 |
| libjvm.so | 13363349 | 3263 | 1696 | 051.977 |
| docker-containerd-current | 10807760 | 2639 | 1171 | 044.373 |
查看指定进程ID所使⽤的buffer/cache 的使⽤情况
hcache -pid 16322
通过上述所获取到的被缓存最⼤的⽂件名称后,可以直接通过 lsof file_name 得到当前所开启该⽂件的所有进程信息;显⽰使⽤ kbase-psrt.jar 的进程信息
[root@xiaoi-3614 ~]# lsof /app/kbase-psrt-wscc/kbase-psrt.jar
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 6048 root mem REG 8,2 59936357 137027366 /app/kbase-psrt-wscc/kbase-psrt.jar
java 6048 root 5r REG 8,2 59936357 137027366 /app/kbase-psrt-wscc/kbase-psrt.jar
java 6048 root 6r REG 8,2 59936357 137027366 /app/kbase-psrt-wscc/kbase-psrt.jar
java 6050 root mem REG 8,2 59936357 137027366 /app/kbase-psrt-wscc/kbase-psrt.jar
java 6050 root 5r REG 8,2 59936357 137027366 /app/kbase-psrt-wscc/kbase-psrt.jar
java 6050 root 6r REG 8,2 59936357 137027366 /app/kbase-psrt-wscc/kbase-psrt.jar
获取当前进程号所打开的所有⽂件信息
[root@xiaoi-3614 ~]# lsof -p 6048
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 6048 root cwd DIR 8,2 4096 136958862 /app/kbase-psrt-wscc
java 6048 root rtd DIR 8,2 4096 128 /
java 6048 root txt REG 8,2 7734 202909666 /app/java/jdk1.8.0_92/bin/java
java 6048 root mem REG 8,2 88776 203501791 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
java 6048 root mem REG 8,2 256702 135314838 /app/java/jdk1.8.0_92/jre/lib/amd64/libsunec.so
java 6048 root mem REG 8,2 106075056 2663 /usr/lib/locale/locale-archive
java 6048 root mem REG 8,2 93112 135314912 /app/java/jdk1.8.0_92/jre/lib/amd64/libnio.so
更多关于LSOF的使⽤,可以参考如下链接:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论