Linux如何排查内存占用过高进程

Linux如何排查内存占用过高进程

数据派

聚焦技术和人文,分享干货,共同成长。

Linux如何排查内存占用过高进程

在 Linux 系统中,排查内存占用过高的进程需要结合系统工具、进程分析和应用层诊断。以下是详细的方法和步骤,涵盖从基础命令到深入分析的全流程:

一、基础工具:快速定位高内存进程

1. top/htop 实时监控(交互式工具)

top 命令(默认按 CPU 排序,需切换到内存排序):

top

# 进入后按 `Shift + m` 按内存占用降序排列(`%MEM` 列)

# 按 `u` 输入用户名,过滤特定用户的进程

# 按 `k` 输入PID可终止进程(谨慎操作)

关键列说明:

%MEM:进程占用物理内存的百分比(非 Swap)。

VIRT:虚拟内存大小(包括物理内存、Swap、共享库等)。

RES:实际占用的物理内存( Resident Set Size)。

SHR:共享内存(如共享库,不全部计入进程独占内存)。

htop 增强版(需安装,更直观显示树状进程、内存分段):

sudo apt install htop # Debian/Ubuntu

sudo dnf install htop # RHEL/CentOS

htop # 直接按内存排序(默认支持鼠标操作)

2. ps 命令:非交互式精准查询

按内存排序,列出前 10 名进程:

ps aux --sort=-%mem | head -n 10

# 输出说明:

# USER: 用户名 | PID: 进程ID | %MEM: 内存占比 | COMMAND: 进程命令

查看进程详细内存信息(结合-o参数自定义列):

ps -p -o pid,comm,mem,vsize,rss,pmem

# vsize=VIRT(虚拟内存,KB),rss=RES(物理内存,KB),pmem=%MEM

3. free/vmstat 查看系统整体内存状态

free -h:快速查看物理内存和 Swap 的总用量、剩余量:

free -h

# 重点关注 `Mem` 行的 `used`(已用内存)和 `available`(可用内存)

vmstat 1 5:每秒监控一次,连续 5 次,查看内存和 swap 的变化:

vmstat 1 5

# 重点看 `si`(swap in,内存不足时从Swap读入的速率)和 `so`(swap out,内存数据写入Swap的速率)

二、深入分析:进程内存细节

1. /proc// 目录下的内存相关文件

/proc//status:查看进程内存摘要(推荐):

cat /proc//status | grep -i 'mem'

# 关键字段:

# VmSize: 虚拟内存(VIRT,KB)

# VmRSS: 物理内存(RES,KB)

# VmSwap: 占用的Swap空间(KB,若为0表示未使用Swap)

# RssAnon: 匿名内存(如堆、栈,KB)

# RssFile: 文件映射内存(如共享库、文件缓存,KB)

/proc//smaps:逐段分析内存使用(详细到每个库 / 模块):

cat /proc//smaps | grep -E 'Size|Swap|Path' # 过滤关键信息

# 输出示例:

# 55b6c9c40000-55b6c9c41000 r-xp ... Size: 4 KB # 内存段大小

# Swap: 0 KB # 该段是否使用Swap

# Path: /usr/bin/ls # 关联的文件路径(如程序本体、动态库)

计算进程总 Swap 占用:

grep 'Swap:' /proc//smaps | awk '{sum += $2} END {print sum/1024 " MB"}'

2. pmap 命令:查看进程内存映射

pmap

# 输出每个内存段的地址范围、权限、大小、映射文件

# 示例:

# 12345: /usr/sbin/sshd

# 0000555555554000 4096K r-xp ... [heap]

# 00007ffff7a0d000 16384K r-xp ... /lib/x86_64-linux-gnu/libc-2.31.so

三、特定场景:区分 “正常高内存” 与 “异常占用”

1. 数据库 / 缓存服务的合理内存占用

数据库(如 MySQL):innodb_buffer_pool_size 可能故意占用大量内存(用于缓存数据),需通过配置文件确认是否合理。

缓存服务(如 Redis):maxmemory 配置决定内存上限,若达到上限会触发淘汰策略,需检查是否配置过高等。

判断方法:对比进程预期内存配置(如应用启动参数)与实际占用,若远超预期则可能存在泄漏。

