这篇文章上次修改于 899 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
1 内存性能指标
系统内存指标
- 应用内存
- 剩余内存
- 可用内存:新进程可以使用的最大内存,包括了剩余内存和可回收缓存。
- 共享内存:通过 tmpfs 实现。
- 缓存/缓冲区:缓存包括对文件页的缓存和 Slab 分配器中的可回收内存。缓冲区是原始磁盘块的临时存储。
缺页异常
- 主缺页异常:需要磁盘 I/O 介入(比如 Swap)。
- 次缺页异常:可直接从物理内存中分配。
进程内存指标
- 虚拟内存(VSS):包括了代码段,数据段,共享内存,已经申请的堆和已经换出的内存。
- 常驻内存(RSS):进程实际使用的物理内存,不包括共享内存和 Swap。
- 共享内存:包括与其它进程共用的共享内存,动态库和代码段等。
- SWAP 内存:通过 Swap 缓存到磁盘的内存。
- 缺页异常:包括主缺页异常和次缺页异常。
SWAP
- 已用空间
- 剩余空间
- 换入速度
- 换出速度
2 内存性能工具
2.1 根据工具查指标
2.1.1 free, /proc/meminfo
系统已用、可用、剩余内存,缓存和缓冲区的使用量。
$ free
total used free shared buff/cache available
Mem: 8169348 263524 6875352 668 1030472 7611064
Swap: 0 0 0
2.1.2 vmstat
系统剩余内存、缓存、缓冲区、换入、换出。
# 每隔1秒输出1组数据
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 7743608 1112 92168 0 0 0 0 52 152 0 1 100 0 0
0 0 0 7743608 1112 92168 0 0 0 0 36 92 0 0 100 0 0
2.1.3 sar
系统内存换页情况、内存使用率、缓存和缓冲区使用量及 Swap 使用情况。
# 间隔1秒输出一组数据
# -r表示显示内存使用情况,-S表示显示Swap使用情况
$ sar -r -S 1
04:39:56 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
04:39:57 6249676 6839824 1919632 23.50 740512 67316 1691736 10.22 815156 841868 4
04:39:56 kbswpfree kbswpused %swpused kbswpcad %swpcad
04:39:57 8388604 0 0.00 0 0.00
04:39:57 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
04:39:58 6184472 6807064 1984836 24.30 772768 67380 1691736 10.22 847932 874224 20
04:39:57 kbswpfree kbswpused %swpused kbswpcad %swpcad
04:39:58 8388604 0 0.00 0 0.00
…
04:44:06 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
04:44:07 152780 6525716 8016528 98.13 6530440 51316 1691736 10.22 867124 6869332 0
04:44:06 kbswpfree kbswpused %swpused kbswpcad %swpcad
04:44:07 8384508 4096 0.05 52 1.27
2.1.3 top, ps
进程虚拟内存,常驻,共享内存和缺页异常。
$ top
top - 19:05:19 up 186 days, 23:06, 1 user, load average: 0.02, 0.18, 0.13
Tasks: 105 total, 1 running, 104 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1882020 total, 127000 free, 683948 used, 1071072 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1013712 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 191192 3808 2288 S 0.0 0.2 13:31.74 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:06.55 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 5:15.94 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 191192 3808 ? Ss 4月03 13:31 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 4月03 0:06 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 4月03 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 4月03 5:15 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 4月03 0:00 [migration/0]
root 8 0.0
2.1.4 cachestat
系统缓存和缓冲区命中率。
$ cachestat 1 3
TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
2 0 2 1 17 279
2 0 2 1 17 279
2 0 2 1 17 279
2.1.5 cachetop
进程缓存和缓冲区命中率。
$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
13029 root python 1 0 0 100.0% 0.0%
2.1.6 其它
pmap:进程地址空间和内存使用情况。
valgrind:进程内存错误检查工具。
memleak:内存泄露检查工具。
pcstat:查看指定文件的缓存情况。
2.2 根据性能指标查工具
系统已用,可用,剩余内存:free,vmstat,sar、/proc/meminfo
进程虚拟内存、常驻、共享内存:top、ps
进程内存分布:pmap
进程 Swap 换出内存:top、/proc/pid/status
进程缺页异常:ps、top
系统换页情况:sar
缓存、缓冲区使用量:free、vmstat、sar、cachestat
缓存/缓冲区命中率:cachetop
SWAP 已用空间和剩余空间:free、sar
内存泄露检测:memleak、valgrind
指定文件的缓存大小:pcstat
3 如何迅速分析内存的性能瓶颈
- 先用 free 和 top 查看系统整体内存的使用情况
- 再用 vmstat 和 pidstat 观察一段时间趋势,判断内存问题类型。
- 进行详细分析,如内存分配分析,缓存/缓冲区分析,具体进程的内存使用分析等。
参考
倪朋飞. Linux 性能优化实战.
没有评论