लिनक्स: एक फाइल को पढ़ने में मुझे कितनी डिस्क I / O लगती है? इसे कम से कम कैसे करें? [डुप्लिकेट]


10

इस पत्र के अनुसार फेसबुक के हेडस्टैक पर:

" एनएएस उपकरण निर्देशिका मेटाडेटा को कैसे प्रबंधित करते हैं, इस कारण से हजारों a लेस को एक निर्देशिका में रखना बेहद मुश्किल था क्योंकि निर्देशिका के अवरोधक को उपकरण द्वारा प्रभावी ढंग से कैश किया जाना बहुत बड़ा था। नतीजतन, इसे पुनर्प्राप्त करने के लिए 10 से अधिक डिस्क संचालन को उठाना सामान्य था। एकल छवि। डायरेक्टरी के अनुसार प्रति डायरेक्टरी साइज को सैकड़ो इमेज तक कम करने के बाद, परिणामी प्रणाली में आम तौर पर एक इमेज लाने के लिए 3 डिस्क ऑपरेशंस होते हैं: एक मेमोरी में डायरेक्टरी मेटाडेटा पढ़ने के लिए, दूसरा इनोड को मेमोरी में लोड करने के लिए, और एक तीसरा। " ली सामग्री को पढ़ने के लिए। "

मैंने फाइलसिस्टम डायरेक्टरी मेटाडेटा और इनोड को हमेशा ओएस द्वारा रैम में कैश किया जाएगा और एक फाइल रीड को आमतौर पर सिर्फ 1 डिस्क आईओ की आवश्यकता होगी।

क्या यह "मल्टीपल डिस्क आईओ की एकल फ़ाइल पढ़ने के लिए" समस्या है जो उस पेपर में उल्लिखित है जो एनएएस उपकरणों के लिए अद्वितीय है, या क्या लिनक्स में भी यही समस्या है?

मैं छवियों की सेवा के लिए एक लिनक्स सर्वर चलाने की योजना बना रहा हूं। किसी भी तरह से मैं डिस्क IO की संख्या को कम कर सकता हूं - आदर्श रूप से सुनिश्चित करता है कि OS RAM में सभी निर्देशिका और इनकोड डेटा को कैश करता है और प्रत्येक फ़ाइल रीड को केवल 1 डिस्क IO से अधिक की आवश्यकता नहीं होगी?


1
प्रश्न का उत्तर नहीं है, लेकिन आप हमेशा वार्निश (फेसबुक इसका उपयोग करता है) का उपयोग कर सकते हैं जो फाइलों को स्मृति में बनाए रखते हैं। इस तरह यदि एक छवि गर्म हो जाती है (एक ही फ़ाइल के लिए बहुत अनुरोध), डिस्क IO का उपयोग करने के लिए इसे उपयोग करने के लिए बिल्कुल भी उपयोग नहीं किया जाएगा

डरज़र - वार्निश यहाँ लिनक्स फ़ाइल कैश (जो वार्निश पर निर्भर करता है) के रूप में मदद नहीं करेगा, पहले से ही स्मृति में गर्म फ़ाइलों को कैश करता है। स्टेटिक फाइल सर्विंग के लिए Nginx के सामने वार्निश लगाना वास्तव में कुछ भी नहीं जोड़ता है। मेरा सवाल उस समय का है जब फाइलें बहुत बड़ी / बहुत अधिक हैं, जिन्हें मेमोरी में कैश किया जाना है। मैं अभी भी यह सुनिश्चित करना चाहता हूं कि डिस्क आईओ को कम करने के लिए कम से कम निर्देशिका डेटा और इनकोड्स को केवल 1 प्रति रीड तक पढ़ा जाए।

कई फाइलसिस्टम इनोड को डायरेक्टरी के अंदर स्टोर करते हैं, एक के बाद एक रिक्वेस्ट की संख्या को कम करते हैं, और कैश हिट की संभावना को काफी बढ़ाते हैं। लेकिन यह एक प्रोग्रामिंग सवाल नहीं है।
बेन वोइगट

आप इसे बनाते समय फ़ाइल सिस्टम के ब्लॉक आकार को बदल सकते हैं, उदाहरण के mke2fs -b 32768लिए इसे 32k बनाने के लिए। हालाँकि, यह केवल तभी उपयोगी है जब आपके पास उस फ़ाइल सिस्टम पर छोटी फ़ाइलें न हों।

जवाबों:


5

