linux上的交换是什么?(以及如何更改)

Linux swappeiness值与交换开始前使用了多少RAM无关。这是一个被广泛报道和普遍相信的错误。我们解释它到底是什么。...

Linux swappeiness值与交换开始前使用了多少RAM无关。这是一个被广泛报道和普遍相信的错误。我们解释它到底是什么。

破除关于世外桃源的神话

交换是一种将随机存取存储器(RAM)中的数据写入硬盘上的特殊位置(交换分区或交换文件)以释放RAM的技术。

Linux有一个称为交换值的设置。关于这个设置控制什么,有很多困惑。对交换性最常见的错误描述是,它为RAM使用设置了一个阈值,当使用的RAM数量达到该阈值时,交换就开始了。

这是一个经常被重复的错误观念,现在它已被接受为智慧。如果(几乎)其他人都告诉你交换就是这样工作的,为什么你要相信我们说不是这样的呢?

很简单。我们要证明这一点。

你的公羊被分成几个区域

Linux不认为RAM是一个大的同质内存池。它认为它被划分为若干不同的区域,称为区域。计算机上存在哪些区域取决于它是32位还是64位。下面是x86体系结构计算机上可能的区域的简化描述。

  • 直接内存访问(DMA):这是低16 MB的内存。这个区域之所以得名是因为,很久以前,有一些计算机只能直接访问这个物理内存区域。
  • 直接内存访问32:尽管有它的名字,直接内存访问32(DMA32)是一个只有在64位Linux中才能找到的区域。内存不足4GB。运行在32位计算机上的Linux只能对这个数量的RAM执行DMA(除非它们使用的是物理地址扩展(PAE)内核),这就是区域的名称。不过,在32位计算机上,它被称为HighMem。
  • 正常:在64位计算机上,正常内存是4GB以上的所有RAM(大约)。在32位机器上,它的RAM介于16 MB和896 MB之间。
  • HighMem:这只存在于32位Linux计算机上。它的所有RAM都在896MB以上,包括足够大的机器上4GB以上的RAM。

pagesize值

RAM以固定大小的页面分配。这个大小是由内核在引导时通过检测计算机的体系结构来确定的。通常,Linux计算机上的页面大小是4KB。

可以使用getconf命令查看页面大小:

getconf PAGESIZE

linux上的交换是什么?(以及如何更改)

分区附着到节点

分区附着到节点。节点与中央处理器(CPU)相关联。内核将尝试从与CPU相关联的节点为CPU上运行的进程分配内存。

将节点绑定到CPU的概念允许在专业多CPU计算机中安装混合内存类型,使用非统一内存访问体系结构。

这些都是非常高端的。一般的Linux计算机只有一个节点,称为node zero。所有区域都将属于该节点。要查看计算机中的节点和区域,请查看/proc/buddyinfo文件。我们将使用更少的资源:

less /proc/buddyinfo

linux上的交换是什么?(以及如何更改)

这是本文研究的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区域,从左侧读取:

  • 2:内存块有2个,共2个^(0*PAGESIZE)。
  • 67:有67个2^(1*页大小)内存块。
  • 58:有58个2^(2*PAGESIZE)内存块可用。
  • 等等,一直到…
  • 17:有17个2^(512*PAGESIZE)块。

但实际上,我们查看这些信息的唯一原因是查看节点和区域之间的关系。

文件页和匿名页

内存映射使用页表条目集来记录哪些内存页被使用,以及用于什么目的。

内存映射可以是:

  • 文件备份:文件备份映射包含已从文件中读取的数据。它可以是任何类型的文件。需要注意的重要一点是,如果系统释放了这个内存,并且需要再次获取该数据,则可以再次从文件中读取该数据。但是,如果数据在内存中发生了更改,则需要将这些更改写入硬盘上的文件,然后才能释放内存。如果没有发生这种情况,这些变化就会消失。
  • 匿名:匿名内存是一个没有文件或设备支持的内存映射。这些页可能包含程序动态请求的内存,用于保存数据,或用于堆栈和堆之类的内容。因为这种类型的数据后面没有文件,所以必须留出一个特殊的位置来存储匿名数据。该位置是交换分区或交换文件。在释放匿名页之前,将匿名数据写入交换。
  • 设备备份:通过块设备文件对设备进行寻址,这些文件可以被视为文件。数据可以从中读取和写入。设备支持的内存映射包含存储在其中的设备的数据。
  • 共享:多个页表条目可以映射到RAM的同一页。通过任何映射访问内存位置都将显示相同的数据。通过改变这些共同监视的内存位置中的数据,不同的进程可以非常有效地相互通信。共享可写映射是实现高性能进程间通信的常用方法。
  • 写时拷贝:写时拷贝是一种延迟分配技术。如果请求已在内存中的资源的副本,则通过返回到原始资源的映射来满足请求。如果“共享”资源的某个进程试图写入该资源,则必须在内存中真正复制该资源,以便对新副本进行更改。因此,内存分配只在第一个写命令时进行。

