2015-01-14 31 views
18

編輯:我更新了我的問題,我的基準如何在Linux上使用Intel Westmere 1GB頁面?

的細節爲了確定基準點,我想設置1GB的頁面在兩個英特爾至強56XX(「Westmere處理器」)上運行的處理器的Linux的3.13系統。爲此,我修改了我的啓動參數以添加對1GB頁面(10頁)的支持。這些引導參數僅包含1GB頁面,而不包含2MB頁面。運行hugeadm --pool-list導致:

 Size Minimum Current Maximum Default 
1073741824  10  10  10  * 

我的內核啓動參數被考慮在內。在我的基準我的,我要使用到由1GiB巨大的頁面進行備份內存分配1GiB:

#define PROTECTION (PROT_READ | PROT_WRITE) 
#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) 
uint64_t size = 1UL*1024*1024*1024; 
memory = mmap(0, size, PROTECTION, FLAGS, 0, 0); 
if (memory == MAP_FAILED) { 
    perror("mmap"); 
    exit(1); 
} 
sleep(200) 

望着/proc/meminfo而替補在睡覺(sleep調用以上),我們可以看到一個巨大的頁面已經被分配:

AnonHugePages:  4096 kB 
HugePages_Total:  10 
HugePages_Free:  9 
HugePages_Rsvd:  0 
HugePages_Surp:  0 
Hugepagesize: 1048576 kB 

注:我禁用THP(通過/sys文件系統)運行在板凳前,所以我想AnonHugePages場由/proc/meminfo報道表示通過THP befo分配的大內存頁重新停止它。

在這一點上,我們可以認爲一切都很好,但不幸的是,我的板凳讓我認爲許多2MiB頁面被使用,而不是一個1GiB頁面。這裏是解釋:

這個工作臺通過指針的追逐隨機訪問分配的內存:第一步填充內存以啓用指針追逐(每個單元格指向另一個單元格),然後在第二步中,工作臺通過內存導航

pointer = *pointer; 

使用perf_event_open系統調用,我指望數據TLB讀取只有替補的第二步失誤。當內存分配大小爲64MiB時,我計算一個非常小的數字,即我的6400000內存訪問中的0,01%,數據TLB讀取未命中。所有的訪問都保存在TLB中。換句話說,64MiB的內存可以保存在TLB中。只要分配的內存大小大於64 MiB,我會看到數據tlb讀取未命中。對於內存大小等於128 MiB,我有我的6400000內存訪問的50%,在TLB中錯過。 64MiB的大小似乎可以適合TLB和64MiB = 32個條目(如下面報告的)* 2MiB頁面。我得出結論,我沒有使用1GiB頁面,而是2MiB頁面。

你能看到有關該行爲的任何解釋嗎?

此外,cpuid工具,報告了以下關於我的系統上的TLB:

cache and TLB information (2): 
     0x5a: data TLB: 2M/4M pages, 4-way, 32 entries 
     0x03: data TLB: 4K pages, 4-way, 64 entries 
     0x55: instruction TLB: 2M/4M pages, fully, 7 entries 
     0xb0: instruction TLB: 4K, 4-way, 128 entries 
     0xca: L2 TLB: 4K, 4-way, 512 entries 
    L1 TLB/cache information: 2M/4M pages & L1 TLB (0x80000005/eax): 
    L1 TLB/cache information: 4K pages & L1 TLB (0x80000005/ebx): 
    L2 TLB/cache information: 2M/4M pages & L2 TLB (0x80000006/eax): 
    L2 TLB/cache information: 4K pages & L2 TLB (0x80000006/ebx): 

正如你所看到的,這是毫無1GiB頁的信息。 TLB中可以緩存多少個這樣的頁面?

+1

你可以使用'mmap(...,MAP_ANON | MAP_HUGETLB)'嗎? – abligh

+0

@abligh它以「無法分配內存」失敗 –

+0

您是否有巨大的頁面支持編譯到您的內核? – abligh

回答

18

TL; DR

你(特別是你的處理器)不能在這種情況下1GB頁面中獲益,但你的代碼是正確的,而不修改系統上,可以。

長版本

我按照這些步驟嘗試重現您的問題。

