2010-05-20 9 views
18

आधुनिक x86 CPUs में विरासत 4K (यानी 2 एमबी या 4 एमबी) की तुलना में बड़े पेज आकारों का समर्थन करने की क्षमता है, और इस कार्यक्षमता तक पहुंचने के लिए ओएस सुविधाएं (Linux, Windows) हैं।बड़े परिदृश्य में कौन से परिस्थितियां एक गति उत्पन्न कर सकती हैं?

ऊपर दिए गए माइक्रोसॉफ्ट लिंक बड़े पृष्ठों को "अनुवाद बफर की दक्षता में वृद्धि करते हैं, जो अक्सर एक्सेस की गई स्मृति के प्रदर्शन को बढ़ा सकता है"। जो भविष्यवाणी करने में बहुत उपयोगी नहीं है कि बड़े पृष्ठ किसी भी स्थिति में सुधार करेंगे या नहीं। मुझे कंक्रीट में दिलचस्पी है, अधिमानतः मात्राबद्ध, विशाल पृष्ठों का उपयोग करने के लिए कुछ कार्यक्रम तर्क (या एक संपूर्ण अनुप्रयोग) को स्थानांतरित करने के उदाहरणों के परिणामस्वरूप कुछ प्रदर्शन सुधार हुआ है। किसी को भी सफलता की कहानियां मिलीं?

वहाँ एक विशेष मामले मैं myself के बारे में पता है: विशाल पृष्ठों का उपयोग dramatically समय एक बड़ी प्रक्रिया कांटा करने के लिए (संभवतः के रूप में नकल की आवश्यकता होगी, TLB अभिलेखों की संख्या 1000 के आदेश पर एक पहलू से कम हो जाता है) की जरूरत को कम कर सकते हैं। मुझे दिलचस्पी है कि विशाल विदेशी परिदृश्यों में विशाल पृष्ठ भी लाभ हो सकते हैं।

उत्तर

10

मैंने कुछ कोडों का विरोध करने की कोशिश की जो बड़े पृष्ठों से लाभ प्राप्त करने के लिए 4k पृष्ठों के साथ टीएलबी की थ्रैशिंग को अधिकतम कर देगा। नीचे दी गई सामग्री 2.6 गुना तेज (4K पृष्ठों से अधिक) जब 2 एमबीटीई पृष्ठ libhugetlbfs के malloc (इंटेल i7, 64 बिट डेबियन लेनी) द्वारा प्रदान की जाती हैं; उम्मीद है कि scoped_timer और random0n क्या करें।

volatile char force_result; 

    const size_t mb=512; 
    const size_t stride=4096; 
    std::vector<char> src(mb<<20,0xff); 
    std::vector<size_t> idx; 
    for (size_t i=0;i<src.size();i+=stride) idx.push_back(i); 
    random0n r0n(/*seed=*/23); 
    std::random_shuffle(idx.begin(),idx.end(),r0n); 

    { 
    scoped_timer t 
     ("TLB thrash random",mb/static_cast<float>(stride),"MegaAccess"); 
    char hash=0; 
    for (size_t i=0;i<idx.size();++i) 
     hash=(hash^src[idx[i]]); 
    force_result=hash; 
    } 

सिर्फ hash=hash^src[i] साथ एक सरल "सीधी रेखा" संस्करण केवल बड़े पृष्ठों से 16% प्राप्त की, लेकिन (जंगली अटकलें) इंटेल की fancy prefetching hardware 4K मामला है जब पहुंच अपेक्षित हैं (की मदद की जा सकती है मुझे लगता है कि मैं disable prefetching सकता है की जांच के लिए चाहे वह सच है)।

+2

हार्डवेयर प्रीफेचिंग 4k पेज सीमाओं को पार नहीं करेगा, लेकिन आप सीधे लाइन लाइन में जो देख रहे हैं वह यह है कि पेज टेबल एक्सेस बहुत अनुमानित है, इसलिए पेज चलना तब होता है जब आप टीएलबी में याद करते हैं तो संभवतः हिट पेज एल 1 में सभी हैं (इन पेज प्रविष्टियों को वास्तव में prefetching के माध्यम से लाया जा सकता है)। – BeeOnRope

