Documentation/translations/zh_TW/admin-guide/mm/ksm.rst

Source file repositories/reference/linux-study-clean/Documentation/translations/zh_TW/admin-guide/mm/ksm.rst

File Facts

System
Linux kernel
Corpus path
Documentation/translations/zh_TW/admin-guide/mm/ksm.rst
Extension
.rst
Size
10223 bytes
Lines
200
Domain
Support Tooling And Documentation
Bucket
Documentation
Inferred role
Support Tooling And Documentation: documentation
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

.. include:: ../../disclaimer-zh_TW.rst

:Original: Documentation/admin-guide/mm/ksm.rst

:翻譯:

  徐鑫 xu xin <xu.xin16@zte.com.cn>


============
內核同頁合併
============


概述
====

KSM是一種能節省內存的數據去重功能,由CONFIG_KSM=y啓用,並在2.6.32版本時被添
加到Linux內核。詳見 ``mm/ksm.c`` 的實現,以及http://lwn.net/Articles/306704
和https://lwn.net/Articles/330589

KSM最初目的是爲了與KVM(即著名的內核共享內存)一起使用而開發的,通過共享虛擬機
之間的公共數據,將更多虛擬機放入物理內存。但它對於任何會生成多個相同數據實例的
應用程序都是很有用的。

KSM的守護進程ksmd會定期掃描那些已註冊的用戶內存區域,查找內容相同的頁面,這些
頁面可以被單個寫保護頁面替換(如果進程以後想要更新其內容,將自動複製)。使用:
引用:`sysfs intraface  <ksm_sysfs>` 接口來配置KSM守護程序在單個過程中所掃描的頁
數以及兩個過程之間的間隔時間。

KSM只合並匿名(私有)頁面,從不合並頁緩存(文件)頁面。KSM的合併頁面最初只能被
鎖定在內核內存中,但現在可以就像其他用戶頁面一樣被換出(但當它們被交換回來時共
享會被破壞: ksmd必須重新發現它們的身份並再次合併)。

以madvise控制KSM
================

KSM僅在特定的地址空間區域時運行,即應用程序通過使用如下所示的madvise(2)系統調
用來請求某塊地址成爲可能的合併候選者的地址空間::

    int madvise(addr, length, MADV_MERGEABLE)

應用程序當然也可以通過調用::

    int madvise(addr, length, MADV_UNMERGEABLE)

來取消該請求,並恢復爲非共享頁面:此時KSM將去除合併在該範圍內的任何合併頁。注意:
這個去除合併的調用可能突然需要的內存量超過實際可用的內存量-那麼可能會出現EAGAIN
失敗,但更可能會喚醒OOM killer。

如果KSM未被配置到正在運行的內核中,則madvise MADV_MERGEABLE 和 MADV_UNMERGEABLE
的調用只會以EINVAL 失敗。如果正在運行的內核是用CONFIG_KSM=y方式構建的,那麼這些
調用通常會成功:即使KSM守護程序當前沒有運行,MADV_MERGEABLE 仍然會在KSM守護程序
啓動時註冊範圍,即使該範圍不能包含KSM實際可以合併的任何頁面,即使MADV_UNMERGEABLE
應用於從未標記爲MADV_MERGEABLE的範圍。

如果一塊內存區域必須被拆分爲至少一個新的MADV_MERGEABLE區域或MADV_UNMERGEABLE區域,
當該進程將超過 ``vm.max_map_count`` 的設定,則madvise可能返回ENOMEM。(請參閱文檔
Documentation/admin-guide/sysctl/vm.rst)。

與其他madvise調用一樣,它們在用戶地址空間的映射區域上使用:如果指定的範圍包含未
映射的間隙(儘管在中間的映射區域工作),它們將報告ENOMEM,如果沒有足夠的內存用於
內部結構,則可能會因EAGAIN而失敗。

KSM守護進程sysfs接口
====================

KSM守護進程可以由``/sys/kernel/mm/ksm/`` 中的sysfs文件控制,所有人都可以讀取,但
只能由root用戶寫入。各接口解釋如下:

Annotation

Implementation Notes