对于交换,我们只需要关注列表中的前两个:文件页和匿名页。

交换

以下是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表示“匿名优先级”。

  • anonèprio变量被设置为Linux交换值。
  • “文件优先级”值设置为200减去“非优先级”值。

这些变量保存的值是串联工作的。如果两者都设置为100,则它们相等。对于任何其他值,non\u prio将从100减少到0,file\u prio将从100增加到200。这两个值输入到一个复杂的算法中,该算法确定Linux内核运行时是优先回收(释放)文件页还是匿名页。

您可以将文件优先权视为系统愿意释放文件页,而非优先权视为系统愿意释放匿名页。这些值所不做的是为何时使用swap设置任何类型的触发器或阈值。那是在别处决定的。

但是,当需要释放内存时,回收和交换算**考虑这两个变量及其比率,以确定优先考虑释放哪些页类型。这决定了关联的硬盘活动是为文件页处理文件还是为匿名页交换空间。

交换什么时候开始?

我们已经确定,Linux swappeiness值为将被扫描以进行潜在回收的内存页类型设置了一个首选项。这很好,但必须有一些事情来决定何时进行互换。

每个记忆区域都有一个高水位线和一个低水位线。这些是系统派生的值。它们是每个区域内存的百分比。正是这些值被用作交换触发阈值。

要检查高水位线和低水位线,请使用以下命令查看/proc/zoneinfo文件:

less /proc/zoneinfo

linux上的交换是什么?(以及如何更改)

每个区域都有一组以页为单位的内存值。以下是测试机器上DMA32区域的值。低水位线13966页,高水位线16759页:

linux上的交换是什么?(以及如何更改)

  • 在正常运行条件下,当区域中的可用内存降至该区域的低水位线以下时,swap算法开始扫描内存页,寻找可以回收的内存,同时考虑anon\u prio和file\u prio的相对值。
  • 如果Linux swappiness值设置为零,则当文件页和空闲页的组合值小于高水位线时,将发生交换。

因此,您可以看到,不能使用Linux swappeiness值来影响swap在RAM使用方面的行为。只是不能这样。

swapiness应该设置为什么?

这取决于硬件、工作负载、硬盘类型,以及您的计算机是台式机还是服务器。显然,这不会是一个一刀切的设置类型。

您必须记住,当内存空间耗尽时,swap不仅仅是一种释放RAM的机制。Swap是一个功能良好的系统的重要组成部分,没有它,Linux就很难实现合理的内存管理。

更改Linux swappeiness值会立即生效;您不需要重新启动。所以你可以做一些小的调整并监控效果。理想情况下,你可以在几天内,在电脑上进行不同类型的活动,试图找到最接近理想的设置。

需要考虑以下几点:

  • 尝试通过将Linux swappeiness值设置为零来“禁用交换”只会将交换关联的硬盘驱动器活动转换为文件关联的硬盘驱动器活动。
  • 如果您有老化的机械硬盘,您可以尝试降低Linux的swappiness值,以避免匿名页面回收,并减少交换分区的变动。当然,当你调低一个设置时,另一个设置就会增加。减少交换流失可能会增加文件系统流失。但是你的电脑可能更喜欢一种方法而不是另一种方法。真的,唯一确定的方法就是试试看。
  • 对于单用途服务器(如数据库服务器),您可以从数据库软件供应商处获得指导。通常,这些应用程序都有自己专门设计的文件缓存和内存管理例程,您最好依赖这些例程。软件供应商可能会根据机器规格和工作负载建议Linux交换值。
  • 对于拥有最新硬件的普通桌面用户来说?保持原样。

如何设置linux交换值

在更改交换值之前,您需要知道它的当前值是什么。如果你想减少一点,问题是比什么少一点?使用此命令可以找到:

cat /proc/sys/vm/swappiness

linux上的交换是什么?(以及如何更改)

要配置交换性值,请使用sysctl命令:

sudo sysctl vm.swappiness=45

linux上的交换是什么?(以及如何更改)

直接使用新值,不需要重新启动。

