Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

swappiness 的作用是什么?它如何影响 swap_tendency?

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux 4 和更高版本

Issue

  • swappiness 的作用是什么?它如何影响 swap_tendency?

Resolution

  • Swappiness 是 Linux 内核的一个属性。使用它可以调整:通过把运行时内存交换到交换空间,或通过删除系统缓存中的内存页来获得更多内存之间的平衡。Swappiness 可以被设置为 0 到 100 之间的一个值(包括 0 和 100)。一个小的值意味着内核会尽量避免使用交换空间,而一个大的值意味着内存会尽量主动使用交换空间。

  • 内核通过两种方式获得可用内存页 - 从页缓存中获得,或把进程所使用的内存交换到交换分区中。使用这个参数可以设置这两种方法的平衡点,从而达到所需的效果。获取内存页的代码会计算以下数据:

    • distress 的值。它代表了内核获取可用内存的“苦恼程度”。当内核第一次试图获取内存页时,它的值被设置为 0,如果需要更多尝试,则这个值会相应增加,直到达到了它的最大值 (100)。
    • mapped_ratio 的值。它代表了在一个指定的内存区中已被映射的内存(比如进程地址空间的一部分)占系统总内存的百分比。

    • vm_swappiness 的值。它就是 swappiness 参数,默认值是 60。

    • 通过这些值,内核计算出它的 "swap tendency":

    swap_tendency = mapped_ratio/2 + distress + vm_swappiness;
    
    • 如果 swap_tendency 的值小于 100,内核只会通过页缓存获取可用内存。如果这个值大于 100,内核同时会把进程地址空间的一部分考虑为可以用来获取内存的部分。因此,如果系统的 distress 值较低,swappiness 的值为 60,则系统在总内存的 80% 已被分配前,不会通过交换进程的内存来获取可用内存。如果用户不希望应用程序的内存被交换,则可以把 swappiness 设置为一个较低的值(如 5 或 10)。这样,在 distress 值达到非常高的值以前,内核都不会对进程使用的内存进行交换。
  • 总体来讲,增加这个值会使系统更多地使用交换空间而不是缓存来获得可用内存,从而使缓存可以有更多的可用空间。反之,减小这个值会使系统更少地依赖交换空间,从而可以提高应用程序的性能。

  • 如果对 vm.swappiness 的值进行了不当调整,可能会影响到系统性能。另外,对这个值进行调整可能在不同工作负载环境中会有不同的效果。因此,在对这个参数进行调整时,推荐每次只对它的值进行微小调整,并在和实际工作负载相同的环境中进行测试。

Root Cause

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments