惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
AI
AI
T
Threat Research - Cisco Blogs
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes
V
Vulnerabilities – Threatpost
S
Securelist
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
C
Cybersecurity and Infrastructure Security Agency CISA
AWS News Blog
AWS News Blog
Cisco Talos Blog
Cisco Talos Blog
Cloudbric
Cloudbric
P
Privacy & Cybersecurity Law Blog
N
News and Events Feed by Topic
D
Docker
博客园 - 司徒正美
Last Week in AI
Last Week in AI
Google DeepMind News
Google DeepMind News
O
OpenAI News
人人都是产品经理
人人都是产品经理
腾讯CDC
博客园 - 三生石上(FineUI控件)
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Scott Helme
Scott Helme
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 叶小钗
N
News and Events Feed by Topic
J
Java Code Geeks
D
DataBreaches.Net
爱范儿
爱范儿
N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
H
Heimdal Security Blog
F
Full Disclosure
L
LINUX DO - 最新话题
W
WeLiveSecurity
Blog — PlanetScale
Blog — PlanetScale
V
V2EX
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42

博客园 - Sanny.Liu-CV&&ML

GRPO 是否“真的在学” clip的底层原理---深入源码:手把手剖析OpenAI CLIP的实现结构与细节 Decoder-Only、Encoder-Only 与 Encoder-Decoder 算一个bbox和一个mask区域的重叠 用PyTorch从零搭建一个Transformer模型 基于树编辑距离的相似度(TEDS) 图片,二进制,base64互转 OCR相关的笔记 opencv的RGB 颜色表 transformers中的generate函数解读 5 levels of text splitting PyMuPDF工具说明 OCR表格识别 uvicorn,一个无敌的 Python 库! stable diffusion中controlnet详细使用方法总结 lora训练参数设置 Dreambooth, Textual Inversion, LoRA, Hypernetworks ,示意图解释 转载:深度学习:蒸馏Distill MoveNet:超快且准确的姿态检测模型 根据5个人脸特征点,快速计算人脸角度
linux 进程内存占用查看
Sanny.Liu-CV&&ML · 2025-12-16 · via 博客园 - Sanny.Liu-CV&&ML

转载:

在 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 耗尽的解决方案)。

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