3

मैंने कुछ एचपीसी/ग्रिड परिदृश्यों में सुधार देखा है - विशेष रूप से भौतिकी पैकेज जिनमें बहुत सारे और बहुत सारे रैम वाले मशीनों पर बहुत बड़े मॉडल हैं। मॉडल पर चलने वाली प्रक्रिया मशीन पर सक्रिय एकमात्र चीज थी। मुझे संदेह है, हालांकि मापा नहीं गया है, कि कुछ डीबी कार्यों (जैसे थोक आयात) भी लाभान्वित होंगे।

व्यक्तिगत रूप से, मुझे लगता है कि जब तक कि आपके पास बहुत अच्छी तरह से प्रोफाइल/समझने वाली स्मृति पहुंच प्रोफ़ाइल नहीं है और यह बहुत बड़ी मेमोरी एक्सेस करता है, तो यह संभावना नहीं है कि आपको कोई महत्वपूर्ण सुधार दिखाई देगा।

2

मुझे बड़ी प्रक्रियाओं (> = 64 जीबी) बड़ी प्रक्रियाओं के साथ सर्वर पर ~ 5% स्पीडअप मिलता है। उदा। 16 जीबी जावा प्रक्रिया के लिए, यह 4 एम एक्स 4 केबी पेज है लेकिन केवल 4k x 4 एमबी पेज हैं।

14

प्रदर्शन में सबसे बड़ा अंतर तब आएगा जब आप मेमोरी के एक बड़े क्षेत्र में व्यापक रूप से यादृच्छिक पहुंच कर रहे हैं - जहां "बड़ा" का मतलब उस सीमा से बहुत बड़ा है जिसे सभी छोटी पृष्ठ प्रविष्टियों द्वारा मैप किया जा सकता है टीएलबी (जो आमतौर पर आधुनिक प्रोसेसर में कई स्तर होते हैं)।

चीजों को और अधिक जटिल बनाने के लिए, 4 केबी पृष्ठों के लिए टीएलबी प्रविष्टियों की संख्या अक्सर 2 एमबी पृष्ठों के लिए प्रविष्टियों की संख्या से बड़ी होती है, लेकिन यह प्रोसेसर द्वारा बहुत भिन्न होती है। स्तर 2 टीएलबी में कितने "बड़े पृष्ठ" प्रविष्टियां उपलब्ध हैं, इसमें बहुत भिन्नता भी है।

उदाहरण के लिए, एक AMD Opteron परिवार 10h संशोधन डी ("इस्तांबुल") प्रणाली, सीपीयूआईडी रिपोर्ट पर:

  • एल 1 DTLB: 4kB पृष्ठों: 48 प्रविष्टियों; 2 एमबी पेज: 48 प्रविष्टियां; 1 जीबी पेज: 48 प्रविष्टियां
  • एल 2 टीएलबी: 4 केबी पेज: 512 प्रविष्टियां; 2 एमबी पेज: 128 प्रविष्टियां; 1GB पृष्ठों: 16 प्रविष्टियों

जबकि एक इंटेल जिऑन 56xx ("Westmere") सिस्टम पर, सीपीयूआईडी रिपोर्ट:

  • एल 1 DTLB: 4kB पृष्ठों: 64 प्रविष्टियों; 2 एमबी पेज: 32 प्रविष्टियां
  • एल 2 टीएलबी: 4 केबी पेज: 512 प्रविष्टियां; 2 एमबी पृष्ठों: कोई नहीं

