लिनक्स में बफर कैश का आकार सीमित करें


25

क्या लिनक्स कर्नेल को बताने का एक तरीका है कि बफर कैश के लिए केवल एक निश्चित प्रतिशत मेमोरी का उपयोग करें? मुझे पता है कि /proc/sys/vm/drop_cachesअस्थायी रूप से कैश को साफ करने के लिए इस्तेमाल किया जा सकता है, लेकिन क्या कोई स्थायी सेटिंग है जो इसे मुख्य मेमोरी के 50% से अधिक तक बढ़ने से रोकती है?

ऐसा करने का कारण यह है कि, मेरे पास एक सीएफएच ओएसडी चलाने वाला सर्वर है जो लगातार डिस्क से डेटा काम करता है और कुछ घंटों के भीतर बफर कैश के रूप में संपूर्ण भौतिक मेमोरी का उपयोग करने का प्रबंधन करता है। उसी समय, मुझे उन अनुप्रयोगों को चलाने की आवश्यकता है जो भौतिक मेमोरी की एक बड़ी राशि (कई 10 जीबी जीबी) आवंटित करेंगे। आम धारणा के विपरीत (बफ़र कैश से संबंधित लगभग सभी सवालों पर दी गई सलाह देखें), क्लीन कैश एंट्रीज़ को हटाकर मेमोरी को स्वचालित रूप से मुक्त करना तात्कालिक नहीं है : मेरा आवेदन शुरू होने में एक मिनट तक लग सकता है जब बफ़र कैश पूर्ण हो ( *), जबकि कैश को साफ़ करने के बाद (उपयोग echo 3 > /proc/sys/vm/drop_caches) एक ही आवेदन लगभग तुरंत शुरू होता है।

(*) स्टार्टअप समय के इस मिनट के दौरान, एप्लिकेशन नई मेमोरी में फ़ॉल्ट कर रहा है, लेकिन कर्नेल में अपना 100% समय व्यतीत करता है, जिसे एक समारोह में Vtune के अनुसार कहा जाता है pageblock_pfn_to_page। यह फ़ंक्शन विशाल पृष्ठों को खोजने के लिए आवश्यक स्मृति संघनन से संबंधित है, जो मुझे विश्वास दिलाता है कि वास्तव में विखंडन समस्या है।


1
कैश टेरिंग नाम की कोई चीज होती है। ceph osd पूल सेट {cachepool} hit_set_count 1 ceph osd पूल सेट {cachepool} hit_set_period 3600 ceph osd पूल सेट {cachepool} target_max_bytes 1000000000000 एक उदाहरण के रूप में देखें। docs.ceph.com/docs/master/rados/operations/cache-tiering
माइकल डी।

2
चूंकि यह समस्या स्पष्ट रूप से केवल मेमोरी गहन अनुप्रयोगों के स्टार्टअप को प्रभावित करती है, हो सकता है कि आप एक स्क्रिप्ट के माध्यम से ऐप शुरू कर सकते हैं जो वास्तव में उन्हें शुरू करने से पहले कैश को साफ करता है। शायद यह उन्हें तेजी से शुरू कर देता है जबकि अभी भी कैश प्रबंधन को चालू रखते हुए कर्नेल को छोड़ देता है।
Thawn

जवाबों:


14

यदि आप एक पूर्ण सीमा नहीं चाहते हैं, लेकिन कर्नेल को बफ़र्स को तेज़ी से बाहर निकालने के लिए दबाव डालें, तो आपको देखना चाहिए vm.vfs_cache_pressure

यह चर कर्नेल की प्रवृत्ति को नियंत्रित करता है ताकि वीएफएस कैश, पेजकेस और स्वैप के कैशिंग के लिए उपयोग की जाने वाली मेमोरी को पुनः प्राप्त किया जा सके। इस मूल्य में वृद्धि से दर बढ़ जाती है जिस पर VFS कैश पुनः प्राप्त होता है।

0 से 200 तक के रंग। उच्च दबाव के लिए इसे 200 की ओर ले जाएं। डिफ़ॉल्ट 100 पर सेट है। आप slabtopकमांड का उपयोग करके अपने मेमोरी उपयोग का विश्लेषण भी कर सकते हैं । आपके मामले में, dentryऔर *_inode_cacheमूल्य उच्च होना चाहिए।

यदि आप एक पूर्ण सीमा चाहते हैं, तो आपको ऊपर देखना चाहिए cgroups। सीजीएच ओएसडी सर्वर को एक cgroup के भीतर रखें और अधिकतम मेमोरी को सीमित करें जो इसे memory.limit_in_bytescgroup के लिए पैरामीटर सेट करके उपयोग कर सकता है ।

