.. _page_migration:
========
分頁遷移
========
頁面遷移可以在程序運行時,在 NUMA 系統中的不同節點間,
移動分頁的實體記憶體位置;這意味著,程序所看到的虛擬位址是不變的。
然而,系統會重新排列這些分頁的實體位置。
分頁遷移的主要目的是,把分頁移動到,
與存取該分頁的程序執行時,所在的處理器較近的位置,
以減少存取記憶體的延遲。
分頁遷移使一個程序可以透過 MF_MOVE 和 MF_MOVE_ALL 選項手
動重新定位其分頁所在的節點,
並同時透過 mbind() 來設置新的記憶體策略。
程序分頁也可以透過 sys_migrate_pages(),從另一個程序重新定位過來。
migrate_pages() 函數接受兩組節點為參數,
並從來源節點移動分頁到目的節點。
分頁遷移功能由 Andi Kleen 的 numactl 工具包提供
(需要 0.9.3 以上的版本。
從ftp://oss.sgi.com/www/projects/libnuma/download/ 取得)。
numactl 提供 libnuma,
libnuma 提供了與其它 numa 功能相似的分頁遷移介面。
cat ``/proc/<pid>/numa_maps`` 可以簡單的查看程序所擁有的分頁位在何處。
另請參閱 proc(5) man page 中 numa_maps 的文件。
手動遷移是很有用的,
例如排程器已重新定位程序到一個較遠的處理器節點上的這個情境。
批次排程器或是管理程序可能會偵測到這個狀況,
並移動程序分頁更接近新的處理器。
核心本身只提供手動的分頁遷移。
自動分頁遷移可能可以透過,搬移分頁的使用者空間程序來實作。
“move_pages” 這個特殊的函數能夠在程序內移動個別的分頁。
NUMA 分析器(profiler)可能會,
例如(f.e. for example) 獲取頻繁的、非節點的存取日誌(log)
並可能使用日誌結果將分頁移動到更有利的位置。
較大的系統通常使用 cpuset 將系統劃分為多個節點區塊(section)。
Paul Jackson 為 cpuset 配備了
當一個任務正在被移動到另一個 cpuset 上,
也能移動分頁的能力
(見文件 /admin-guide/cgroup-v1/cpusets.rst)。
Cpusets 使得程序局部性可以自動化。
如果任務被移至一個新的 cpuset,它的所有分頁也隨之移動,
以使該過程的性能不會顯著下降。
如果 cpuset 允許的記憶體節點被更改,cpuset 內的程序分頁也會被移動。
分頁遷移能夠在一個節點群組中,
保留分頁的相對位置,以供所有的遷移技術使用,
即使是在程序遷移後,
也會保留一個生成的特定記憶體分配模式,
這是必要的步驟,以保留記憶體延遲。
遷移後程序將以大約相同的性能運行。
分頁遷移分幾個步驟進行。
首先是高階層地描述試圖從核心使用 migrate_pages() 的步驟;
(對於使用者空間的使用,
請參閱上面提到的 Andi Kleen 的 numactl 工具包)
然後是低階層地描述細節是如何運作的。
今天比較晚開始,先附上今天閱讀的翻譯,明天再來詳細的研究研究!
今天的文件很多子句接來接去的,真的有難懂XDDD
像是 Page migration allows the preservation of the relative location of pages within a group of nodes for all migration techniques which will preserve a particular memory allocation pattern generated even after migrating a process
;
The main intend of page migration ...
應該改為 main intension
,intend 好像只有動詞用法。... allowed memory nodes ...
可能是和 cgroup 有關的用語嗎(?