事实上,如果重新启动,交换值将返回到其默认值60。当您完成实验并决定要使用的新值后,您可以通过将它添加到/etc来使它在重新启动期间保持不变/系统控制组态文件。你可以用你喜欢的编辑器。使用以下命令使用nano编辑器编辑文件:

sudo nano /etc/sysctl.conf

linux上的交换是什么?(以及如何更改)

当nano打开时,滚动到文件的底部并添加这一行。我们用35作为永久交换值。你应该替换你想要使用的值。

vm.swappiness=35

linux上的交换是什么?(以及如何更改)

要保存更改并退出nano,请按“Ctrl+O”,按“Enter”,然后按“Ctrl+Z”

内存管理很复杂

内存管理很复杂。这就是为什么,对于普通用户来说,由内核决定通常更好。

很容易让人觉得你用的内存比你用的多。像top和free这样的实用程序可能会给人错误的印象。Linux将使用免费的RAM来实现它自己的各种目的,比如磁盘缓存。这就人为地提高了“已用”内存的数值,降低了“空闲”内存的数值。实际上,用作磁盘缓存的RAM同时被标记为“已用”和“可用”,因为它可以在任何时候很快地被回收。

对于外行来说,可能看起来swap不起作用,或者swappeiss值需要更改。

和往常一样,细节才是关键。或者,在本例中,是守护进程。内核交换守护进程。

  • 发表于 2021-04-02 20:43
  • 阅读 ( 178 )
  • 分类:互联网

你可能感兴趣的文章

如何在mac上安装和双引导linux

...脑具有出色的性能、超长的电池寿命和较长的耐用性。Mac上的硬件很难匹配,这使得它成为运行Linux的强大机器。 ...

  • 发布于 2021-03-18 04:03
  • 阅读 ( 376 )

linux下如何重命名文件

...鼠标或触摸板,然后选择rename。然后您将看到使用模板或交换文本字符串重命名文件的选项。 ...

  • 发布于 2021-03-22 02:48
  • 阅读 ( 268 )

linux命令参考备忘单

...这些命令。!重复最近使用的命令。你可以用!n重复历史上的第n个命令或!-重复n个命令之前发生的事情。男人显示终端程序的手册。什么显示终端程序的简要说明。一个简单的替代人的命令。别名创建命令的快捷方式,或与cd...

  • 发布于 2021-03-22 04:06
  • 阅读 ( 229 )

如何在windows、mac和linux上禁用usb存储设备

... 如何限制mac上的u**存储设备 ...

  • 发布于 2021-03-26 07:27
  • 阅读 ( 652 )

如何在linux终端中查看和更改引导序列

... 这将显示计算机上的所有启动设备,类似于: ...

  • 发布于 2021-03-27 06:23
  • 阅读 ( 200 )

如何更改linux密码

...的系统用户名是什么,可以使用以下命令查找,列出系统上的所有用户帐户: ...

  • 发布于 2021-03-28 02:28
  • 阅读 ( 185 )

linux文件时间戳:atime、mtime和ctime

...文件是在2020年1月20日从另一台计算机复制到这台计算机上的,并且两个时间戳都是在那时更新的。 要同时查看所有时间戳,请使用stat命令,如下所示: stat dp.c 时区列在显示屏底部。如你所见,它们有一个非常精确的分数秒分...

  • 发布于 2021-04-02 16:01
  • 阅读 ( 336 )

如何在linux上使用free命令

...录的元数据,包括它们在硬盘驱动器(或虚拟文件系统)上的位置、文件大小和文件的时间戳。 dentry:dentry(目录条目)是保存目录列表信息的结构。可以将其视为目录中文件和目录的inode列表。 您可以理解为什么将用于缓冲...

  • 发布于 2021-04-02 19:12
  • 阅读 ( 175 )

如何在linux上使用chown命令

...是一个与您的用户名共享同一名称的组,是在您作为系统上的用户创建时创建的。 可以使用chown命令将所有权值更改为其他值。您可以设置新所有者、新组或同时设置新所有者和新组。文件的所有者可以更改组所有权,但只有roo...

  • 发布于 2021-04-03 05:00
  • 阅读 ( 160 )

如何在linux上安装和使用tor浏览器

... 相关:如何从文件中提取文件。焦油.gz或者。焦油bz2Linux上的文件 有几种方法可以做到这一点。如果右键单击该文件,将出现上下文菜单。从菜单中选择“Extract Here”。 如果您的上下文菜单没有“Extract Here”选项,请关闭它并...

  • 发布于 2021-04-03 12:04
  • 阅读 ( 298 )
xjdx7775
xjdx7775

0 篇文章

相关推荐