【玩转服务器】Linux服务器内存占用高排查方法

2024-03-06 11:18:42 浏览数 (1)

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

查看内存使用情况

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

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

代码语言:bash复制
# -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 进行安装

代码语言:bash复制
# 命令进入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              

查看系统日志

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

代码语言:bash复制
# journalctl命令查看系统日志,过滤关键词(“memory”或“oom”)查找相关日志
journalctl | grep -i memory

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

内存泄漏检测

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

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

代码语言:bash复制
# 对程序 nginx 进行 --leak-check=full 启用完全的内存泄漏检测
valgrind --leak-check=full nginx

查看共享内存

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

代码语言:bash复制
# 查看命令
cat /proc/meminfo | grep -i shmem

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

查看不可回收的slab内存

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

代码语言:bash复制
# 查看
cat /proc/meminfo | grep -i SUnreclaim

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

检查大页内存

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

代码语言:bash复制
# 查看
cat /proc/meminfo | grep -iE "HugePages_Total|Hugepagesize"

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

检查Swap分区

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

代码语言:bash复制
# 命令一
free

# 命令二
swapon -s

分析内存使用情况

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

总结

在实际应用中,某个进程占用内存过高可能问题并非出在程序本身,如 mysql 占用内存过高,则有可能是程序代码中 sql 语句不够优化导致,所以排查要从全局出发,考虑系统整体资源占用情况。

0 人点赞