尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

linux 进程内存占用查看 - Sanny.Liu

linux 进程内存占用查看 - Sanny.Liu
📅 发布时间:2026/6/20 9:40:37

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 <PID> -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/<PID>/ 目录下的内存相关文件
/proc/<PID>/status:查看进程内存摘要(推荐):

cat /proc/<PID>/status | grep -i 'mem'
# 关键字段:
# VmSize: 虚拟内存(VIRT,KB)
# VmRSS: 物理内存(RES,KB)
# VmSwap: 占用的Swap空间(KB,若为0表示未使用Swap)
# RssAnon: 匿名内存(如堆、栈,KB)
# RssFile: 文件映射内存(如共享库、文件缓存,KB)

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

cat /proc/<PID>/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/<PID>/smaps | awk '{sum += $2} END {print sum/1024 " MB"}'

2. pmap 命令:查看进程内存映射
pmap <PID>
# 输出每个内存段的地址范围、权限、大小、映射文件
# 示例:
# 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 <PID> -o pid,comm,pmem"

工具辅助分析:
C/C++ 程序:使用 valgrind --tool=memcheck 检测内存泄漏(需在开发环境运行)。
Java 程序:
jmap -heap <PID> 查看 JVM 堆内存分布。
jmap -dump:format=b,file=heap.bin <PID> 生成堆转储文件,用 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 <PID> # 查看指定进程的子进程
# 或用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/<PID>/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/<PID>/status/smaps或pmap查看内存分段,判断是否为程序本体、库或数据占用。
应用诊断:针对编程语言使用专用工具(如 Java 的 jmap、C 的 valgrind),检测内存泄漏。
系统优化:限制进程内存上限,调整vm.swappiness避免 Swap 过度使用(参考之前 Swap 耗尽的解决方案)。

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

相关新闻

  • Oracle EBS BOM 通过ECO批量新增或者更新资源
  • typora快捷键
  • 【Dify Tesseract 运维必修课】:深入理解增量更新与回滚机制的黄金法则

最新新闻

  • 伊犁黄金回收2026年6月实测:六家正规商家大盘价减3至10元全城上门 - 余生黄金回收
  • 舞蹈赛事专用视频投票小程序,哪款防刷无广告好用?永久免费零广告实测推荐 - 微信投票小程序
  • 告别脚本恐惧:用自然语言实现UI自动化测试的工程实践
  • 2026年榆林市贵金属旧料回收优质靠谱实体门店精选五家 黄金回收铂金回收白银回收彩金回收真实探店测评清单及联系方式推荐 - 前途无量YY
  • 2026年珠海市贵金属旧料回收优质靠谱实体门店精选五家 黄金回收铂金回收白银回收彩金回收真实探店测评清单及联系方式推荐 - 前途无量YY
  • 2026无锡本地正规瓷砖空鼓维修服务商盘点|无损免拆砖修复,全域上门售后有保障 - 宅安选房屋修缮

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号