दोनों 2MB (512 * 4kB) मैप कर सकते हैं, स्तर 2 TLB याद करते हैं पीड़ित से पहले छोटे पृष्ठों का उपयोग करते समय Westmere प्रणाली अपनी 32 2 एमबी TLB प्रविष्टियों का उपयोग 64MB मैप कर सकते हैं और एएमडी प्रणाली का उपयोग कर 352MB मैप कर सकते हैं इसके एल 1 और एल 2 टीएलबी में 176 2 एमबी टीएलबी प्रविष्टियां। किसी भी प्रणाली को स्मृति पृष्ठों पर यादृच्छिक अभिगम के लिए बड़े पृष्ठों का उपयोग करके एक महत्वपूर्ण गति प्राप्त होगी जो कि 2 एमबी से अधिक और 64 एमबी से कम है। एएमडी सिस्टम को बड़ी मेमोरी रेंजों के लिए बड़े पृष्ठों का उपयोग करके अच्छा प्रदर्शन दिखाना जारी रखना चाहिए।

आप इन सभी मामलों में से बचने की कोशिश कर रहे हैं x86_64 पदानुक्रमित पते अनुवाद के सभी चार स्तरों को पार करने का सबसे खराब मामला (नोट 1) परिदृश्य है।
पता अनुवाद कैशिंग प्रणाली से कोई भी (ध्यान दें 2) यदि काम करते हैं, यह आवश्यकता है: एक 4kB पृष्ठ पर मैप किया गया डेटा लोड करने के लिए स्मृति

  • 5 यात्राएं, स्मृति को
  • 4 के दौरे पर मैप किया गया डेटा लोड करने के एक 2 एमबी पेज, और
  • 1 जीबी पेज पर मैप किए गए डेटा को लोड करने के लिए स्मृति में 3 ट्रिप।

प्रत्येक मामले में स्मृति की अंतिम यात्रा अनुरोधित डेटा प्राप्त करना है, जबकि अन्य यात्राओं को पृष्ठ अनुवाद जानकारी के विभिन्न हिस्सों को प्राप्त करने की आवश्यकता होती है। सबसे अच्छा वर्णन मैंने देखा है एएमडी के की धारा 5.3 में है "AMD64 आर्किटेक्चर प्रोग्रामर के मैनुअल वॉल्यूम 2: सिस्टम प्रोग्रामिंग" (प्रकाशन 24593) http://support.amd.com/us/Embedded_TechDocs/24593.pdf

नोट 1: उपरोक्त आंकड़े वास्तव में सबसे खराब मामले नहीं हैं। वर्चुअल मशीन के तहत चलने से ये संख्या बदतर हो जाती है। एक ऐसे वातावरण में चल रहा है जो डिस्क टेबल पर स्विच करने के लिए पेज टेबल के विभिन्न स्तरों को पकड़ने वाली मेमोरी का कारण बनता है अधिक खराब बनाता है।

नोट 2: दुर्भाग्य से, यहां तक ​​कि विस्तार के इस स्तर को जानने के लिए भी पर्याप्त नहीं है, क्योंकि सभी आधुनिक प्रोसेसर के पास पृष्ठ अनुवाद पदानुक्रम के ऊपरी स्तर के लिए अतिरिक्त कैश हैं। जहां तक ​​मैं ये कह सकता हूं कि जनता में बहुत खराब तरीके से दस्तावेज किया गया है।

3

यह गूढ़ हो रहा है, लेकिन डीएमए मेमोरी ट्रांसफर (पीसीआई के माध्यम से मेज से फाई तक) करते समय विशाल टीएलबी पेज इंटेल ज़ीओन फाई (एमआईसी) आर्किटेक्चर पर महत्वपूर्ण अंतर डालते हैं। This Intel link describes how to enable huge pages। मुझे सामान्य टीएलबी पेज आकार (4 के) के साथ 8 एमबी से अधिक डीएमए ट्रांसफर आकार बढ़ने लगे, स्थानांतरण आकार घटने के बाद लगभग 3 जीबी/एस से 1 जीबी/एस तक प्रदर्शन शुरू हो गया।

विशाल टीएलबी पृष्ठों (2 एमबी) को सक्षम करने के बाद, डेटा दर 512 एमबी के डीएमए हस्तांतरण के लिए 5 जीबी/एस से अधिक बढ़ती रही।

संबंधित मुद्दे

 संबंधित मुद्दे