内存实用工具
vmstat
[root@localhost ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 15889156 2104 140192 0 0 248 21 128 335 1 2 96 1 0
0 0 0 15889032 2104 140196 0 0 0 0 204 238 1 1 99 0 0
0 0 0 15888868 2104 140196 0 0 0 0 270 292 1 2 97 0 0
1 0 0 15888668 2104 140200 0 0 0 0 353 365 1 4 95 0 0
1 0 0 15888640 2104 140204 0 0 0 17 242 260 1 2 98 0 0
1 0 0 15889100 2104 140204 0 0 0 4 253 261 1 2 97 0 0
0 0 0 15888564 2104 140212 0 0 0 0 383 375 2 4 95 0 0
1 0 0 15888472 2104 140212 0 0 0 65 259 285 1 2 98 0 0
1 0 0 15888536 2104 140212 0 0 0 0 263 293 1 2 97 0 0
1 0 0 15888364 2104 140220 0 0 0 17 441 430 2 5 93 0 0
r 表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈了。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,进程阻塞。
swpd 虚拟内存已使用的大小。
free 空闲的物理内存的大小。
buff Linux/Unix 系统是用来做存储缓存的。
cache cache直接用来记忆我们打开的文件,给文件做缓冲,Linux/Unix 会把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte。
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。
sar
内存和交换空间监控
[root@localhost ~]# sar -r 10 3

# 输出项说明:
kbmemfree:这个值和 free 命令中的 free 值基本一致,所以它不包括 buffer 和 cache 的空间.
kbmemused:这个值和 free 命令中的 used 值基本一致,所以它包括 buffer 和 cache 的空间.
%memused: 这个值是 kbmemused 和内存总量(不包括swap)的一个百分比.
kbbuffers:这个值是 free 命令中的 buffer
kbcached: 这个值是 free 命令中的 cache.
kbcommit: 保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit: 这个值是kbcommit与内存总量(包括swap)的一个百分比.
内存分页监控
[root@localhost ~]# sar -B 10 3

# 输出项说明:
pgpgin/s: 表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s: 每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s: 每秒钟产生的主缺页数.
pgfree/s: 每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff: 每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
cachestat
# github: https://github.com/brendangregg/perf-tools
cd /usr/local/sbin/
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/fs/cachestat
chmod +x cachestat
cd
[root@localhost ~]# cachestat

# 输出项说明
HITS: 缓存命中次数;
MISSES: 缓存未命中次数;
DIRTIES: 加入缓存脏页数;
RATIO: 缓存命中率;
BUFFERS_MB: 表示 Buffers 的大小,以 MB 为单位;
CACHED_MB: 表示 Cache 的大小,以 MB 为单位。
memleak
yum install kernel-devel-$(uname -r)
yum update kernel
# 需要重启,两个内核版本需要一样
yum install -y bcc-tools
[root@localhost ~]# memleak -p 9037 -a # -p 后面跟 pid

valgrind
yum install valgrind -y

浙公网安备 33010602011771号