为什么在有足够的空闲内存时,Ubuntu还要使用交换空间?

在运行Virtual Box时,我的系统频繁访问硬盘并且运行缓慢。
当我使用系统监视器检查系统资源时,它显示处理器使用率为15%,内存使用率为65%,交换空间使用率约为50%。
我的问题是,为什么Ubuntu需要使用交换空间,当主内存有足够的空间可用?
编辑 - free命令的输出 -
             total       used       free     shared    buffers     cached
Mem:       4075908    3056931    1018977          0       1944     308408
-/+ buffers/cache:    2746579    1329329
Swap:      4139004    1862551    2276453

注意 - 在我从12.04版本升级到12.10版本之前,虚拟机似乎工作得很正常。现在它非常慢,几乎无法使用。

你有多少内存? - Uri Herrera
你能展示一下free命令的输出吗? - Nanne
只是一个想法:难道虚拟机不是将所需的所有内存作为一个大块来申请吗?这个块的大小可能超过了剩余的内存量,所以需要放入RAM中吗? - Nanne
1当系统闲置时,会将不使用的东西放入交换空间中,以便有更多的自由内存可供使用。 - Dr_Bunsen
@Nanne 不,应用程序声明的内存只是可以单独、独立地从物理内存中分页出去的内存页面。 - gertvdijk
检查!只是心里的想法而已:) - Nanne
2个回答

The swappiness parameter controls the tendency of the kernel to move processes out of physical memory and onto the swap disk. Because disks are much slower than RAM, this can lead to slower response times for system and applications if processes are too aggressively moved out of memory.

swappiness can have a value of between 0 and 100
swappiness=0 tells the kernel to avoid swapping processes out of physical memory for as long as possible
swappiness=100 tells the kernel to aggressively swap processes out of physical memory and move them to swap cache 

The default setting in Ubuntu is swappiness=60. Reducing the default value of swappiness will probably improve overall performance for a typical Ubuntu desktop installation.

来源:SwapFaq - Ubuntu Wiki

在开始使用虚拟机之前,请打开终端并粘贴以下内容:

    sudo sysctl vm.swappiness=10

开始可视化并检查交换使用情况是否减少,如果是这样,在终端执行以下命令:
    gksu gedit /etc/sysctl.conf

它会要求您输入密码,请输入密码,然后屏幕上会出现一个文本编辑器,向下滚动到最底部,在最后一行之后添加:
    vm.swappiness=10

保存文件并重新启动计算机。
这样应该就可以了!

1@NikTh 你说的“在开始虚拟化之前”是什么意思? - Kshitiz Sharma
1我猜@zaxcvr的意思是“在你启动VirtualBox应用程序之前”。我刚刚编辑了答案,添加了更多关于swappiness的信息 :-) - NickTux
1如果仅仅改变swappiness值就能产生如此显著的效果,那么肯定Ubuntu和其他发行版会采用不同的默认值。降低swappiness的一个不利之处是未使用的进程会占用内存,从而导致较小的磁盘缓存,降低磁盘访问速度。 - Sergey

但是你的内存不够。在第一列中,可用的总内存量为4075908。实际用于程序(不包括缓存和缓冲区)的内存量为2746579。交换空间中的RAM量为1862551。
这意味着实际使用的内存量为2746579+1862551,即4609130。通常,完整的内存块和程序的分配将被交换出去,这是最有效的方法。
底线是,你需要4609130-4075908,即533222 Mb的RAM,超过你实际拥有的。
看一下你在运行时为虚拟机分配了多少内存,以及其他可能正在运行的程序的RAM需求。有时候越少越好 - 如果减少为虚拟机分配的RAM量,就不会发生交换,并且性能会更好。