memory.memsw.limit_in_bytesमेमोरी और स्वैप उपयोग के योग के लिए अधिकतम राशि निर्धारित करता है। यदि कोई इकाई निर्दिष्ट नहीं है, तो मूल्य को बाइट्स के रूप में व्याख्या की जाती है। हालांकि, बड़ी इकाइयों - किलोबाइट्स के लिए के या के, मेगाबाइट के लिए एम या एम, और गीगाबाइट्स के लिए जी या जी का प्रतिनिधित्व करने के लिए प्रत्ययों का उपयोग करना संभव है।

संदर्भ:

[१] - ग्लस्टरएफएस लिनक्स कर्नेल ट्यूनिंग

[२] - आरएचईएल ६ संसाधन प्रबंधन गाइड


1
limit_in_bytesसेट के साथ एक cgroup ऐसा करने लगता है। धन्यवाद!
विम

4
मुझे लगता है कि vfs_cache_pressureकेवल डेंट्री और इनोड कैश को साफ करता है, और बफर कैश के साथ इसका कोई लेना-देना नहीं है।
kawing-chiu

यदि आपके पास अपने कार्यभार के लिए पर्याप्त रैम नहीं है, तो vfs_cache_pressureऊपर बढ़ने से 100मदद मिल सकती है। यह रैम उपयोग को कम करेगा लेकिन कुल मिलाकर I / O प्रदर्शन को खराब करेगा।
मिक्को रेंटालीनें

3

मुझे A% के बारे में नहीं पता है, लेकिन आप समय सीमा निर्धारित कर सकते हैं, इसलिए इसे x मिनटों के बाद छोड़ देता है।

पहले एक टर्मिनल में

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

वर्तमान कैश को साफ़ करने के लिए।

इसे एक cron-job Alt-F2 दबाएं, टाइप करें gksudo gedit /etc/crontab, फिर नीचे के पास इस लाइन को जोड़ें।

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

यह हर 15 मिनट में साफ करता है। आप 1 या 5 मिनट के लिए सेट कर सकते हैं यदि आप वास्तव में * / 15 के बजाय पहले पैरामीटर को * या * / 5 में बदलकर करना चाहते हैं

कैश को छोड़कर, अपनी मुफ्त रैम देखने के लिए:

free -m | sed -n -e '3p' | grep -Po "\d+$

मुझे यहां थोड़ा अतिरेक महसूस होता है। जहां तक ​​मुझे पता है, 3 > drop_cachessync
andras.tim

1
@ andras.tim no - सिंक में गंदे पन्नों को डिस्क पर लिखा जाता है, 3 से drop_caches को केवल स्वच्छ पृष्ठों और अन्य कैश द्वारा उपयोग की जाने वाली मेमोरी को पुनः प्राप्त / मुक्त करता है। आपको सिंक चलाने की ज़रूरत नहीं है, लेकिन यदि आप करते हैं, तो गंदे के बजाय अधिक मेमोरी साफ़ होगी और कैश छोड़ने पर अधिक मेमोरी फ़्री हो जाएगी
डैनियल एस। स्टर्लिंग

2

मुझे लगता है कि आपके प्रश्न के अंत में आपका कूबड़ सही रास्ते पर है। मुझे या तो A, NUMA- अवगत मेमोरी एलोकेशन CPUs, या B के बीच माइग्रेट करने वाले पेजों पर संदेह होता है, अधिक संभावना है, पारदर्शी विशालता का डीफ़्रैग कोड, सन्निहित, संरेखित क्षेत्र खोजने की कोशिश कर रहा है।

कुछ कार्यभार पर चिह्नित प्रदर्शन में सुधार और बहुत अधिक लाभ प्रदान किए बिना सीपीयू समय की भारी मात्रा में खपत के लिए जिम्मेदार दोनों विशाल हेजेज और पारदर्शी विशालता की पहचान की गई है।

यह जानने में मदद मिलेगी कि आप किस कर्नेल पर चल रहे हैं, / proc / meminfo की सामग्री (या कम से कम HugeP__ * मान।), और, यदि संभव हो तो, vtune profiler callgraph संदर्भित पेजब्लॉक_fn_to_page ()) से अधिक।

इसके अलावा, यदि आप मेरा अनुमान लगाते हैं, तो इसके साथ विशाल पृष्ठ डीफ़्रैग को अक्षम करने का प्रयास करें:

इको 'कभी नहीं'> / एसआईएस / कर्नेल / मिमी / पारदर्शी_हुगेपेज / डीफ़्रैग

(यह आपके कर्नेल के आधार पर इसके बजाय हो सकता है :)

इको 'कभी नहीं'> / sys / कर्नेल / मिमी / redhat_transparent_hugepage / defrag

अंत में, क्या यह ऐप आपके द्वारा लिखे गए कुछ राम के दसियों गिग्स का उपयोग कर रहा है? क्या भाषा?

चूँकि आपने शब्द का उपयोग किया है, "मेमोरी पेजों में खराबी," मैं अनुमान लगा रहा हूँ कि आप ऑपरेटिंग डिज़ाइन और वर्चुअल मेमोरी से काफी परिचित हैं। मैं एक ऐसी स्थिति / एप्लिकेशन की कल्पना करने के लिए संघर्ष करता हूं जो इतनी आक्रामक रूप से दोषपूर्ण होगा जो I / O के बहुत सारे में नहीं पढ़ रहा है - लगभग हमेशा बफर कैश से जिसे आप सीमित करने की कोशिश कर रहे हैं।

(यदि आप उत्सुक हैं, तो MAP_ANONYMOUS और MAP_POPULATE और mincore (2) जैसे mmap (2) झंडे देखें, जिनका उपयोग यह देखने के लिए किया जा सकता है कि वास्तव में कौन से आभासी पृष्ठों में मैप्ड भौतिक पृष्ठ है।)

शुभ लाभ!


2

यदि सेफ ओएसडी एक अलग प्रक्रिया है, तो आप प्रक्रिया द्वारा उपयोग किए गए संसाधनों को नियंत्रित करने के लिए cgroups का उपयोग कर सकते हैं :

स्मृति सीमा (50GB का, उदाहरण के लिए, CPU जैसी अन्य सीमाएँ समर्थित हैं, उदाहरण के लिए CPU का भी उल्लेख किया गया है) के साथ समूह 1 नाम का एक समूह बनाएँ।

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

यदि आप ऐप पहले से चला रहे हैं, तो इस cgroup में ऐप लाएँ:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

या इस cgroup के भीतर अपने एप्लिकेशन को निष्पादित करें:

cgexec -g memory,cpu:group1 your_app_name

0

ट्यून एक डायनामिक एडेप्टिव सिस्टम ट्यूनिंग डेमॉन है जो सिस्टम सेटिंग्स को गतिशील रूप से उपयोग पर निर्भर करता है।

 $ man tuned

संबंधित दस्तावेज, और विन्यास फाइल देखें।

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

अतिरिक्त जानकारी

सिंक आदेश flushes बफर, यानी, बलों सभी अलिखित डेटा डिस्क पर लिखी है, और जब एक यकीन है कि सब कुछ सुरक्षित रूप से लिखा है बनना चाहता है इस्तेमाल किया जा सकता। पारंपरिक यूनिक्स प्रणालियों में, पृष्ठभूमि में चल रहा अपडेट नामक एक कार्यक्रम है जो हर 30 सेकंड में एक सिंक करता है , इसलिए आमतौर पर सिंक का उपयोग करना आवश्यक नहीं है। लिनक्स एक अतिरिक्त डेमॉन, है bdflush है, जो भारी डिस्क मैं / हे कि की वजह से अचानक फ्रीज से बचने के लिए अधिक बार एक और अधिक अपूर्ण समन्वयन नहीं करता सिंक कभी कभी कारण बनता है।

लिनक्स के तहत, bdflush अपडेट द्वारा शुरू किया गया है। आमतौर पर इसके बारे में चिंता करने का कोई कारण नहीं है, लेकिन अगर किसी कारण से bdflush की मृत्यु हो जाती है, तो कर्नेल इस बारे में चेतावनी देगा, और आपको इसे हाथ से शुरू करना चाहिए ( / sbin / अपडेट )।


1
क्या यह केवल गंदी प्रविष्टियों के लिए नहीं है? मुझे नहीं लगता कि मेरे सिस्टम पर यह मुद्दा है क्योंकि वे सभी साफ हैं - देरी गंदे पन्नों को वापस लिखने में नहीं है, लेकिन स्वच्छ लोगों को हटाकर छोड़े गए स्थान को डीफ़्रैग्मेन्ट करने में है।
विम

हां, यह गंदे पन्नों के लिए है, मुझे लगता है कि आप डायनैमिक मोड पर भी सेट करके अन्य प्रदर्शन समस्याओं को ठीक कर सकते हैं।
इज़ाज़ अहमद खान

"चूंकि Linux 2.6, [bdflush] सिस्टम कॉल को हटा दिया गया है और यह कुछ भी नहीं करता है। यह भविष्य के कर्नेल रिलीज़ में पूरी तरह से गायब होने की संभावना है। आजकल, bdflush () द्वारा निष्पादित कार्य kd pdflush थ्रेड द्वारा नियंत्रित किया जाता है।" man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.