Linux服务器内存占用高排查方法

2024-06-17 10:04:50 2229

Linux服务器内存占用高排查方法

蓝队云小课堂:

当Linux服务器内存占用高时,可以按照以下步骤进行排查:

查看内存使用情况

使用free命令可以查看系统的内存使用情况,包括总内存、已用内存、空闲内存等信息。

有时系统内存占用高可能是由缓存和缓冲区所导致的。Linux系统会利用未分配的内存作为缓存和缓冲区,以提高文件访问速度。

# -h 人类可读的格式输出信息
free
-h

# 可能返回
          total       used       free     shared buff/cache   available
内存:       15Gi       1.5Gi       12Gi       46Mi       1.4Gi       13Gi
交换:      2.0Gi         0B       2.0Gi

查看进程内存占用

使用tophtop命令可以查看系统进程的内存占用情况,按照内存使用量排序,找出消耗较大的进程。

htop命令可使用 yum install htop 进行安装

# 命令进入htop的交互界面通过按键组合进行交互
htop

# top命令进入界面,按下大写字母 M 按照内存占用从高到低进行排序
top

# 可能返回
top - 08:16:26 up 15 min,  1 user, load average: 0.00, 0.04, 0.05
Tasks:  
89 total,   1 running,  88 sleeping,   0 stopped,   0 zombie
%Cpu(s):  
0.3 us,  0.7 sy,  0.0 ni, 98.8 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st

PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME
+ COMMAND                                                                                                                                      
2292 root      17  -3 1016716  40844  16904 S   1.3  2.0   0:09.14 YDService                                                                                                                                    
1028 root      20   0  574288  19516   6152 S   0.0  1.0   0:00.23 tuned                                                                                                                                        
1646 root      20   0  987628  19036   5824 S   0.0  0.9   0:00.29 YDLive                                                                                                                                      
1709 root      20   0  622856  14296   3316 S   0.7  0.7   0:05.68 barad_agent                                                                                                                                  
 
681 polkitd   20   0  614324  11116   4684 S   0.0  0.5   0:00.03 polkitd                                                                                                                                      
1027 root      10 -10   61488  10136   8564 S   0.0  0.5   0:00.00 iscsid                                                                                                                                      
1255 root      20   0  218528   9648   2984 S   0.0  0.5   0:00.07 rsyslogd                                                                                                                                    
1708 root      20   0  164896   9496   2080 S   0.0  0.5   0:00.53 barad_agent              

查看系统日志

查看系统日志可以帮助定位内存占用高的原因。

# journalctl命令查看系统日志,过滤关键词(“memory”或“oom”)查找相关日志
journalctl |
grep -i memory

# 内核日志包含有关内存使用情况
grep -i memory /var/log/messages

内存泄漏检测

如果怀疑有内存泄漏,可使用valgrind进行内存泄漏检测。

由于 valgrind 的工作原理,它可能会使程序的运行速度变慢,并且可能会增加程序的内存使用量。因此,通常只在开发和调试阶段使用 valgrind,而不是在生产环境中。

# 对程序 nginx 进行 --leak-check=full 启用完全的内存泄漏检测
valgrind
--leak-check=full nginx

查看共享内存

如果共享内存占用较多,需要进一步检查是哪个进程在使用共享内存。

# 查看命令
cat /proc/meminfo | grep -i shmem

# 返回结果中Shmem表示系统中当前使用的共享内存总量
Shmem:            
49004 kB

查看不可回收的slab内存

查看不可回收的slab内存占用情况,如果这部分内存占用较高,可以使用slabtop命令查看是哪些slab占用大。

# 查看
cat /proc/meminfo | grep -i SUnreclaim

# slabtop 命令用于实时显示内核的“slab”内存缓存信息
slabtop

检查大页内存

查看是否配置了内存大页。如果HugePages_Total输出非0,表示配置了内存大页。需要确认这些大页是业务自身配置还是其它恶意程序配置。

# 查看
cat /proc/meminfo | grep -iE "HugePages_Total|Hugepagesize"

# 可能返回
HugePages_Total:      
0
Hugepagesize:      
2048 kB

检查Swap分区

如果Swap分区使用过多,说明系统已经开始使用磁盘作为内存扩展,这可能会影响性能。

# 命令一
free

# 命令二
swapon
-s

分析内存使用情况

可以使用pmap命令分析特定进程的内存使用情况,或者使用perf命令进行更详细的性能分析。

更多小知识,可联系蓝队云一起探讨。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: