2011-08-12 8 views
6

मैं I/O गहन अनुप्रयोगों के साथ कुछ प्रयोग चला रहा हूं और कर्नेल i/o बफर आकार, विभिन्न लिफ्ट एल्गोरिदम, और इसी तरह के प्रभावों को समझने की कोशिश कर रहा हूं।कर्नेल i/o बफर आकार को बदलने के लिए

मैं कर्नेल में i/o बफर के वर्तमान आकार को कैसे जान सकता हूं? क्या कर्नेल एक से अधिक बफर का उपयोग करता है जैसे आवश्यकता उत्पन्न होती है? मैं इस बफर के आकार को कैसे बदल सकता हूं? क्या कोई कॉन्फ़िगरेशन फ़ाइल कहीं है जो इस जानकारी को संग्रहीत करती है?

(स्पष्ट होने के लिए, मैं प्रोसेसर या डिस्क कैश के बारे में बात नहीं कर रहा हूं, मैं आंतरिक रूप से कर्नेल द्वारा उपयोग किए गए बफर के बारे में बात कर रहा हूं कि बफर समय-समय पर डिस्क पर उन्हें फ़्लश करने से पहले पढ़ते/लिखते हैं)।

अग्रिम धन्यवाद।

उत्तर

9

कर्नेल आपके विचारों को पढ़ने और लिखने के लिए बफर नहीं करता है ... यह एक "पृष्ठ कैश" रखता है जिसमें डिस्क से पेज होते हैं। आप इसके आकार में हेरफेर नहीं करते हैं (ठीक है, सीधे नहीं, वैसे भी); कर्नेल हमेशा पृष्ठ कैश के लिए सभी उपलब्ध निःशुल्क मेमोरी का उपयोग करेगा।

आपको यह बताने की ज़रूरत है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। यदि आप कुछ नियंत्रण चाहते हैं कि कर्नेल डिस्क से पूर्व-डेटा कितना डेटा प्राप्त करता है, तो "लिनक्स रीडहेड" की खोज करें। (संकेत: blockdev --setra XXX)

यदि आप कुछ नियंत्रण चाहते हैं कि कर्नेल डिस्क पर फ़्लश करने से पहले गंदे पृष्ठों को कब तक रखेगा, तो "linux dirty_ratio" की खोज करें।

एक विशिष्ट अनुप्रयोग भी पूरी तरह से O_DIRECT का उपयोग करके पेज कैश बायपास कर सकते हैं, और यह इसे का उपयोग fsync, sync_file_range, posix_fadvise, और posix_madvise पर कुछ नियंत्रण व्यायाम कर सकते हैं। (O_DIRECT और sync_file_range लिनक्स-विशिष्ट हैं; शेष POSIX हैं।)

यदि आप पहले लिनक्स वीएम सबसिस्टम, विशेष रूप से पेज कैश के बारे में स्वयं को शिक्षित करते हैं तो आप एक बेहतर सवाल पूछने में सक्षम होंगे।

3

मुझे लगता है कि आपका मतलब डिस्क IO कतार है। उदाहरण के लिए:

$ cat /sys/block/sda/queue/nr_requests 
128 

इस कतार का उपयोग कैसे किया जाता है IO शेड्यूलर पर निर्भर करता है। हालांकि उन्नत डिस्क नियंत्रकों के साथ सिस्टम पर और आभासी अतिथि सिस्टम में noop भी एक बहुत अच्छा विकल्प है

$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

cfq, सबसे आम विकल्प है।

इस जानकारी के लिए कोई कॉन्फ़िगरेशन फ़ाइल नहीं है जिसे मैं जानता हूं। सिस्टम पर जिन्हें मुझे कतार सेटिंग्स को बदलने की आवश्यकता है, मैंने परिवर्तन को /etc/rc.local में डाल दिया है, हालांकि आप इसके बजाय एक पूर्ण-अप init स्क्रिप्ट का उपयोग कर सकते हैं और इसे कई प्रणालियों के लिए बड़े पैमाने पर वितरण के लिए RPM या DEB में रख सकते हैं।

+0

ठीक वही नहीं है जो मैं ढूंढ रहा था, लेकिन इससे भी मदद मिली। – jitihsk

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