My System: Intel Core i7-4700MQ, 32GB RAM 1600MHz, Chipset H87 
  1. svn co https://github.com/ManuelSelva/c4fun.git
  2. cd c4fun.git/trunk
  3. make。發現了一些依賴需要。安裝它們。建設失敗,但mem_load沒有建立和聯繫,所以沒有進一步追求休息。
  4. 重新啓動系統,在GRUB時追加到以下引導參數:

    hugepagesz=1G hugepages=10 default_hugepagesz=1G 
    

    其中保留10頁1GB。

  5. cd c4fun.git/trunk/mem_load
  6. 然多次試驗使用memload,在隨機存取圖案模式,並將其釘扎到芯3,這恐怕是不爲0(引導處理器)。

    • ./mem_load -a rand -c 3 -m 1073741824 -i 1048576

      這導致大約零TLB缺失。

    • ./mem_load -a rand -c 3 -m 10737418240 -i 1048576

      這導致大約60%的TLB未命中。在一種預感,我做

    • ./mem_load -a rand -c 3 -m 4294967296 -i 1048576

      這導致大約零TLB缺失。在一種預感,我做

    • ./mem_load -a rand -c 3 -m 5368709120 -i 1048576

      這導致約20%的TLB缺失。

在這一點上我下載了cpuid效用。它給了我cpuid -1 | grep -i tlb

cache and TLB information (2): 
     0x63: data TLB: 1G pages, 4-way, 4 entries 
     0x03: data TLB: 4K pages, 4-way, 64 entries 
     0x76: instruction TLB: 2M/4M pages, fully, 8 entries 
     0xb5: instruction TLB: 4K, 8-way, 64 entries 
     0xc1: L2 TLB: 4K/2M pages, 8-way, 1024 entries 
    L1 TLB/cache information: 2M/4M pages & L1 TLB (0x80000005/eax): 
    L1 TLB/cache information: 4K pages & L1 TLB (0x80000005/ebx): 
    L2 TLB/cache information: 2M/4M pages & L2 TLB (0x80000006/eax): 
    L2 TLB/cache information: 4K pages & L2 TLB (0x80000006/ebx): 

正如你所看到的,我的TLB有4個1GB頁的條目。這很好地解釋了我的結果:對於1GB和4GB場館,TLB的4個插槽完全足以滿足所有訪問。對於5GB競技場和隨機訪問模式模式,5個頁面中的4個只能通過TLB進行映射,因此在剩餘的一個追蹤指針會導致錯過。將指針追加到未映射頁面的概率是1/5,因此我們預期1/5 = 20%的遺漏率,我們可以得到這個結果。對於10GB,4/10頁被映射,6/10不是這樣,錯過率將是6/10 = 60%,我們得到了。

因此,您的代碼至少在我的系統上無需修改即可運行。那麼你的代碼似乎沒有問題。

然後我對CPU-World做了一些研究,雖然並非所有的CPU都列有TLB幾何數據,但有些是。我看到的唯一一個與您的cpuid打印輸出完全匹配(可能更多)的是Xeon Westmere-EP X5650; CPU-World沒有明確表示Data TLB0具有1GB頁面的條目,但確實表示處理器具有「1 GB大頁面支持」。

然後我做了更多的研究並最終確定了它。 RealWorldTech的一位作者在討論Sandy Bridge的內存子系統時做出了一個(不可否認的是,我還沒有找到這方面的資料)。它讀取as follows

地址生成後,微指令將訪問DTLB翻譯從虛擬到物理地址,平行的高速緩存訪​​問的開始。 DTLB大部分保持不變,但1GB頁面的支持有所改善。 此前,Westmere增加了對1GB頁面的支持,但由於TLB沒有任何1GB頁面條目,因此將1GB頁面分割成許多2MB頁面。 Sandy Bridge爲DTLB中的1GB頁面添加4個專用條目。

(強調)

結論

無論模糊的概念「CPU支持1GB頁面」表示,英特爾認爲這並不意味着「TLB支持1GB頁面項」。恐怕您無法在英特爾Westmere處理器上使用1GB頁面來減少TLB未命中數量。

也就是說,英特爾或通過區分(在TLB)從大頁巨大的網頁矇騙我們。

+2

感謝您的研究和解答,並感謝stackoverflow ;-) –

相關問題