查看哪个进程占用buffer cache 多

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查看哪个进程占用buffer cache 多相关的知识,希望对你有一定的参考价值。

1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而 Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。
Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。

2. Buffer:缓冲区,用于存储速度不同步的设备或优先级不同的设备之间传输数据;通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时,存储慢的数据先把数据存放到buffer,达到一定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU可以干其他的事情。
Buffer:一般是用在写入磁盘的,例如:某个进程要求多个字段被读入,当所有要求的字段被读入之前已经读入的字段会先放到buffer中。
参考技术A 24677460KB(缺省时free的单位为KB)物理内存,即FO[2][1];
在这些物理内存中有23276064KB(即FO[2][2])被使用了;
还用1401396KB(即FO[2][3])是可用的;
这里得到第一个等式:

FO[2][1] = FO[2][2] + FO[2][3]
FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。

FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS cache的内存。在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:

A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.
也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么FO[2][6](cached memory)比较大,而FO[2][3]比较小的原因。

第二行的输出是从一个应用程序的角度看系统内存的使用情况。

对于FO[3][2],即FO[2][2]-buffers/cache,表示一个应用程序认为系统被用掉多少内存;
对于FO[3][3],即FO[2][3]+buffers/cache,表示一个应用程序认为系统还有多少内存;
因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。

这里还用两个等式:

FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]本回答被提问者采纳

io性能freeps查看网络状态linux下抓包

一:监控io性能

iostat -x 磁盘使用
技术分享图片
最后一列表示为磁盘占用的时间比
iotop 磁盘使用
技术分享图片

二:free命令

技术分享图片
从左到右依次为,总共的大小,使用的大小,剩余大小
available=free+buffers/cached的剩余部分
total=userd+free+buffers/cached

三:ps命令

查看系统进程 ps aux或者ps -elf
技术分享图片
PID:进程的ID
STAT:表示进程的状态,分为以下几种
D 不能中断的进程(通常为IO)
R 正在运行中的进程
S 已经中断的进程,通常情况下,大部分都是这个状态
T 已经停止或者暂停的进程
W 表示没有足够的内存页分配
X 已经死掉的进程(好像从未出现)
Z 僵尸进程,杀不掉,打不死的垃圾进程,一般不出现
< 高优先级进程
N 低优先级进程
L 在内存中被锁了内存分页
s 主进程
I 多线程进程

  • 代表在前台运行的进程
    通常会跟管道符一起使用,用来查看某个进程或者他的数量
    ps aux|grep -c 进程名
    所得结果减1为进程数量,因为grep本身也是一个进程。

    四:查看网络状态

    用来打印网络连接状况、系统所开放端口,路由表等信息。
    常用命令:netstat -lnp 打印当前系统启动哪些端口
    技术分享图片
    netstat -an 打印网络连接状况
    技术分享图片

    小技巧:
    netstat -an |awk ‘/^tcp/ {++sta[$NF]} END {for(key in sta) print key," ",sta[key]}‘
    技术分享图片
    统计所有状态的进程的数量
    重点关注established的数量

    五:linux下抓包

    ● tcpdump
    安装 yum install -y tcpdump
    抓数据包
    tcpdump -nn -i eth0
    技术分享图片
    第三列和第四列显示为哪一个IP+端口连接在哪个IP+端口,后面的信息是该数据包的相关信息
    -i 后面跟设备名称
    -nn 让第三列和第四列显示成IP和端口的形式,不加则显示为主机名+服务名称
    技术分享图片
    -c 指定包数量
    -w 写入指定文件,如果不加,则显示为数据流向,不是数据包
    host 指定ip
    port 指定端口
    tcpdump -nn -i eth0 host 192.168.233.130 and port 22 -c 100 -w 1.cap
    查看1.cap可以用 tcpdump -r 1.cap
    也可以下载到windows用wireshark查看。
    ● wireshark
    安装 yum install -y wireshark
    用法 tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
    这类似web访问日志。

以上是关于查看哪个进程占用buffer cache 多的主要内容,如果未能解决你的问题,请参考以下文章

Linux [buff/cache]内存缓存占用过高分析和优化

linux 查看占用内存

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

windows查看文件被哪个进程占用

centos系统内存 buff/cache 占用过高

io性能freeps查看网络状态linux下抓包