内存监控以及优化

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命令等。

二、内存一般分析思路

  1. 先用free和top查看系统的内存使用情况
  2. 用vmstat,sar和pidstat,查看内存变化趋势
  3. 详细分析,内存分配,缓存/缓冲区,swap ,具体进程内存使用,内存泄漏。

三、内存优化思路

  1.  ​​​​​禁用swap,减少内存回收时swap的使用
  2. 减少内存动态分配,可以使用内存池,大页等
  3. 尽量使用缓存和缓冲区来访问数据。可以使用堆栈明确声明内存空间,来存储需要缓存的数据;使用radis优化数据访问
  4. 使用cgroup等限制进程的内存使用情况,确保系统内存不会被异常进程耗尽
  5. 通过/proc/pid/oom_adj,调整核心应用的oom_socre,不会被OOM

参考链接

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0


以上是关于内存监控以及优化的主要内容,如果未能解决你的问题,请参考以下文章

Android内存优化三:内存泄漏检测与监控

JVM-优化

Redis实战专题「性能监控系列」全方位探索Redis的性能监控以及优化指南

Redis实战专题「性能监控系列」全方位探索Redis的性能监控以及优化指南

评估监控性能定位和优化 磁盘 IO 和 网络 IO

互联网级监控平台之内存存储的设计和优化