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小时内删除。