内存监控以及优化
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存监控以及优化相关的知识,希望对你有一定的参考价值。
目录
一、内存分析常用命令
1、vmstat
vmstat报告有关进程、内存、分页、块IO、陷阱、磁盘和cpu活动的信息。
//每隔1秒打印一次
root@ubuntu:/# 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 2584 249888 67824 2101164 0 0 184 54 69 126 1 1 98 1 0
0 0 2584 249888 67824 2101164 0 0 0 0 122 277 1 1 99 0 0
0 0 2584 249888 67824 2101164 0 0 0 0 111 186 1 1 98 1 0
0 0 2584 249888 67824 2101164 0 0 0 0 102 169 0 0 99 0 0
0 0 2584 249888 67824 2101164 0 0 0 0 108 176 0 1 99 0 0
0 0 2584 249888 67824 2101164 0 0 0 0 124 209 1 0 99 0 0
0 0 2584 249888 67824 2101164 0 0 0 0 116 197 1 0 99 1 0
0 0 2584 249888 67824 2101164 0 0 0 0 124 188 0 0 100 0 0
2 0 2584 249888 67824 2101164 0 0 0 0 166 369 1 1 99 0 0
0 0 2584 249872 67824 2101164 0 0 0 0 169 294 1 0 99 0 0
2、sar
这条命令非常强大,全面的分析系统性能 包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存的使用情况、进行活动以及IPC有关的活动等
//-r -S 2 查看内存
root@ubuntu:/# sar -r -S 2
Linux 5.13.0-52-generic (ubuntu) 08/08/2022 _x86_64_ (2 CPU)
12:37:12 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
12:37:14 AM 249944 2124768 1462900 36.73 67824 1989504 4084092 67.18 986588 1929716 0
12:37:12 AM kbswpfree kbswpused %swpused kbswpcad %swpcad
12:37:14 AM 2094564 2584 0.12 32 1.24
12:37:14 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
12:37:16 AM 249944 2124768 1462900 36.73 67824 1989504 4084092 67.18 986588 1929716 0
12:37:14 AM kbswpfree kbswpused %swpused kbswpcad %swpcad
12:37:16 AM 2094564 2584 0.12 32 1.24
12:37:16 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
12:37:18 AM 250072 2124896 1462772 36.73 67824 1989504 4084092 67.18 986588 1929716 0
12:37:16 AM kbswpfree kbswpused %swpused kbswpcad %swpcad
12:37:18 AM 2094564 2584 0.12 32 1.24
^X^C
Average: kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
Average: 249987 2124811 1462857 36.73 67824 1989504 4084092 67.18 986588 1929716 0
Average: kbswpfree kbswpused %swpused kbswpcad %swpcad
Average: 2094564 2584 0.12 32 1.24
参数,
-r Report memory utilization statistics.//查看内存使用情况
-S Report swap space utilization statistics//swap使用
-n keyword[,...] | ALL //网络
Report network statistics.
Possible keywords are DEV, EDEV, FC, ICMP, EICMP, ICMP6, EICMP6, IP, EIP, IP6, EIP6, NFS, NFSD, SOCK,
SOCK6, SOFT, TCP, ETCP, UDP and UDP6.
-d Report activity for each block device.//device设备
-b Report I/O and transfer rate statistics//I/O设备
3、pidstat
The pidstat command is used for monitoring individual tasks currently being managed by the Linux kernel
//2秒打印一次,10个周期
root@wy-virtual-machine:~# pidstat 2 10
Linux 5.15.0-43-generic (wy-virtual-machine) 2022年08月08日 _x86_64_ (2 CPU)
20时52分23秒 UID PID %usr %system %guest %wait %CPU CPU Command
20时52分25秒 0 14 0.50 0.00 0.00 0.00 0.50 0 rcu_sched
20时52分25秒 108 792 0.00 0.50 0.00 0.00 0.50 0 systemd-oomd
20时52分25秒 0 811 0.50 0.00 0.00 0.00 0.50 0 vmtoolsd
20时52分25秒 0 956 0.00 0.50 0.00 0.00 0.50 1 containerd
20时52分25秒 1000 2357 0.00 1.00 0.00 0.50 1.00 1 gnome-shell
20时52分25秒 1000 2547 0.00 0.50 0.00 0.00 0.50 0 ibus-daemon
20时52分25秒 1000 2565 0.50 0.00 0.00 0.00 0.50 0 vmtoolsd
20时52分25秒 0 3268 0.00 0.50 0.00 0.00 0.50 0 kworker/0:1-events
20时52分25秒 0 3273 0.00 0.50 0.00 0.00 0.50 0 pidstat
20时52分25秒 UID PID %usr %system %guest %wait %CPU CPU Command
20时52分27秒 0 413 0.00 0.50 0.00 0.00 0.50 0 irq/16-vmwgfx
20时52分27秒 0 811 0.00 0.50 0.00 0.00 0.50 1 vmtoolsd
20时52分27秒 0 854 0.00 0.50 0.00 0.00 0.50 1 irqbalance
20时52分27秒 1000 2897 0.50 0.00 0.00 0.50 0.50 1 gnome-terminal-
20时52分27秒 0 3268 0.00 0.50 0.00 0.00 0.50 0 kworker/0:1-events
20时52分27秒 0 3273 0.00 0.50 0.00 0.00 0.50 0 pidstat
4、memleak
内存检测工具
memleak跟踪并匹配内存分配和释放请求,并为每次分配收集调用堆栈。然后,memleak可以打印一份摘要,说明哪些调用堆栈执行了随后未释放的分配。
EXAMPLES:
./memleak -p $(pidof allocs)
Trace allocations and display a summary of "leaked" (outstanding)
allocations every 5 seconds
./memleak -p $(pidof allocs) -t
Trace allocations and display each individual allocator function call
./memleak -ap $(pidof allocs) 10
Trace allocations and display allocated addresses, sizes, and stacks
every 10 seconds for outstanding allocations
./memleak -c "./allocs"
Run the specified command and trace its allocations
./memleak
Trace allocations in kernel mode and display a summary of outstanding
allocations every 5 seconds
./memleak -o 60000
Trace allocations in kernel mode and display a summary of outstanding
allocations that are at least one minute (60 seconds) old
./memleak -s 5
Trace roughly every 5th allocation, to reduce overhead
5,bcc相关的命令
cachestat :这将跟踪四个内核函数并每秒打印摘要。这对于一般的工作负载特性描述和查找操作使用随时间变化的模式非常有用。
cachetop :查看缓存读写命中
root@ubuntu:/# cachestat
HITS MISSES DIRTIES HITRATIO BUFFERS_MB CACHED_MB
0 0 0 0.00% 67 1946
1 0 0 100.00% 67 1946
0 0 0 0.00% 67 1946
root@ubuntu:/#cachetop
00:51:54 Buffers MB: 67 / Cached MB: 1946 / Sort: HITS / Order: descending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
5905 root ls 612 0 0 100.0% 0.0%
5905 root bash 181 0 0 100.0% 0.0%
1895 wy gsd-housekeepin 4 0 0 100.0% 0.0%
5902 root cachetop 4 0 0 100.0% 0.0%
754 root vmtoolsd 1 0 0 100.0% 0.0%
还有常见的 free top命令等。
二、内存一般分析思路
- 先用free和top查看系统的内存使用情况
- 用vmstat,sar和pidstat,查看内存变化趋势
- 详细分析,内存分配,缓存/缓冲区,swap ,具体进程内存使用,内存泄漏。
三、内存优化思路
- 禁用swap,减少内存回收时swap的使用
- 减少内存动态分配,可以使用内存池,大页等
- 尽量使用缓存和缓冲区来访问数据。可以使用堆栈明确声明内存空间,来存储需要缓存的数据;使用radis优化数据访问
- 使用cgroup等限制进程的内存使用情况,确保系统内存不会被异常进程耗尽
- 通过/proc/pid/oom_adj,调整核心应用的oom_socre,不会被OOM
参考链接
https://course.0voice.com/v1/course/intro?courseId=2&agentId=0
以上是关于内存监控以及优化的主要内容,如果未能解决你的问题,请参考以下文章
Redis实战专题「性能监控系列」全方位探索Redis的性能监控以及优化指南