当Linux服务器内存占用高时,可以按照以下步骤进行排查:
查看内存使用情况
使用free
命令可以查看系统的内存使用情况,包括总内存、已用内存、空闲内存等信息。
代码语言:bash复制有时系统内存占用高可能是由缓存和缓冲区所导致的。Linux系统会利用未分配的内存作为缓存和缓冲区,以提高文件访问速度。
# -h 人类可读的格式输出信息
free -h
# 可能返回
total used free shared buff/cache available
内存: 15Gi 1.5Gi 12Gi 46Mi 1.4Gi 13Gi
交换: 2.0Gi 0B 2.0Gi
查看进程内存占用
使用top
或htop
命令可以查看系统进程的内存占用情况,按照内存使用量排序,找出消耗较大的进程。
代码语言:bash复制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
查看系统日志
查看系统日志可以帮助定位内存占用高的原因。
代码语言:bash复制# journalctl命令查看系统日志,过滤关键词(“memory”或“oom”)查找相关日志
journalctl | grep -i memory
# 内核日志包含有关内存使用情况
grep -i memory /var/log/messages
内存泄漏检测
如果怀疑有内存泄漏,可使用valgrind
进行内存泄漏检测。
代码语言:bash复制由于 valgrind 的工作原理,它可能会使程序的运行速度变慢,并且可能会增加程序的内存使用量。因此,通常只在开发和调试阶段使用 valgrind,而不是在生产环境中。
# 对程序 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 语句不够优化导致,所以排查要从全局出发,考虑系统整体资源占用情况。