लिनक्स में एक ही "समस्या" है। यहां एक पेपर दो साल पहले प्रकाशित मेरा एक छात्र है, जहां लिनक्स पर प्रभाव दिखाया गया है। कई IO कई स्रोतों से आ सकते हैं:

  • फ़ाइल पथ के प्रत्येक निर्देशिका स्तर पर निर्देशिका लुकअप। निर्देशिका इनोड और एक या अधिक निर्देशिका प्रविष्टि ब्लॉकों को पढ़ना आवश्यक हो सकता है
  • फ़ाइल का इनकोड

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

यहां कुछ विचार हैं:

1) फाइलसिस्टम से संबंधित कैश मदद करते हैं। एक बड़ा कैश अधिकांश रीड्स को अवशोषित करेगा। हालाँकि, यदि आप किसी मशीन में कई डिस्क्स लगाना चाहते हैं, तो डिस्क-टू-रैम अनुपात कितना कैश है।

2) लाखों छोटी फ़ाइलों का उपयोग न करें। उन्हें बड़ी फ़ाइलों के लिए एकत्र करें और फ़ाइल नाम और फ़ाइल के भीतर ऑफ़सेट को संग्रहीत करें।

3) मेटाडाटा को एसएसडी पर रखें या कैश करें।

4) और निश्चित रूप से एक फाइलसिस्टम का उपयोग करें, जिसमें डिस्क-डिस्क निर्देशिका प्रारूप पर पूरी तरह से अराजकता नहीं है। एक रीडिर को रैखिक समय से अधिक नहीं लेना चाहिए, और सीधे फ़ाइल का उपयोग आदर्श रूप से केवल लघुगणक समय है।

निर्देशिकाओं को छोटा रखना (1000 या उससे कम) को इतनी मदद नहीं करनी चाहिए क्योंकि आपको कैश करने की आवश्यकता के साथ अधिक निर्देशिकाओं की आवश्यकता होगी।


और निश्चित रूप से एक फाइलसिस्टम का उपयोग करते हैं जिसमें डिस्क-डिस्क निर्देशिका प्रारूप पर पूरी तरह से पुरातन नहीं है। एक रीडिर को रैखिक समय से अधिक नहीं लेना चाहिए, और सीधे फ़ाइल का उपयोग आदर्श रूप से केवल लघुगणक समय होता है।
जॉर्जेंसन

मैंने कहा कि चौथे बिंदु के रूप में उत्तर में
dmeister

@ डमीस्टर अच्छा सामान। +1
मैगेलन

@dmeister आपका लिंक मर चुका है।
डॉन स्कॉट

1

यह उस फाइल सिस्टम पर निर्भर करता है जिसका आप उपयोग करने की योजना बना रहे हैं। फ़ाइल डेटा सिस्टम पढ़ने से पहले:

  • निर्देशिका फ़ाइल पढ़ें।
  • अपनी फ़ाइल की इनकोड पढ़ें
  • अपनी फ़ाइल के क्षेत्रों को पढ़ें

यदि फ़ोल्डर में बड़ी संख्या में फ़ाइलें हैं, तो यह कैश पर बड़ी संरचना है।


यदि आप आई / ओ एक्सेस को सूचीबद्ध कर रहे हैं, तो यह उन लोगों द्वारा किए गए प्रदर्शनों को अलग करने के लिए अधिक दिलचस्प हो सकता open()है read()। पेज win.tue.nl/~aeb/linux/vfs/trail.html विभिन्न कर्नेल अवधारणाओं को शामिल करते हुए एक अच्छा चलना दिखाता है। (शायद यह पुराना हो, तो मुझे बताने के लिए सक्षम नहीं होगा?।)
ADL

0

शायद आप रैम में डायरेक्ट्री और इनकोड डेटा को रखने में सक्षम नहीं होंगे, क्योंकि आपके पास शायद रैम की तुलना में अधिक निर्देशिका और इनकोड डेटा है। आप यह भी नहीं चाह सकते हैं, क्योंकि रैम अन्य प्रयोजनों के लिए बेहतर इस्तेमाल किया जा सकता है; आपके छवि उदाहरण में, क्या आप रैम में कैश की गई एक बार-बार एक्सेस की गई छवि का डेटा नहीं लेना पसंद करेंगे, जो कि एक संक्रमित एक्सेस इमेज के लिए डायरेक्टरी एंट्री से अधिक हो?

उस ने कहा, मुझे लगता है कि इसे नियंत्रित करने के लिए vfs_cache_pressure घुंडी का उपयोग किया जाता है। "जब vfs_cache_pressure = 0, कर्नेल मेमोरी दबाव के कारण डेंट्री और इनकोड को पुनः प्राप्त नहीं करेगा और इससे आसानी से मेमोरी की स्थिति बन सकती है।"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.