原文内容来自于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. 关于ios沙盒

    沙盒下主要有四个文件夹:document,caches,tmp,library document 的路径  程序运行时生成的文件,这个文件不要存比较放大的文件,比如音频,视频类,因为这里的东西会被上传 ...

  2. drf过滤器、分页器、筛选器的应用

    一.drf 提供的过滤器(ordering) views.py from rest_framework.generics import ListAPIView from . import models ...

  3. ASP.NET Core3.X 终端中间件转换为端点路由运行

    引言 前几天.NET Core3.1发布,于是我把公司一个基础通用系统升级了,同时删除了几个基础模块当然这几个基础模块与.NET Core3.1无关,其中包括了支付模块,升级完后静文(同事)问我你把支 ...

  4. js中innerHTML和outerHTML的相同与不同

    innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML,包括标签. outerHTML  设置或获取对象及其内容的HTML形式,也就是标签和文本内容全都显示出来 innerText  ...

  5. 使用IDEA开发Spring入门程序

    使用IDEA开发Spring入门程序 前言 本文通过一个简单的入门程序向读者演示Spring框架的使用过程,具体如下: 一.使用IDEA创建Maven应用项目并导入相应模块 使用IDEA创建一个名为n ...

  6. PyTorch最佳实践,怎样才能写出一手风格优美的代码

    [摘要] PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍PyTorch的最佳实践和代码风格都是怎样的. 虽然这是一个非官方的 PyTorch 指南,但本文总结了一年多使 ...

  7. 2019企业linux运维最需要的了解的一些硬件基础知识

    第3章 服务器    245 3.1 电脑的种类    245 3.2 服务器的介绍    246 3.2.1 服务器的类别    246 3.2.2 服务器的性能    247 3.2.3 服务器的 ...

  8. 28. 实现strStr() (双指针)

    实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...

  9. python学习-def

    # 函数# 实现了某一特定功能.# 可以重复使用. # len() 功能:获取长度.# input() 功能: 控制台输入# print() 功能:输出 # 语法 关键字def"" ...

  10. Websphere 重置admin 控制台密码

    By way of wsadmin command: <WAS_INSTALL_DIR>/bin/> wsadmin -conntype NONE wsadmin> secur ...