在我的Linux系统上,我从顶部获取以下统计数据:
Tasks: 155 total, 1 running, 153 sleeping, 0 stopped, 1 zombie
Cpu(s): 1.5%us, 0.3%sy, 0.0%ni, 97.4%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8177180k total, 2025504k used, 6151676k free, 44176k buffers
Swap: 7999996k total, 495300k used, 7504696k free, 637612k cached
那里显示我的系统使用了 495Mb 的交换空间。为什么会这样?6G 的内存是空闲的。如果我完全禁用交换空间,系统也可以正常工作。
能否解释一下该数字实际上表明了什么或是谁在交换?
答案1
即使没有应用程序占用内存,Linux 也会在实际需要之前“提前”交换出进程中未使用的部分,以便在需要时立即释放这些内存。您可以通过按照说明调整vm.swappiness
( ) 来调整执行此操作的倾向/proc/sys/vm/swappiness
这里。
至于查看交换的内容,理论上您可以从输出中看出top
(通过减去虚拟内存和常驻内存列,或使用为您执行相同操作的交换列),但我的系统已使用 0 个交换,并且 apache2 进程具有 248m“虚拟映像”,其中 9376k 应该是“常驻”,剩下 239m 是“交换”。我不确定是否有实际方法可以识别交换文件中实际包含哪些特定进程或进程的一部分。
答案2
这是一个脚本,用于向您展示 Linux 系统上进程使用的交换空间。
感谢原作者:Erik Ljungstrom 27/05/2011。
经过我修改,增加了实用性和友好性。HTH。
#!/bin/bash
#
# Get current swap usage for running processes
# Original: Erik Ljungstrom 27/05/2011
# Modifications by ariel:
# - Sort by swap usage
# - Auto run as root if not root
# - ~2x speedup by using procfs directly instead of ps
# - include full command line in output
# - make output more concise/clearer
# - better variable names
#
# Need root to look at all processes details
case `whoami` in
'root') : ;;
*) exec sudo $0 ;;
esac
(
PROC_SWAP=0
TOTAL_SWAP=0
for DIR in `find /proc/ -maxdepth 1 -type d | grep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
CMDLINE=`cat /proc/$PID/cmdline 2>/dev/null | tr '\000' ' '`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null | awk '{ print $2 }'`
do
let PROC_SWAP=$PROC_SWAP+$SWAP
done
if [ $PROC_SWAP == 0 ]; then
# Skip processes with no swap usage
continue
fi
echo "$PROC_SWAP [$PID] $CMDLINE"
let TOTAL_SWAP=$TOTAL_SWAP+$PROC_SWAP
PROC_SWAP=0
done
echo "$TOTAL_SWAP Total Swap Used"
) | sort -n
答案3
即使内存中没有装满正在运行的程序,Linux 也会将部分内存用于缓存和缓冲。此行为由 sysctl 控制vm.swappiness
。默认值为 60,但许多内核开发人员认为,在内存超过 1GB 的机器或用户桌面上,该值应为零。
swappiness 是什么意思?这是一个内核用来决定在破坏缓存和缓冲区之前将程序交换到磁盘的程度的值。这对于服务器(特别是文件服务器或具有高 I/O 的服务器)和低内存计算机非常有用,但在台式机上却很糟糕。因此,如果您将其设置为零,它将在考虑交换之前耗尽所有缓存和缓冲区。或者至少它应该以这种方式工作,正如我所说,阻止 Linux 在我的笔记本电脑上完全交换的唯一方法是使用 关闭交换swapoff
。
所以:
- 服务器:swappiness 60 或更高
- 具有高内存的台式机:swappiness < 60, 0 或根本没有交换,您的里程可能会有所不同,注意 oom_killer 消息(这意味着您耗尽了内存并且内核杀死了某些东西)
- 低内存桌面:swappiness 60 和交换空间 = 物理内存可能是最好的
答案4
读其余的部分VIRT
您的顶部输出,特别是和之间的差异RES
将告诉您每个进程当前有多少被换出。
在回复:为什么使用交换时,您的系统将分页出任何不经常访问的数据,以确保有可用的 RAM 用于新程序、磁盘缓存等。 - 对于所有详细的细节,您必须阅读内核源代码中的交换算法(可能不值得)。