原文内容来自于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. MySQL 库、表、记录、相关操作(3)

    MySQL 库.表.记录.相关操作(3) 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[, ..., 字段n])] values (数 ...

  2. pycharm启动vue项目

    一 移动vue项目问题 1 移植到其他windows or mac 2 重新安装依赖 基于情况2(我们把除了第一个文件都复制到一个新的文件夹) 重新依据配置文件去安装各种各样的依赖(也就是根据配置文件 ...

  3. 一张图讲解单机FastDFS图片服务器安装步骤(修订版)

    前面已经讲 一张图秒懂微服务的网络架构,通过此文章可以了解FastDFS组件中单机安装流程. 单机版架构图 以下为单机FastDFS安装步骤 一.环境准备 CentOS 7.X libfastcomm ...

  4. C语言l博客作业05

    问题 回答 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9830 我在这 ...

  5. Vue.js 控制css样式

    <script src="https://unpkg.com/vue/dist/vue.js"></script> <style type=" ...

  6. Android 子线程更新UI 异常

    众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runna ...

  7. 常用tab选项卡代码

    <div class="box"> <ul> <li class="one">课程介绍</li> <li& ...

  8. DS1302时钟芯片驱动程序

    /***************************************************************************** FileName : DS1302.c F ...

  9. 集合<class'set'>

    >>> s = {1,2,3,4} >>> s&{1,3}{1, 3}>>> s|{11}{1, 2, 3, 4, 11}>> ...

  10. python sympy evalf()函数

    SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁.易于理解和扩展.它完全由Python写成,不依赖于外部库.SymPy支持符号计算.高精度计算.模 ...