问题描述
我认为交换的全部本质就是在内存满时用作临时存储安全网络,但即使我有时有多达3GB的可用内存,我的交换分区仍在不断使用。这是正常的吗?
最佳解决思路
您可以尝试更改您的”swappiness”值:
What is swappiness and how do I change it?
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. A value of swappiness=10 is recommended, but feel free to experiment. Note: Ubuntu server installations have different performance requirements to desktop systems, and the default value of 60 is likely more suitable.
To check the swappiness value
cat /proc/sys/vm/swappiness
To change the swappiness value A temporary change (lost on reboot) with a swappiness value of 10 can be made with
sudo sysctl vm.swappiness=10
To make a change permanent, edit the configuration file with your favorite editor:
gksudo gedit /etc/sysctl.conf
Search for vm.swappiness and change its value as desired. If vm.swappiness does not exist, add it to the end of the file like so:
vm.swappiness=10
Save the file and reboot.
您也可以查看:https://askubuntu.com/a/103916/54187
次佳解决思路
你的问题有几个不同的方面。
首先,你对”free”的定义是什么。它实际上并不像Linux(或任何现代操作系统)那样简单。
Linux如何使用RAM(非常简化)
每个应用程序都可以使用一些内存。 Linux使用所有其他未占用的内存(除了最后几个Mb)作为”cache”。这包括页面缓存,inode缓存等。这是一件好事 – 它有助于加速堆积。写入磁盘和从磁盘读取都可以通过缓存非常快速地加速。
理想情况下,您的所有应用程序都有足够的内存,并且您仍有几百MB用于缓存。在这种情况下,只要您的应用程序不增加其内存使用量,并且系统不努力获得足够的缓存空间,则不需要任何交换。
一旦应用程序声明更多的RAM,它就会进入缓存使用的一些空间,从而缩小缓存。 De-allocating缓存便宜且简单,只需要实时完成 – 缓存中的所有内容都只是磁盘上已有内容的第二个副本,因此可以立即释放,或者我们本来可以拥有的东西无论如何在接下来的几秒钟内刷入磁盘。
这不是特定于Linux的情况 – 所有现代操作系统都以这种方式工作。不同的操作系统可能只是报告不同的RAM:有些缓存作为他们认为”free”的一部分,有些则可能不包含。
当谈论可用RAM时,包含缓存更有意义,因为它实际上是免费的 – 如果任何应用程序请求它,它就可用。在Linux上,free
命令以双向方式报告它 – 第一行包含已用RAM列中的高速缓存,第二行包含空闲列中的高速缓存(和缓冲区)。
Linux如何使用交换(甚至更简化)
一旦你使用了足够的内存,smooth-running缓存没有足够的剩余空间,Linux可能会决定从RAM中将re-allocate一些未使用的应用程序内存交换。
它不会根据确定的cut-off执行此操作。这不像你达到一定比例的分配,然后Linux开始交换。它有一个相当”fuzzy”算法。它考虑了很多事情,最好的描述是“内存分配有多大的压力”。如果有很多”pressure”分配新内存,那么它会增加一些交换机会以腾出更多空间的机会。如果”pressure”较少,则会减少这些机会。
您的系统具有”swappiness”设置,可帮助您调整此”pressure”的计算方式。通常不建议改变这一点,我不建议你改变它。交换总体上是一件非常好的事情 – 尽管存在一些损害性能的边情况,但如果从整体系统性能的角度来看,这对于广泛的任务来说是一个净效益。如果你减少了swappiness,那么即使它真的有用,你也会让缓存内存的数量比其他内存少得多。无论这个问题是否足够好,trade-off对于您交换的任何问题都取决于您。你应该知道你在做什么,就这些。
有在交换真正损害桌面系统上感知的性能well-known情况,并再次被闲置了很长一段时间后,这是在应用程序中如何快速响应用户的输入,并具有背景如隔夜备份流程在IO(重) 跑。这是一个非常明显的迟缓,但还不足以证明在任何操作系统中关闭交换并非常难以阻止。关闭交换和备份/病毒扫描后的初始缓慢可能不会发生,但系统可能整天运行速度稍慢。这并不仅限于Linux。
在选择要交换到磁盘的内容时,系统会尝试挑选实际未使用的内存 – 读取或写入内存。它有一个非常简单的算法,用于计算大多数时间选择的情况。
如果你有一个拥有大量内存的系统(在写这篇文章时,8GB对于一个典型的Linux发行版是一笔巨款),那么你很少会遇到需要交换的情况。你甚至可以尝试关闭掉。我从来不建议这样做,但仅仅是因为你永远不知道什么时候更多的RAM可以让你免于某些应用程序崩溃。但如果你知道你不需要它,你可以做到。
但如何可以加快我的系统?不会交换缓慢的东西吗?
将数据从RAM传输到交换的操作是一个缓慢的操作,但只有在内核确信整体收益超过此值时才会采取行动。例如,如果您的应用程序内存上升到几乎没有高速缓存,并且由于这种情况您的I /O效率非常低,则通过释放一些内存,您实际上可以在系统中获得更多速度,甚至在交换数据以释放数据的初始花费之后。
如果您的应用程序实际需要的内存超过您的实际使用量,这也是最后一招。在这种情况下,交换是必要的,以防止out-of-memory情况,这种情况通常会导致应用程序崩溃或不得不被强行终止。
交换仅与系统性能不佳有关的时间有关,因为它发生在可用内存不足时,即使您没有交换,也会降低系统速度(或使其不稳定)。所以为了简化事情,交换发生是因为你的系统陷入了困境,而不是相反。
一旦数据交换,它什么时候再出来?
将数据从交换中移出(对于传统硬盘来说,至少)就像将time-consuming放在那里一样。可以理解的是,你的内核将不愿意从交换中删除数据,特别是如果它没有被实际使用(即从中读取或写入)。如果交换中有数据并且没有被使用,那么它仍然处于交换状态实际上是一件好事,因为它为正在使用的其他事物留下更多的内存,可能会加快系统的速度。
第三种解决思路
设置swappiness值不适用于任何情况。如果它适合你,那很好。如果没有,我已经写了一个脚本来定期清除交换,关掉并重新打开。
如果你不小心,切换交换有点危险。如果您没有足够的可用RAM来容纳RAM中的所有内容以及交换中的所有内容,则尝试禁用交换将导致系统无响应。我的脚本首先检查是否有足够的可用RAM(这需要做一些操作,因为可用RAM的实际数量与free
报告的空闲数据不同),如果是这样,则只切换交换。但是,如果你的RAM有点短缺,在脚本运行时不要启动另一个主流程。这里是:
#!/bin/bash
# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8
# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
# Do the work
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
echo "Freeing swap..."
swapoff -a
swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
您必须以root身份运行此脚本(例如,使用sudo
)。这个脚本不会让你的系统无响应;如果你的内存不足,它将拒绝交换交换。我已经使用这个脚本,现在已经接近五年了。
第四种思路
一般而言,交换在now-a-days系统上仍未使用。根据我的经验,长时间运行而没有密集操作的进程转移到linux交换。它使一些受影响的程序运行缓慢。如果您有大量内存,您可以通过运行以下命令来关闭交换:swapoff -av
(您需要sudo
权限)。如果您不喜欢交换关闭,可以使用对称命令将其打开:swapon -av
(同样需要sudo
)。
第五种思路
一旦交换已被用于某个程序,它往往会在程序生命周期中保持映射。很多程序都有很少使用的代码(和数据)。一旦内存被换出,它不太可能被换入。
强制这些页面进入内存的一种方法是关闭交换设备。如果你有两个,你可以关掉一个,打开它,然后关闭第二个。如果真的需要交换,它将在设备之间移动。你可以关闭交换设备(或文件),但如果你真的需要交换空间,可能会发生激烈的事情。
除了内存中的正常情况之外,tempfs使用交换空间,并将像内存其余部分一样交换。如果您运行需要大量临时磁盘的内容,则可能会强制页面被换出。一旦创建临时文件可能会在几分钟后不再使用,并且很适合移动到交换设备。
在一个捏你可以使用一个文件作为交换设备。如果您临时需要额外的交换空间,这非常有用。
第六种思路
我编辑了the script of Scott Severance以匹配已包含全部可用内存字段的较新版本的免费版本。
#!/bin/bash
free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
echo "Freeing swap..."
sudo swapoff -a
sudo swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi