सामान्य रूप से डिस्क कैश प्रदर्शन में सुधार केवल फ़ाइल सिस्टम कैश आकार को बढ़ाने से अधिक है जब तक कि आपका पूरा सिस्टम रैम में फिट नहीं होता है, इस स्थिति में आपको रैम ड्राइव का उपयोग करना चाहिए ( tmpfsयह अच्छा है क्योंकि यह डिस्क को वापस गिरने की अनुमति देता है यदि आपको किसी मामले में रैम की आवश्यकता है) रनटाइम स्टोरेज के लिए (और स्टोरेज से रैम पर स्टार्टअप में सिस्टम कॉपी करने के लिए शायद एक initrd स्क्रिप्ट)।
आपने यह नहीं बताया कि आपका स्टोरेज डिवाइस SSD या HDD है या नहीं। यहाँ मुझे मेरे लिए काम करने के लिए मिला है (मेरे मामले sdaमें एक एचडीडी घुड़सवार है /homeऔर sdbएसएसडी माउंट है /)।
पहले लोड-सामान-से-स्टोरेज-टू-कैश भाग का अनुकूलन करें:
यहाँ HDD के लिए मेरा सेटअप है (सुनिश्चित करें कि AHCI + NCQ BIOS में सक्षम है यदि आपके पास टॉगल है):
echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda
एचडीडी मामले के लिए वर्थ नोटिंग उच्च है fifo_expire_async(आमतौर पर लिखते हैं) और slice_syncकिसी भी प्रक्रिया को उच्च थ्रूपुट प्राप्त करने की अनुमति देने के लिए लंबा है ( slice_syncयदि आप उन स्थितियों से टकराते हैं, जहां कई प्रक्रियाएं समानांतर में डिस्क से कुछ डेटा की प्रतीक्षा कर रही हैं)। slice_idleहमेशा HDDs के लिए एक समझौता है, लेकिन सीमा 3-20 में कहीं की स्थापना डिस्क उपयोग और डिस्क फर्मवेयर के आधार पर ठीक किया जाना चाहिए। मैं कम मूल्यों के लिए लक्ष्य बनाना पसंद करता हूं लेकिन इसे बहुत कम सेट करना आपके थ्रूपुट को नष्ट कर देगा। quantumसेटिंग प्रवाह क्षमता एक बहुत प्रभावित करते हैं लेकिन संभव के रूप में इस के रूप में कम रखने के लिए समझदार स्तर पर विलंबता रखने की कोशिश करने लगता है। quantumबहुत कम स्थापित करने से थ्रूपुट नष्ट हो जाएगा। श्रेणी 3-8 में मान एचडीडी के साथ अच्छी तरह से काम करते हैं। एक पढ़ने के लिए सबसे खराब स्थिति विलंबता ( quantum* slice_sync) + ( slice_async_rq* है )slice_async) एमएस अगर मैंने कर्नेल व्यवहार को सही ढंग से समझा है। Async का उपयोग ज्यादातर लिखते हैं और चूंकि आप डिस्क पर लिखने में देरी करने के लिए तैयार हैं, दोनों को सेट करें slice_async_rqऔर slice_asyncबहुत कम संख्या में। हालाँकि, slice_async_rqबहुत कम मान सेट करना स्टॉल पढ़ सकता है क्योंकि किसी भी अधिक पढ़ने के बाद लिखने में देरी नहीं की जा सकती है। मेरे config 10 सेकंड के बाद ज्यादा से ज्यादा डिस्क पर डेटा लिखने के लिए के बाद डेटा कर्नेल पारित किया गया है की कोशिश करेंगे, लेकिन जब से तुम शक्ति नुकसान पर डेटा भी सेट की हानि बर्दाश्त कर सकते हैं fifo_expire_asyncके लिए 3600000बताने के लिए है कि 1 घंटे डिस्क पर देरी के लिए ठीक है। slice_asyncहालांकि, कम रखें , क्योंकि अन्यथा आप उच्च पठनीयता प्राप्त कर सकते हैं।
hdparmआदेश प्रदर्शन AHCI + NCQ की अनुमति देता है कि के ज्यादा की ह्त्या AAM को रोकने के लिए आवश्यक है। यदि आपकी डिस्क बहुत अधिक शोर करती है, तो इसे छोड़ें।
यहाँ SSD (Intel 320 श्रृंखला) के लिए मेरा सेटअप है:
echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync
यहाँ यह अलग-अलग स्लाइस सेटिंग्स के लिए कम मूल्यों पर ध्यान देने योग्य है। SSD के लिए सबसे महत्वपूर्ण सेटिंग है slice_idleजिसे 0-1 तक सेट किया जाना चाहिए। इसे शून्य पर सेट करने से देशी NCQ के लिए सभी ऑर्डर करने के निर्णय ले जाते हैं, जबकि इसे 1 पर सेट करने से अनुरोधों को ऑर्डर करने की अनुमति मिलती है (लेकिन अगर NCQ सक्रिय है, तो हार्डवेयर कर्नेल को आंशिक रूप से ऑर्डर करने से रोक सकता है)। दोनों मानों को देखें कि क्या आप अंतर देख सकते हैं। इंटेल 320 श्रृंखला के लिए, ऐसा लगता है कि स्थापित करने slide_idleके लिए 0सबसे अच्छा प्रवाह क्षमता देता है, लेकिन यह करने के लिए स्थापित करने 1के लिए सबसे अच्छा (न्यूनतम) समग्र विलंबता देता है।
इन सुरंगों के बारे में अधिक जानकारी के लिए, http://www.linux-mag.com/id/7572/ देखें ।
अब जब हमने डिस्क से कैश में सामान को समझदार प्रदर्शन के साथ लोड करने के लिए कर्नेल को कॉन्फ़िगर किया है, तो यह कैश व्यवहार को समायोजित करने का समय है:
मेरे द्वारा किए गए बेंचमार्क के अनुसार, मैं आगे पढ़ने की जहमत नहीं उठाता blockdev। कर्नेल डिफ़ॉल्ट सेटिंग्स ठीक हैं।
एप्लिकेशन कोड पर फ़ाइल डेटा स्वैपिंग पसंद करने के लिए सिस्टम सेट करें (यदि आपके पास संपूर्ण RAM सिस्टम रखने के लिए पर्याप्त RAM नहीं है और सभी एप्लिकेशन कोड और RAM में एप्लिकेशन द्वारा आवंटित सभी वर्चुअल मेमोरी)। यह एक ही अनुप्रयोग से बड़ी फ़ाइलों तक पहुँचने के लिए विलंबता पर विभिन्न अनुप्रयोगों के बीच स्वैपिंग के लिए विलंबता को कम करता है:
echo 15 > /proc/sys/vm/swappiness
यदि आप अनुप्रयोगों को लगभग हमेशा रैम में रखना पसंद करते हैं, तो आप इसे 1 पर सेट कर सकते हैं। यदि आप इसे शून्य पर सेट करते हैं, तो कर्नेल स्वैप नहीं करेगा जब तक कि ओओएम से बचने के लिए बिल्कुल आवश्यक न हो। यदि आप मेमोरी सीमित थे और बड़ी फ़ाइलों के साथ काम कर रहे थे (उदाहरण के लिए एचडी वीडियो संपादन), तो यह 100 के करीब सेट करने के लिए समझ में आ सकता है।
मैं आजकल (2017) को पसंद करता हूं कि अगर आपके पास पर्याप्त रैम है तो कोई स्वैप नहीं करना चाहिए। कोई स्वैप नहीं होने से आमतौर पर लंबे समय तक चलने वाली डेस्कटॉप मशीन पर 200-1000 एमबी रैम खो जाएगी। मैं सबसे खराब स्थिति परिदृश्य विलंबता से बचने के लिए इतना त्याग करने को तैयार हूं (जब रैम भरा हो तो एप्लिकेशन कोड स्वैप करना)। व्यवहार में, इसका मतलब है कि मैं OOM किलर को स्वैप करना पसंद करता हूं। यदि आपको स्वैपिंग की अनुमति / आवश्यकता है, तो आप /proc/sys/vm/watermark_scale_factorकुछ विलंबता से बचने के लिए भी बढ़ाना चाह सकते हैं । मैं 100 और 500 के बीच मान सुझाता हूं। आप इस सेटिंग को निम्न स्वैप विलंब के लिए ट्रेडिंग CPU उपयोग के रूप में मान सकते हैं। डिफ़ॉल्ट 10 है और अधिकतम संभव 1000 है। उच्च मूल्य चाहिए ( कर्नेल प्रलेखन के अनुसार ) जिसके परिणामस्वरूप kswapdप्रक्रियाओं के लिए अधिक सीपीयू का उपयोग होता है और समग्र समग्र विलंबता कम होती है।
इसके बाद, कर्नेल को फ़ाइल की सामग्री पर मेमोरी में पदानुक्रम रखने को प्राथमिकता दें, यदि कुछ रैम को मुक्त करने की आवश्यकता होती है (फिर, यदि सब कुछ रैम में फिट होता है, तो यह सेटिंग कुछ भी नहीं करती है):
echo 10 > /proc/sys/vm/vfs_cache_pressure
स्थापना vfs_cache_pressureकम मूल्य का मतलब समझ में आता है क्योंकि ज्यादातर मामलों में, कर्नेल को निर्देशिका संरचना को जानने की आवश्यकता होती है, इससे पहले कि वह कैश से फ़ाइल सामग्री का उपयोग कर सकती है और डायरेक्टरी कैश को जल्द ही फ्लश करके फ़ाइल को कैश के आगे बेकार कर देगी। इस सेटिंग के साथ 1 से नीचे जाने के सभी तरीकों पर विचार करें यदि आपके पास बहुत सारी छोटी फाइलें हैं (मेरी प्रणाली में लगभग 150K 10 मेगापिक्सेल तस्वीरें हैं और "बहुत सारी छोटी फाइलें" प्रणाली के रूप में गिना जाता है)। इसे कभी भी शून्य पर सेट न करें या निर्देशिका संरचना हमेशा स्मृति में रखी जाती है, भले ही सिस्टम मेमोरी से बाहर चल रहा हो। इसे बड़े मूल्य पर सेट करना तभी समझदारी है जब आपके पास केवल कुछ बड़ी फाइलें होती हैं जिन्हें लगातार पढ़ा जा रहा है (फिर से, पर्याप्त रैम के बिना एचडी वीडियो संपादन एक उदाहरण का मामला होगा)। आधिकारिक कर्नेल प्रलेखन कहता है कि "
अपवाद: यदि आपके पास वास्तव में भारी मात्रा में फ़ाइलें और निर्देशिकाएं हैं और आप शायद ही कभी स्पर्श करें / पढ़ें / सूची दें vfs_cache_pressureतो 100 से अधिक की सेटिंग वाली सभी फाइलें बुद्धिमान हो सकती हैं। यह केवल तभी लागू होता है जब आपके पास पर्याप्त रैम नहीं होती है और रैम में पूरी निर्देशिका संरचना नहीं रख सकती है और फिर भी सामान्य फ़ाइल कैश और प्रक्रियाओं के लिए पर्याप्त रैम होती है (उदाहरण के लिए कंपनी का फ़ाइल सर्वर बहुत सारे अभिलेखीय सामग्री के साथ)। यदि आपको लगता है कि आपको vfs_cache_pressure100 से ऊपर बढ़ाने की आवश्यकता है तो आप पर्याप्त रैम के बिना चल रहे हैं। वृद्धि से vfs_cache_pressureमदद मिल सकती है लेकिन अधिक रैम प्राप्त करने के लिए एकमात्र वास्तविक सुधार है। करने के बाद vfs_cache_pressureउच्च संख्या के लिए सेट और अधिक स्थिर प्रदर्शन समग्र होने के लिए औसत प्रदर्शन के बलिदान (जो है, तुम सच में बुरा व्यवहार सबसे खराब स्थिति से बचने लेकिन बदतर समग्र प्रदर्शन से निपटने के लिए कर सकते हैं)।
अंत में (डिफ़ॉल्ट के लिए राम का 50% तक का उपयोग करने के लेखन के लिए कैश के रूप में राम के 99% अप करने के लिए इस्तेमाल करते हैं और गिरी निर्देश देने के लिए नीचे प्रक्रिया है कि लिख रही धीमा से पहले गिरी बता dirty_background_ratioहै 10)। चेतावनी: मैं व्यक्तिगत रूप से ऐसा नहीं करूंगा लेकिन आपने दावा किया है कि आपके पास पर्याप्त रैम है और डेटा खोने के लिए तैयार हैं।
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
और बताएं कि 1h लिखने में देरी डिस्क पर सामान लिखना शुरू करना ठीक है (फिर, मैं ऐसा नहीं करूंगा):
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
यदि आप उन सभी /etc/rc.localको अंत में शामिल करते हैं और निम्नलिखित शामिल करते हैं, तो बूट के बाद जितनी जल्दी हो सके सब कुछ कैश में होगा (केवल ऐसा करें यदि आपका फाइलसिस्टम वास्तव में रैम में फिट बैठता है):
(nice find / -type f -and -not -path '/sys/*' -and -not -path '/proc/*' -print0 2>/dev/null | nice ionice -c 3 wc -l --files0-from - > /dev/null)&
या थोड़ा सरल विकल्प जो बेहतर तरीके से काम कर सकता है (केवल कैश /homeऔर /usr, ऐसा केवल तभी करें जब आपका /homeऔर /usrवास्तव में रैम में फिट हो):
(nice find /home /usr -type f -print0 | nice ionice -c 3 wc -l --files0-from - > /dev/null)&