Linux swappeiness值与交换开始前使用了多少RAM无关。这是一个被广泛报道和普遍相信的错误。我们解释它到底是什么。
交换是一种将随机存取存储器(RAM)中的数据写入硬盘上的特殊位置(交换分区或交换文件)以释放RAM的技术。
Linux有一个称为交换值的设置。关于这个设置控制什么,有很多困惑。对交换性最常见的错误描述是,它为RAM使用设置了一个阈值,当使用的RAM数量达到该阈值时,交换就开始了。
这是一个经常被重复的错误观念,现在它已被接受为智慧。如果(几乎)其他人都告诉你交换就是这样工作的,为什么你要相信我们说不是这样的呢?
很简单。我们要证明这一点。
Linux不认为RAM是一个大的同质内存池。它认为它被划分为若干不同的区域,称为区域。计算机上存在哪些区域取决于它是32位还是64位。下面是x86体系结构计算机上可能的区域的简化描述。
RAM以固定大小的页面分配。这个大小是由内核在引导时通过检测计算机的体系结构来确定的。通常,Linux计算机上的页面大小是4KB。
可以使用getconf命令查看页面大小:
getconf PAGESIZE分区附着到节点。节点与中央处理器(CPU)相关联。内核将尝试从与CPU相关联的节点为CPU上运行的进程分配内存。
将节点绑定到CPU的概念允许在专业多CPU计算机中安装混合内存类型,使用非统一内存访问体系结构。
这些都是非常高端的。一般的Linux计算机只有一个节点,称为node zero。所有区域都将属于该节点。要查看计算机中的节点和区域,请查看/proc/buddyinfo文件。我们将使用更少的资源:
less /proc/buddyinfo这是本文研究的64位计算机的输出:
Node 0, zone DMA 1 1 1 0 2 1 1 0 1 1 3 Node 0, zone DMA32 2 67 58 19 8 3 3 1 1 1 17有一个节点,节点0。这台计算机只有2GB的RAM,所以没有“正常”区域。只有两个区域,DMA和DMA32。
每列表示特定大小的可用页数。例如,对于DMA32区域,从左侧读取:
但实际上,我们查看这些信息的唯一原因是查看节点和区域之间的关系。
内存映射使用页表条目集来记录哪些内存页被使用,以及用于什么目的。
内存映射可以是:
对于交换,我们只需要关注列表中的前两个:文件页和匿名页。
以下是GitHub上Linux文档中对交换的描述:
此控件用于定义内核交换内存页的攻击性(sic)。较高的值会增加攻击性,较低的值会减少交换量。值0指示内核在空闲页和文件备份页的数量小于区域中的高水位线之前不启动交换。
默认值为60。“
这听起来像是交换在强度上会上下转换。有趣的是,它指出将swappeiness设置为零并不能关闭swap。它指示内核在满足某些条件之前不要交换。但是交换仍然可以发生。
我们再深入一点。以下是内核源代码文件vmscan.c中vm\u交换的定义和默认值:
/**从0。。100越高意味着交换越多。*/int vm\u swappeiness=60;
交换性值的范围从0到100。同样,这个注释听起来很像swappeiness值与交换发生的次数有关,越高的值导致交换越多。
进一步在源代码文件中,我们可以看到一个名为swappeiness的新变量被分配了一个由函数mem\u cgroup\u swappeiness()返回的值。对源代码的进一步跟踪将显示此函数返回的值是vm\u swappeiss。所以现在,变量swappeiss设置为等于vm\u swappeiss设置的值。
int swappeiness=mem\u cgroup\u swappeiness(memcg);
再往下一点,在同一个源代码文件中,我们看到:
/**交换为100时,匿名和文件具有相同的优先级。*此扫描优先级基本上与IO开销相反。*/anon\u prio=swappeiss;file\u prio=200-anon\u prio;
那很有趣。两个不同的值来自交换。anon\u prio和file\u prio变量保存这些值。一个增加,另一个减少,反之亦然。
Linux swappeiness值实际上设置了两个值之间的比率。
如果释放内存,文件页保存的数据很容易检索。Linux可以再次读取文件。如我们所见,如果文件数据在RAM中发生了更改,那么在释放文件页之前,必须将这些更改写入文件。但是,无论哪种方式,RAM中的文件页都可以通过从文件中读取数据来重新填充。那么,为什么要麻烦地将这些页面添加到交换分区或交换文件中呢?如果您再次需要该数据,您不妨从原始文件中读回它,而不是在交换空间中读取冗余副本。所以文件页不存储在swap中。它们“存储”在原始文件中。
对于匿名页,没有与内存中的值关联的基础文件。这些页面中的值是动态到达的。你不能简单地从文件中读回它们。恢复匿名页内存值的唯一方法是在释放内存之前将数据存储在某个位置。这就是交换的意义。需要再次引用的匿名页。
但请注意,对于文件页和匿名页,释放内存可能需要硬盘驱动器写入。如果文件页数据或匿名页数据自上次写入文件或交换后已更改,则需要进行文件系统写入。要检索数据,需要读取文件系统。这两种类型的页面回收成本都很高。试图通过最小化匿名页面的交换来减少硬盘驱动器的输入和输出,只会增加硬盘驱动器的输入和输出量,这是处理写入和读取文件的文件页面所必需的。
从上一段代码中可以看到,有两个变量。一个叫file\u prio表示“文件优先级”,另一个叫anon\u prio表示“匿名优先级”。
这些变量保存的值是串联工作的。如果两者都设置为100,则它们相等。对于任何其他值,non\u prio将从100减少到0,file\u prio将从100增加到200。这两个值输入到一个复杂的算法中,该算法确定Linux内核运行时是优先回收(释放)文件页还是匿名页。
您可以将文件优先权视为系统愿意释放文件页,而非优先权视为系统愿意释放匿名页。这些值所不做的是为何时使用swap设置任何类型的触发器或阈值。那是在别处决定的。
但是,当需要释放内存时,回收和交换算**考虑这两个变量及其比率,以确定优先考虑释放哪些页类型。这决定了关联的硬盘活动是为文件页处理文件还是为匿名页交换空间。
我们已经确定,Linux swappeiness值为将被扫描以进行潜在回收的内存页类型设置了一个首选项。这很好,但必须有一些事情来决定何时进行互换。
每个记忆区域都有一个高水位线和一个低水位线。这些是系统派生的值。它们是每个区域内存的百分比。正是这些值被用作交换触发阈值。
要检查高水位线和低水位线,请使用以下命令查看/proc/zoneinfo文件:
less /proc/zoneinfo每个区域都有一组以页为单位的内存值。以下是测试机器上DMA32区域的值。低水位线13966页,高水位线16759页:
因此,您可以看到,不能使用Linux swappeiness值来影响swap在RAM使用方面的行为。只是不能这样。
这取决于硬件、工作负载、硬盘类型,以及您的计算机是台式机还是服务器。显然,这不会是一个一刀切的设置类型。
您必须记住,当内存空间耗尽时,swap不仅仅是一种释放RAM的机制。Swap是一个功能良好的系统的重要组成部分,没有它,Linux就很难实现合理的内存管理。
更改Linux swappeiness值会立即生效;您不需要重新启动。所以你可以做一些小的调整并监控效果。理想情况下,你可以在几天内,在电脑上进行不同类型的活动,试图找到最接近理想的设置。
需要考虑以下几点:
在更改交换值之前,您需要知道它的当前值是什么。如果你想减少一点,问题是比什么少一点?使用此命令可以找到:
cat /proc/sys/vm/swappiness要配置交换性值,请使用sysctl命令:
sudo sysctl vm.swappiness=45直接使用新值,不需要重新启动。
事实上,如果重新启动,交换值将返回到其默认值60。当您完成实验并决定要使用的新值后,您可以通过将它添加到/etc来使它在重新启动期间保持不变/系统控制组态文件。你可以用你喜欢的编辑器。使用以下命令使用nano编辑器编辑文件:
sudo nano /etc/sysctl.conf当nano打开时,滚动到文件的底部并添加这一行。我们用35作为永久交换值。你应该替换你想要使用的值。
vm.swappiness=35要保存更改并退出nano,请按“Ctrl+O”,按“Enter”,然后按“Ctrl+Z”
内存管理很复杂。这就是为什么,对于普通用户来说,由内核决定通常更好。
很容易让人觉得你用的内存比你用的多。像top和free这样的实用程序可能会给人错误的印象。Linux将使用免费的RAM来实现它自己的各种目的,比如磁盘缓存。这就人为地提高了“已用”内存的数值,降低了“空闲”内存的数值。实际上,用作磁盘缓存的RAM同时被标记为“已用”和“可用”,因为它可以在任何时候很快地被回收。
对于外行来说,可能看起来swap不起作用,或者swappeiss值需要更改。
和往常一样,细节才是关键。或者,在本例中,是守护进程。内核交换守护进程。
...脑具有出色的性能、超长的电池寿命和较长的耐用性。Mac上的硬件很难匹配,这使得它成为运行Linux的强大机器。 ...
...这些命令。!重复最近使用的命令。你可以用!n重复历史上的第n个命令或!-重复n个命令之前发生的事情。男人显示终端程序的手册。什么显示终端程序的简要说明。一个简单的替代人的命令。别名创建命令的快捷方式,或与cd...
...文件是在2020年1月20日从另一台计算机复制到这台计算机上的,并且两个时间戳都是在那时更新的。 要同时查看所有时间戳,请使用stat命令,如下所示: stat dp.c 时区列在显示屏底部。如你所见,它们有一个非常精确的分数秒分...
...录的元数据,包括它们在硬盘驱动器(或虚拟文件系统)上的位置、文件大小和文件的时间戳。 dentry:dentry(目录条目)是保存目录列表信息的结构。可以将其视为目录中文件和目录的inode列表。 您可以理解为什么将用于缓冲...
...是一个与您的用户名共享同一名称的组,是在您作为系统上的用户创建时创建的。 可以使用chown命令将所有权值更改为其他值。您可以设置新所有者、新组或同时设置新所有者和新组。文件的所有者可以更改组所有权,但只有roo...
... 相关:如何从文件中提取文件。焦油.gz或者。焦油bz2Linux上的文件 有几种方法可以做到这一点。如果右键单击该文件,将出现上下文菜单。从菜单中选择“Extract Here”。 如果您的上下文菜单没有“Extract Here”选项,请关闭它并...