我应该配置什么合理的 swappiness 值才能获得更好的性能?

我应该配置什么合理的 swappiness 值才能获得更好的性能?

在Android系统优化过程中,swappiness值的配置至关重要。价值路径是/proc/sys/vm/swappiness.一些消息来源建议将其设置为 60,而另一些消息来源建议将其设置为 120。一些消息来源声称其最大值是 100,而另一些消息来源则声称它是 200,这让我感到困惑。

如何确认我的系统支持的最大值?

我可以在 Stack Overflow 上找到的链接:

答案1

在5.8之前的内核版本上最大值为swappiness100,在内核上该值增加到2005.8

如果您仔细阅读链接中的答案(并且在谷歌中可以找到大量其他类似的问题和文章),您会发现没有任何其中提供最佳价值。这取决于确切的工作负载及其在运行操作系统的计算机上的特定行为,并且只需要一些基准测试。

通常默认值(60)是最平衡的。

尽管您链接中的答案解释了如何swappiness影响系统,但我会尽力使其更简单,而无需其他人添加到答案中的计算和数字,使它们更精确,但可能更难以阅读。

如果您希望以极其简化的方式了解其要点(只是为了使其更直观),您可以说您的 RAM 包含两种主要类型的页面:

  1. 匿名的页,这只是进程使用的“常规”内存。这是用于处理动态数据(例如变量)的内存。
  2. 文件支持的内存, 或者页面缓存(我不会讨论其中的区别)。这用于将磁盘中的文件缓存到内存中。通常直接从磁盘读取文件的成本是相当高的,所以通常内核将从磁盘读取的数据保存在其 Page 缓存中,这样下次从该文件读取数据时,就可以直接从RAM,您将不需要再次访问磁盘。这极大地加快了从磁盘读取文件的速度。

当内存压力很大,并且内核需要释放 RAM 中的一些空间时,它面临一个艰难的决定:

  1. 它应该清除文件支持的内存吗?这会非常快地清除新页面的内存,但是如果您再次访问该文件,您将需要从磁盘中再次读取它,这是昂贵的。
  2. 它应该换出一些匿名页面吗?也许有一些不活动的页面已经很长时间没有使用过,并且可能很长时间不会被进程需要,所以最好将其写入交换区,并将文件缓存保留在内存中以保存额外的输入/输出?

swappiness暗示内核应该更喜欢什么。值“0”告诉内核尽可能避免交换匿名页面,并始终清除文件回存内存/缓存以腾出更多空间。你增加的越多,你的匿名内存被换出的机会就越大,并且文件支持的内存会受到青睐。在 > 5.8 的内核上,值为 200 意味着它应该始终优先交换出匿名页面并将文件支持的内存保留在 RAM 中。

这就是为什么推荐值取决于许多不同的因素,例如工作负载类型、I/O 速度和交换速度。

  • 对于运行数据库的服务器,通常建议将交换性降低到 0,因为数据库能够将所有数据保留在 RAM 中以确保高性能至关重要。
  • 如果您执行大量 I/O 并且磁盘速度相对较慢,swappiness并且您的进程有大量可能不会使用的不活动内存页面,您可能更愿意增加以尽可能减少 I/O。
    • 在正在使用的机器上zswap,其中交换被压缩并存储在 RAM 中的专用部分(而不是磁盘)中,交换的成本甚至更低,因此也许可以优先考虑交换而不是从 RAM 中清除文件数据。

但底线是:没有一般推荐值。对于标准情况和工作负载,默认值应该没问题。如果您发现交换过多或 I/O 过多,您可能需要仔细调整该值,但必须对其进行测试。只需更改该值并检查它如何影响机器的性能,直到达到最适合您的特定机器和工作负载的状态。

相关内容