2012-09-13 20 views
0

我正在一臺Linux機器上編寫一個C程序,它需要分配一個10到20 GB的巨大數組。查找內核的內存頁面所有權

分配空間後,我想知道哪個內核擁有該數組的哪個頁面。 「擁有」,我的意思是哪個核心是負責哪個頁面的連貫性。

是否有任何函數或shell命令來獲取此信息?

注:我使用Debian與gcc4.7。

回答

1

您可以使用move_pages()numa_tonode_memory()來設置所有權。

+0

我正在查看似乎能夠獲取當前所有權信息的move_pages。看來它會做我想做的事情。謝謝! – Rakib

2

當你分配內存時,內核通常只分配虛擬內存;內容(RAM頁面)僅在第一次訪問時填充。如果驅逐到文件(文件支持的內存映射)或交換(所有其他內存),它們將在驅逐後的下一次訪問中重新填充。這意味着進程分配的每一頁內存可能不存在(按照慣例,它將在第一次訪問時讀爲零),在RAM中,或者被驅逐(到磁盤或其他非RAM存儲介質)。

在標準的多核/多CPU機器上,「所有權」是在高速緩存線的基礎上確定的,高速緩存線通常是兩個16位和256字節之間的小冪。每個CPU「擁有」它最後觸及的緩存行。隨着進程的運行,CPU和內核運行代碼,從而訪問代碼,發生變化,因此沒有固定的「所有者」;它動態變化。而且,管理通常由特定芯片,內存管理單元或MMU完成,而不是由CPU運行的代碼完成。 (MMU現在經常集成到CPU中)。您可以將進程固定在僅運行某些CPU內核或核心的CPU上,並根據該CPU核心擁有哪個內存。我想有些MMU可能有辦法報告它給哪個CPU內核的緩存線 - 儘管我嚴重懷疑這在實踐中是可行的。

CPU核心「擁有」內存的整個想法是非常奇怪的。我認爲Linux內核本身甚至不會跟蹤哪個CPU內核觸及了哪個頁面,它當然不會跟蹤哪個CPU內核已觸及哪個緩存行。 (跟蹤會消耗太多內存,並且基本上沒有任何好處。)

有分佈式內核(至少是Linux內核的補丁)以及其他一些方法來構建集羣,其中內存和CPU分佈在多臺物理機器上,但對進程看起來是統一的 - 就像它們在單臺物理機器上運行一樣。在這種情況下,可以向管理方查詢哪個物理節點擁有哪個CPU和哪些內存頁面。如果這是您的情況,您需要詳細描述您使用的內核和工具,因爲管理工具各不相同。

+0

很好的解釋。我在一臺服務器機器上安裝了4個處理器芯片,每個芯片上有8個內核,共計32個內核。我對分佈式內核瞭解不多。這只是普通的Debian 6.0.5。內核是2.6.32。我一直認爲這些頁面是由首先觸摸頁面的核心所擁有的。這不正確嗎?順便說一下,我正在嘗試對不同內核使用親和力的pthread,以便首先觸摸不同的頁面來分配所有權。 – Rakib

+0

不,所有權處於緩存線級別,並且每時每刻都在變化。服務器主板有額外的電路,可以保持獨立CPU中的高速緩存一致,所以在最糟糕的情況下你只能看到放緩。通常硬件描述拓撲;如果有的話,Linux內核使用它來避免那些CPU到CPU的慢速傳輸(如果可以的話)。最好讓內核擔心這些細節。簡單的測試也應該證明這是最好的策略。 –