内存占用较高进程(以及swap用量)shell写法

for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10 # head -10

shell 取出 前10个内存占用高的进程

# 取出的第一列为进程的id 第二列进程占用swap大小

<think> 我们正在讨论的是Linux系统下查看内存占用较高进程的方法。根据用户的问题,他可能是在管理服务器或嵌入式设备(如L3-Lite设备)时遇到了内存压力,需要定位内存消耗大的进程。以下将结合Linux常用命令和内存管理背景知识进行说明。 --- ### **一、实时内存监控工具** #### 1. **`top`命令** 运行`top`后按`Shift+M`可按内存占用排序: ```bash top - 14:30:25 up 10 days, 3:22, 5 users, load average: 0.15, 0.21, 0.31 Tasks: 256 total, 1 running, 255 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.3 us, 1.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 7916.8 total, 102.4 free, 3245.3 used, 4569.1 buff/cache MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4330.2 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1893 root 20 0 1.227g 0.843g 16804 S 2.3 10.9 10:20.31 java <-- 内存占用 2078 mysql 20 0 1.124g 0.621g 8920 S 1.0 8.0 5:32.88 mysqld ``` - **关键列**: - `RES`:实际物理内存(单位KB) - `%MEM`:占用内存百分比 - **优势**:实时动态刷新(默认3秒) #### 2. **`htop`增强版** 若系统支持,安装`htop`获得更直观视图: ```bash sudo apt install htop # Debian/Ubuntu htop ``` - 功能亮点: - 彩色显示内存/CPU占比 - 鼠标点击表头可直接排序 - 支持进程树视图(按`F5`) --- ### **二、静态内存快照分析** #### 1. **`ps`命令组合** 按内存降序列出所有进程: ```bash ps aux --sort=-%mem | head -n 10 # 显示10内存消耗进程 ``` 输出示例: ``` USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1893 2.3 10.9 1286004 863004 ? Ssl Jun12 10:20 /usr/bin/java -Xmx1g -jar app.jar mysql 2078 1.0 8.0 1151232 631772 ? Sl Jun12 5:32 /usr/sbin/mysqld ``` - **指标解析**: - `RSS`:实际物理内存(单位KB) - `VSZ`:虚拟内存(含共享库等) #### 2. **`smem`级统计** 安装`smem`可计算更精确的**唯一内存占用(USS)**: ```bash sudo apt install smem smem -s rss -r | head -n 5 # 按RSS倒序 ``` 输出包含: ``` PID User Command Swap USS PSS RSS 1893 root java -Xmx1g -jar app.jar 0 843M 845M 843M 2078 mysql /usr/sbin/mysqld 0 621M 623M 621M ``` - **USS(Unique Set Size)**:进程独占内存,判断内存泄漏更准确[^2] --- ### **三、内存泄漏诊断** 当发现进程内存持续增长时: #### 1. **`valgrind`检测**(需重启进程) ```bash valgrind --leak-check=full ./your_program ``` - 可定位C/C++程序的内存泄漏位置 #### 2. **监控工具链** - **`pmap`**:查看进程内存映射详情 ```bash pmap -x 1893 # 分析PID=1893的进程 ``` - **`/proc/PID/smaps`**:更细粒度内存分配分析 ```bash cat /proc/1893/smaps | grep -i rss | awk '{sum+=$2} END {print sum}' ``` --- ### **四、特殊场景处理** #### 1. **`kswapd0`CPU问题** 如引用[^1]所述,若`kswapd0`持续占用CPU: - **第一步**:确认内存压力来源 ```bash free -h # 查看Swap使用 vmstat 1 5 # 监控si/so(换入/换出) ``` - **第二步**:根据`top/ps`结果定位占用内存进程 #### 2. **嵌入式设备限制** 在内存紧张的设备(如L3-Lite目标1GB)中: - 使用精简版工具`busybox top` - 通过`/proc/meminfo`直接读取: ```bash cat /proc/meminfo | grep -e MemTotal -e MemFree -e Swap ``` --- > **操作建议流程**: > 1. 用`top`或`ps`快速定位内存进程 > 2. 用`smem`或`pmap`分析具体内存构成 > 3. 若存在泄漏嫌疑,使用`valgrind`深度检测 > 4. 对`kswapd0`负载,优先解决内存瓶颈 --- **§§相关问题§§** 1. 如何区分进程的RES(常驻内存)和SHR(共享内存)的实际独占部分? 2. 在嵌入式Linux中,有哪些轻量级工具可以替代`htop`? 3. 当系统没有Swap分区时,`kswapd0`还会运行吗? 4. 如何通过`/proc`文件系统实时监控特定进程内存变化? [^1]: kswapd0 进程CPU占用通常指向物理内存不足 [^2]: smem工具通过统计USS/PSS提供更精准的内存占用分析 </think>### 查看Linux设备内存占用较高进程的方法 #### 1. **使用 `top` 命令(实时动态监控)** ```bash top ``` - 进入后按 `Shift+M` 按内存使用率排序 - **关键列解析**: - `%MEM`:进程占用物理内存百分比 - `RES`:实际物理内存使用量(单位KB) - **优势**:实时刷新(默认3秒),直观显示系统级内存压力[^1] #### 2. **使用 `ps` 命令(静态快照)** ```bash ps aux --sort=-%mem | head -n 10 # 显示内存TOP10进程 ``` 输出示例: ``` USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 1076 2.3 28.9 2.3g 1.8g ? Ssl 09:32 15:20 /usr/sbin/mysqld java 1893 5.1 17.2 1.8g 1.1g ? Sl 08:15 22:10 /usr/bin/java -Xmx2g ``` - **指标说明**: - `RSS`:实际物理内存占用(关键指标) - `VSZ`:虚拟内存大小(含共享库) #### 3. **使用 `htop` 增强工具(交互式)** ```bash sudo apt install htop # 安装 htop ``` - **功能亮点**: - 彩色可视化内存条 - 鼠标点击表头排序 - 支持进程树视图(按 `F5`) #### 4. **内核级内存分析** ```bash # 查看详细内存分配 cat /proc/meminfo # 检查特定进程内存映射 pmap -x 1893 # 1893为PID ``` 输出片段: ``` Address RSS PSS Shared_Clean 00400000 1256K 256K 0K 7f3e5bdf0000 872K 120K 120K [共享库] ``` #### 5. **自动化监控脚本** ```bash #!/bin/bash # 每5秒记录内存TOP5进程 while true; do echo "===== $(date) =====" >> memory.log ps -eo pid,%mem,rss,comm --sort=-%mem | head -n 6 >> memory.log sleep 5 done ``` ### 特殊场景处理 1. **`kswapd0` CPU问题**: ```bash free -h # 先确认内存余量 vmstat 1 5 # 查看si/so(换入/换出) ``` 若 `si/so` 持续>0,表明物理内存不足触发频繁换页[^1] 2. **可疑进程分析**: ```bash # 检查进程启动路径 ls -l /proc/1893/exe # 检查进程打开文件 lsof -p 1893 ``` > **操作建议**: > 1. 先用 `top` 快速定位异常进程 > 2. 用 `ps/pmap` 分析具体内存构成 > 3. 对持续增长进程使用 `valgrind --tool=memcheck` 检测内存泄漏 --- **
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值