2. 排查内存泄漏(关键!)

长期监控内存增长:

# 每隔10秒记录一次指定进程的内存占用

watch -n 10 "ps -p -o pid,comm,pmem"

工具辅助分析:

C/C++ 程序:使用 valgrind --tool=memcheck 检测内存泄漏(需在开发环境运行)。

Java 程序:

jmap -heap 查看 JVM 堆内存分布。

jmap -dump:format=b,file=heap.bin 生成堆转储文件,用 MAT/VisualVM 分析泄漏对象。

Python 程序:memory_profiler 模块(需安装,逐行分析内存变化):

from memory_profiler import profile

@profile

def my_func():

# 代码逻辑

my_func()

四、系统级视角:全局内存分布

1. 按用户 / 用户组统计内存占用

# 按用户分组,统计总内存占用

ps aux | awk '{users[$1] += $6} END {for (u in users) print u, users[u]/1024 " MB"}'

# $6 是RSS(物理内存,KB),转换为MB需除以1024

2. 识别 “僵尸进程” 或异常子进程

查看进程树(显示父子进程关系):

pstree -p # 查看指定进程的子进程

# 或用htop的树状视图(按F5键)

僵尸进程处理:

ps -A -ostat,ppid,pid,cmd | grep -w defunct # 查找僵尸进程(状态为Z)

sudo kill -9 <父进程PID> # 终止父进程,释放僵尸进程

五、进阶技巧:处理 “隐藏” 或特权进程

1. 检测被篡改的恶意进程(防 rootkit)

使用无依赖工具(避免被篡改的二进制文件):

/usr/bin/ps aux # 确保使用原始路径的ps

ls -l /proc//exe # 查看进程实际执行文件(是否指向异常路径)

用独立工具扫描:

rkhunter # 开源rootkit检测工具

chkrootkit # 另一个rootkit检测工具(需安装)

2. 限制进程内存上限(预防未来问题)

通过ulimit(临时生效,针对当前 shell 或用户):

ulimit -v 2097152 # 限制进程虚拟内存为2GB(单位KB)

通过systemd(永久生效,推荐):

# 编辑服务文件

sudo systemctl edit --full <服务名>.service

# 添加内存限制

[Service]

MemoryLimit=2G # 物理内存上限

MemoryMax=4G # 虚拟内存上限

六、注意事项

区分VIRT和RES:

VIRT高可能是正常现象(如大量共享库或未分配的虚拟地址空间),RES持续增长才更可能是内存泄漏。

生产环境谨慎操作:

终止进程前需确认是否为关键服务,建议先通过kill -15优雅终止,避免kill -9导致数据丢失。

结合日志分析:

查看/var/log/syslog(或journalctl)中的 OOM 事件,定位被系统自动终止的进程:

journalctl | grep -i 'out of memory'

总结:分场景排查流程

紧急定位:用top/htop快速排序,找到%MEM最高的进程。

细节分析:通过/proc//status/smaps或pmap查看内存分段,判断是否为程序本体、库或数据占用。

应用诊断:针对编程语言使用专用工具(如 Java 的 jmap、C 的 valgrind),检测内存泄漏。

系统优化:限制进程内存上限,调整vm.swappiness避免 Swap 过度使用(参考之前 Swap 耗尽的解决方案)。

通过以上方法,可逐层定位内存占用过高的根源,区分正常业务需求与异常资源消耗,针对性解决问题。

posted on

2025-04-30 08:59

数据派

阅读(4521)

评论(0)

收藏

举报

刷新页面返回顶部

相关推荐

《英雄聯盟》中國賽區韓援介紹
365beat怎么下载苹果

《英雄聯盟》中國賽區韓援介紹

📅 08-24 👁️ 9735
嵌入式--接口(二)液晶屏接口:RGB、LVDS、MIPI、HDMI
Bet体育365提款流程

嵌入式--接口(二)液晶屏接口:RGB、LVDS、MIPI、HDMI

📅 10-05 👁️ 4255
夜视仪再创高峰 三星Galaxy S8相机测评
365beat怎么下载苹果

夜视仪再创高峰 三星Galaxy S8相机测评

📅 08-17 👁️ 3652