Linux内核提供了一个可调整的设置,用于控制交换文件的使用频率,称为swappiness。
swappiness设置为零意味着除非绝对必要(即内存不足),否则将避免使用磁盘,而swappiness设置为100意味着程序将几乎立即被交换到磁盘上。
Ubuntu系统默认设置为60,这意味着如果内存使用量接近我的RAM一半,交换文件将经常被使用。您可以通过运行以下命令来检查您自己系统的swappiness值:
one@onezero:~$ cat /proc/sys/vm/swappiness
60
vm.swappiness = 10
应用更改。
sudo sysctl -p
您可以在系统运行时更改值:
sysctl vm.swappiness=10
swapoff -a
,然后再运行swapon -a
来清除你的交换空间,而不必重新启动系统以达到相同的效果。free -m (total) / 100 = A
A * 10
root@onezero:/home/one# free -m
total used free shared buffers cached
Mem: 3950 2262 1687 0 407 952
-/+ buffers/cache: 903 3047
Swap: 1953 0 1953
swappiness参数控制内核将进程从物理内存移出并移到交换磁盘的倾向。由于磁盘比RAM慢得多,如果进程过于积极地被移出内存,这可能导致系统和应用程序的响应时间变慢。
swappiness
的值可以在0到100之间。swappiness=0
:
swappiness=1
:
swappiness=100
:
参见http://en.wikipedia.org/wiki/Swappiness。
Ubuntu的默认设置是swappiness=60
。减小swappiness的默认值可能会提高典型的Ubuntu桌面安装的整体性能。建议使用swappiness=10
,但也可以自由尝试其他值。
开始使用交换空间时达到91%:
因为我已经配置了我的系统和虚拟机以利用90%的内存,所以在90%时没有发生交换。
之后我打开了一些应用程序,如Firefox和Shutter,由于内存使用量超过90%,开始进行交换。
sysctl vm.swappiness
命令,您就可以读取实际值。 - rubo77swappiness
设置为 10 使得 Ubuntu 18.04 运行得非常流畅,类似于 @mondjunge 的体验。不再出现 GNOME 卡顿,也不再有当操作系统交换文件出现故障时鼠标光标跳跃的情况。我经常同时运行的资源消耗最高的应用程序是拥有 50+ 个标签的 Chrome 浏览器和 WebStorm IDE(一个 Java 应用程序)。 - Dan Dascalescuswappiness
的说明:链接。现在最大值是200而不是100,0表示“当空闲和文件支持的页面数量低于区域内的高水位标记时,内核将不会启动交换”——不管那意味着什么。 - Gabriel Staples# read current swappiness setting
sysctl vm.swappiness
# or (same thing)
cat /proc/sys/vm/swappiness
# change setting to zero
sudo sysctl vm.swappiness=0
sudo
并编辑位于/etc/sysctl.conf
的文件,在其末尾添加所需的swappiness设置。示例:# edit the file with the `nano` editor
sudo nano /etc/sysctl.conf
# my custom swappiness setting
vm.swappiness=0
swappiness
设置,而不是使用sudo sysctl vm.swappiness=0
进行设置,则要激活在文件中设置的新设置,您需要重新启动或调用以下命令重新加载配置文件:# reload just the "/etc/sysctl.conf" config file
sudo sysctl --load
# or: from `man sysctl`:
#
# Load settings from all system configuration files.
# /run/sysctl.d/*.conf
# /etc/sysctl.d/*.conf
# /usr/local/lib/sysctl.d/*.conf
# /usr/lib/sysctl.d/*.conf
# /lib/sysctl.d/*.conf
# /etc/sysctl.conf
sudo sysctl --system
cat /etc/sysctl.conf
按照我在这里的指示下载Linux源代码:获取官方Linux内核源代码的位置和方法。
如Linux稳定库中的git blame Documentation/admin-guide/sysctl/vm.rst
所示,此文档由Peter W Morreale、Mauro Carvalho Chehab和Johannes Weiner编写(请参见此处的内核源代码)(已加重点,并稍作格式修改):
==========
这个控制用于定义交换和文件系统页面的相对IO成本,取值范围在0到200之间。在100时,VM假定IO成本相等,因此会对页面缓存和支持交换的页面施加内存压力;较低的值表示更昂贵的交换IO,较高的值表示更便宜的IO。
请记住,在内存压力下,文件系统IO模式往往比交换的随机IO更有效率。最优值需要进行实验并且还与工作负载相关。
默认值为60。
对于内存中的交换,例如zram或zswap,以及具有比文件系统更快设备上的交换的混合设置来说,可以考虑超过100的值。例如,如果与交换设备的随机IO平均快于从文件系统读写,则应该将swappiness设置为133(x + 2x = 200,2x = 133.33)。
在0时,内核将不会启动交换,直到一个区域中的可用和文件支持页面的数量少于高标记。
所以,值不再在0到100之间变动。从2020年6月3日的此提交哈希c843966c556d7开始,该值现在范围从0到200。 在此之前的提交哈希497a6c1b09902b22ceccc0f25ba4dd623e1ddb7d中提到了这一点。==========
这个控制参数用于定义内核交换内存页面的侵略程度。较高的值会增加侵略性,较低的值会减少交换量。当一个区域中的空闲和文件支持的页面数量低于高水位标记时,值为0的情况下,内核不会启动交换。
默认值为60。
至少从Linux内核版本v2.6.12-rc2(2005年)开始,通过git blame
在mm/vmscan.c
文件中设置的方式显示,默认的swappiness值一直是60。
vm.swappiness=0
!这样我的机器运行起来好太多了。根据我的经验在这里的回答中:kswapd0
正在运行(通过top
显示),尝试为一些内存占用较高的应用程序(如Chrome、Slack、Eclipse或Google Meet)进行内存交换。当RAM使用率达到80%时,这些卡顿就开始出现。在此期间,电脑将变得完全无法使用,甚至无法在终端中输入命令或点击菜单。在我的系统上:
vm.swappiness=60
时,当内存使用率达到约79%时,我会看到持续1到2分钟的100% CPU卡顿,每4到6分钟出现一次,持续不断。这在使用Google Meet时尤为严重和突出。vm.swappiness=0
时,就不会发生这种情况。在内存使用率达到80%时,我仍然可以正常运行,但在90%的内存使用率下会开始出现明显的迟缓,但不会像之前那样完全卡死。
sysctl --system
命令kswapd0
正在占用大量的CPU - 有用,但这个引用完全是错误的:
其中0表示在剩余100%中应该使用SWAP的百分比(当你的RAM剩余0%时,SWAP将开始接收数据)。
我的答案- 我需要这个swappiness信息给他们:
sudo bash -c "echo 'vm.swappiness = 15' >> /etc/sysctl.conf"
- redanimalwarsudo sysctl -p
命令来加载 sysctl.conf 文件中的新 swappiness 值,否则更改只会在下次重启时生效。 - waldyrious