編輯:我更新了我的問題,我的基準如何在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中可以緩存多少個這樣的頁面?
你可以使用'mmap(...,MAP_ANON | MAP_HUGETLB)'嗎? – abligh
@abligh它以「無法分配內存」失敗 –
您是否有巨大的頁面支持編譯到您的內核? – abligh