什么和为什么我的交换空间在Linux下使用

在我的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的RAM是免费的。 如果我完全禁用swap,系统也可以工作。

任何解释什么数字真正显示或谁交换?

即使对你的内存没有任何的应用需求,Linux会在需要的时候“事先”换出未使用的进程部分,以便它能在到达时立即释放内存。 你可以通过调整vm.swappiness/proc/sys/vm/swappiness )来达到这个目的。

至于看什么交换,你理论上能够从top的输出(通过减去虚拟和驻留内存列,或使用交换列,这对你也一样),但我的系统有0交换使用和一个apache2进程与248m“虚拟形象”,其中9376k被认为是“常驻”,留下239m“交换”。 我不确定是否有一种实际的方法来确定交换文件中哪些特定进程或进程的某些部分实际存在。

这里有一个脚本来显示你的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 

Linux将使用你的部分内存来caching和caching,即使它没有运行程序。 此行为由vm.swappiness sysctl控制。 缺省值是60,但许多内核开发人员认为,在超过1GB内存或用户桌面的机器上,它应该为零。

什么swappiness是什么意思? 在破坏caching和缓冲区之前,内核将使用它来决定将程序交换到磁盘是多么的高兴。 这在服务器(特别是文件服务器或具有高I / O的服务器)和低内存计算机上很好,但是在台式机上却是疯狂的。 所以如果你把它设置为零,它会在考虑交换之前吃掉所有的caching和缓冲区。 或者至less它应该是这样工作的,正如我所说的,让Linux不能完全在我的笔记本电脑上交换的唯一方法就是closures交换swapoff

所以:

  • 服务器 :swappiness 60或更多
  • 高内存的桌面 :swappiness <60,0或根本没有交换,你的里程可能会有所不同,请注意oom_killer消息(这意味着你用完了内存和内核杀了一些东西)
  • 低内存桌面 :swappiness 60和交换空间=物理内存可能是最好的

内存中的页面通常不被访问,即使你有大量的内存,它仍然会交换一些程序。 这部分是为了避免当它变满时不得不交换。 否则,你会突然要求大量的内存,然后你的操作系统应该开始交换,然后才能把这个内存给你的程序。 页面没有被使用,所以他们不必在你的RAM,所以他们交换。

阅读其余的顶部输出,具体来说, VIRTRES之间的差异将告诉您每个进程当前换出了多less。

在Re:为什么使用交换,你的系统将分页出任何不经常访问的数据,以确保有新的程序,磁盘caching,等等的可用RAM – 对于所有血淋淋的细节,你将不得不读取交换algorithm内核源代码(可能不值得)。

你可以请运行:

 for a in /proc/[0-9]*/stat;do cat /proc/[0-9]*/stat|cut -d\ -f 36|grep -q ^0$||echo $a|sed -r 's#/proc/(.+)/stat#\1#';done|xargs -r ps -lwwp 

这应该显示正在交换的进程。

你也可以使用这个bash函数来parsing/ proc // stat文件:

 get_stat(){ local MYPID=$1 local STAT_KEYS="PID COMM STATE PPID PGRP SESSION TTY_NR TPGID FLAGS MINFLT CMINFLT MAJFLT CMAJFLT UTIME STIME CUTIME CSTIME PRIORITY NICE NUM_THREADS ITREALVALUE STARTTIME VZISE RSS RSSLIM STARTCODE ENDCODE STARTSTACK KSTKESP KSTKEIP SIGNAL BLOCKED SIGIGNORE SIGCATCH WCHAN NSWAP CNSWAP EXIT_SIGNAL PROCESOR RT_PRIORITY POLICY DELAYACCT_BLKIO_TICKS GUEST_TIME CGUEST_TIME" STAT_KEYS=$(echo $STAT_KEYS|sed -r 's#([A-Z_]+( |$))#proc_'$MYPID'_stat_\1 #g') for VAR in $STAT_KEYS;do local $VAR done read $STAT_KEYS </proc/$MYPID/stat for VAR in $STAT_KEYS;do echo $VAR = $(eval 'echo $'$VAR) done } get_stat $1 

另见: http : //www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html