要找出程序占用了多少swap空间,可以通过以下步骤进行:
查看所有进程的swap使用情况
使用`free -h`命令查看系统的总内存、已使用内存、剩余内存以及swap的使用情况。
列出占用swap较多的进程
通过分析`/proc`目录下每个进程的`smaps`文件,可以找到占用swap较多的进程。`smaps`文件记录了每个进程每个数据段占用内存的情况,其中`Swap:`后面的数字表示该数据段占用的swap大小。
可以使用以下命令列出所有进程占用的swap分区的大小:
```bash
for i in $(cd /proc;ls | grep "^[0-9]" | awk '{print $9}'); do
awk '/Swap:/{a=a+$2}END{print "'$i'", a/1024"M"}' /proc/$i/smaps 2>/dev/null;
done | sort -k2nr | head
```
分析具体进程
通过上述命令,可以得到占用swap较多的进程的PID。然后可以使用`ps aux | grep ${pid}`命令获取该进程的详细信息,或者使用`cat /proc/$pid/smaps`详细查看该进程的内存使用情况。
释放进程占用的swap
如果某个进程占用了大量swap空间,且该进程不是系统关键进程,可以考虑重启该进程以释放swap空间。
示例脚本
```bash
!/bin/bash
echo -e "PID\t\tSwap\t\tProc_Name"
for pid in $(cd /proc;ls | grep "^[0-9]" | awk '{print $9}'); do
if [ $pid -eq 1 ]; then
continue;
fi
grep -q "Swap" /proc/$pid/smaps 2>/dev/null
if [ $? -eq 0 ]; then
swap=$(grep Swap /proc/$pid/smaps | awk '{sum+=$2} END{print sum}')
proc_name=$(ps aux | grep -w $pid | grep -v grep | awk '{print $2}')
echo -e "$pid\t$swap\t$proc_name"
fi
done | sort -k2nr
```
将上述脚本保存为`list_swap_usage.sh`,然后在终端中运行`chmod +x list_swap_usage.sh`使其可执行,最后运行`./list_swap_usage.sh`即可看到占用swap较多的进程及其占用的swap大小。