原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/9652651a-7449-4e8e-b77e-1c60ea8b7d12

本篇主要说明以下问题:
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 的相关描述,具体也可以参考如下链接:
生产环境遇到服务 buffer/cache 过高如何排查是由那几个进程引起的(hcache 的使用方式)
 
1、hcache的下载地址
      hcache的github地址:https://github.com/silenceshell/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的使用,可以参考如下链接:

Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache,lsof)命令的更多相关文章

  1. linux查看端口进程占用情况

    本文介绍linux如何查看端口被哪个进程占用的方法: 1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 [步骤一]lsof -i ...

  2. linux查看哪个进程占用磁盘IO

    方法一: $ iotop -oP 命令的含义:只显示有I/O行为的进程 测试结果: 方法二: $ pidstat -d 1 命令的含义:展示I/O统计,每秒更新一次 测试结果:

  3. 6.Linux查看哪个进程占用磁盘IO

    $ iotop -oP命令的含义:只显示有I/O行为的进程

  4. Linux下查看哪些进程占用的CPU、内存资源

    1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程 ps auxw|head -1;ps a ...

  5. linux 查看端口被占用

    linux 查看端口被占用 1.lsof  -i : 端口号 用于查看某一端口的占用情况,比如查看8080端口使用情况,lsof  -i:8080 如果执行 lsof  -i:8080 系统提示 :  ...

  6. linux查看内存cpu占用

    linux查看内存cpu占用top 命令  按q退出 可以添加额外选项选择按进程或按用户查看如: top -u gitu PID:进程idPR:进程的优先级别,越小越优先被执行NInice:值VIRT ...

  7. linux下查询进程占用的内存方法总结

    linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种方 ...

  8. Linux查看程序端口占用情况(转载)

    From:http://www.cnblogs.com/benio/archive/2010/09/15/1826728.html 今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占 ...

  9. Linux下如何查看哪个进程占用内存多?

    1.top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者 ...

随机推荐

  1. Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the server requires more time

    启动Tomcat服务器时经常遇到这个错误, Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the ser ...

  2. Spring通过IOC帮我们做火鸡

    一.IOC--setter注入 1.准备dmo 首先准备一只火鸡 public class Turkey { private int id; private String name; public i ...

  3. 使用node.js将xmind导出的excel转换为json树

    xmind文件如图所示, 最终生成的数据结构如图  2,选择导出为excel文件,导出的excel文件打开如图 3,安装node读取excel模块 cnpm i  node-xlsx --save 4 ...

  4. 洛谷 P1920 成功密码 题解

    这是蒟蒻的第一篇题解,(之前的都没过,估计这篇也过不了 回到正题 这题,本蒟蒻第一眼看到以后,就决定咦,这不是模拟吗? 看到世界范围,嗯,打扰了. 扯回正题 首先,暴力肯定是A不了的(至少我A不了 但 ...

  5. GitHub 上值得参考的完整的 iOS-App 源码

    转自:https://www.zhihu.com/question/28518265 作者:wjh2005链接:https://www.zhihu.com/question/28518265/answ ...

  6. 使用 RMI 实现方法的远程调用

    RMI 介绍 RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此 ...

  7. JS基础-事件

    事件机制 事件触发三阶段 事件触发有三个阶段: window 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从事件触发处往 window 传播,遇到注册的冒泡事件会触发 ...

  8. 201871010119-帖佼佼《面向对象程序设计(java)》第十四周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  9. 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)

    链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...

  10. Wonder发布v1.1正式版本,新增资产预览、脚本、AssetBundle等

    更新说明 本次版本重点增加了脚本组件,并且实现了类似于unity的AssetBundle,支持动态加载场景和资源. 相关链接 官网 Wonder官方QQ群: 106047770 相关资料 Wonder ...