संपादित: मैं बेंचमार्क करने के लिए मेरी बेंचमार्कलिनक्स पर इंटेल वेस्टमेरे 1 जीबी पेज का उपयोग कैसे करें?
के विवरण के साथ मेरे सवाल का अद्यतन, मैं सेटअप 1GB पृष्ठों के लिए एक लिनक्स 3.13 दो इंटेल जिऑन 56xx ("Westmere") के शीर्ष पर प्रोसेसर चल प्रणाली में कोशिश कर रहा हूँ । इसके लिए मैंने 1 जीबी पृष्ठों (10 पेज) के लिए समर्थन जोड़ने के लिए अपने बूट पैरामीटर को संशोधित किया। इन बूट पैरामीटर में केवल 1 जीबी पेज होते हैं और 2 एमबी नहीं होते हैं।
Size Minimum Current Maximum Default
1073741824 10 10 10 *
मेरे कर्नेल बूट पैरामीटर को ध्यान में रखा जाता है: चल रहा है hugeadm --pool-list
की ओर जाता है। मेरी बेंचमार्क में मैं स्मृति है कि मैं का उपयोग कर एक 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
द्वारा रिपोर्ट befo THP द्वारा आवंटित विशाल पृष्ठों का प्रतिनिधित्व करता है इसे रोकना
इस बिंदु पर हम सोच सकते हैं कि सब ठीक है, लेकिन दुर्भाग्य से मेरी पीठ मुझे यह सोचने के लिए प्रेरित करती है कि कई 2 एमआईबी पेजों का उपयोग किया जाता है और एक 1 जीआईबी पृष्ठ नहीं। यहां स्पष्टीकरण दिया गया है:
यह बेंच पॉइंटर के पीछा के माध्यम से आवंटित स्मृति को यादृच्छिक रूप से एक्सेस करता है: पहला कदम स्मृति का पीछा करने के लिए स्मृति को भरता है (प्रत्येक सेल दूसरे सेल पर इंगित करता है) और दूसरे चरण में बेंच मेमोरी के माध्यम से स्मृति के माध्यम से नेविगेट करता है
pointer = *pointer;
perf_event_open
सिस्टम कॉल का उपयोग करना, मैं भरोसा कर रहा हूँ डेटा TLB केवल बेंच के दूसरे चरण के लिए छूट जाए पढ़ें। जब स्मृति आवंटित आकार 64 एमआईबी है, तो मुझे डेटा की टीएलबी पढ़ने की याद आती है, मेरी 6400000 मेमोरी एक्सेसों में से 0,01% की बहुत छोटी संख्या है। सभी एक्सेस टीएलबी में सहेजी जाती हैं। दूसरे शब्दों में, टीएलबी में 64 एमआईबी मेमोरी रखी जा सकती है। जैसे ही आवंटित स्मृति आकार 64 एमआईबी से अधिक है, मुझे डेटा टीएलबी पढ़ने की याद आती है। स्मृति आकार के लिए 128 एमआईबी के बराबर है, मेरे पास 6400000 मेमोरी एक्सेस का 50% है जो टीएलबी में चूक गया है। 64 एमआईबी आकार का प्रतीत होता है जो टीएलबी और 64 एमआईबी = 32 प्रविष्टियों में फिट हो सकता है (जैसा कि नीचे रिपोर्ट किया गया है) * 2 एमआईबी पेज। मैंने निष्कर्ष निकाला है कि मैं 1 जीआईबी पेजों का उपयोग नहीं कर रहा हूं लेकिन 2 एमआईबीबी हूं।
क्या आप उस व्यवहार के लिए कोई स्पष्टीकरण देख सकते हैं?
इसके अलावा, 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 पृष्ठों के बारे में कोई जानकारी नहीं है। टीएलबी में कितने पेज कैश किए जा सकते हैं?
क्या आप 'mmap (..., MAP_ANON | MAP_HUGETLB) 'का उपयोग कर सकते हैं? – abligh
@abligh यह "स्मृति आवंटित नहीं कर सकता" के साथ विफल रहता है –
क्या आपके पास अपने कर्नेल में संकलित विशाल पृष्ठ समर्थन है? – abligh