سؤال ما سبب انخفاض ذاكرة التخزين المؤقت في Linux؟


في خوادمنا ، لدينا عادة إسقاط ذاكرة التخزين المؤقت في منتصف الليل.

sync; echo 3 > /proc/sys/vm/drop_caches

عندما أقوم بتشغيل الكود ، يبدو أنه يحرر الكثير من ذاكرة الوصول العشوائي (RAM) ، لكني في الحقيقة أحتاج إلى القيام بذلك. لا ذاكرة الوصول العشوائي خالية من النفايات؟


81
2018-05-20 03:12


الأصل


ابحث عن الشخص الذي وضع هذا في وسأله لماذا فعل ذلك. كما خمنت بشكل صحيح ، ليس هناك سبب وجيه واضح لذلك. - Michael Hampton♦
تصحيح النواة. هذا عن ذلك. هذا في الواقع لا يحرر أي ذاكرة الوصول العشوائي. فإنه يسقط ذاكرات التخزين المؤقت ، كما يوحي الاسم ، وبالتالي يقلل من الأداء. - Michael Hampton♦
ivcode يجب عليك بعد ذلك إيجاد المشكلة وحلها مع الخادم بدلاً من محاولة تجنب الظروف التي تسببها. إذا توقفت سيارتي في كل مرة أقوم فيها بملامسة لليمين ، فإن تجنب المنعطفات الحادة هو إصلاح رديء. - David Schwartz
ذات صلة thedailywtf.com/Articles/Modern-Memory-Management.aspx جادل بشدة انها فكرة سيئة. - Drunix
ذات الصلة ، ووصف مفيد "للمشكلة": linuxatemyram.com - Bill Weiss


الأجوبة:


أنت صحيح 100٪. أنه ليس ممارسة جيدة لتحرير ذاكرة الوصول العشوائي. هذا هو على الأرجح مثال على إدارة نظام عبادة البضائع.


85
2018-05-20 04:59



+1 للإشارة إلى إدارة نظام Cargo Cult. يجب طرد أي مسؤول النظام الذي لا يعرف هذا المصطلح وما يعنيه. - Tonny
Tonny: سنترك دون قسم مسؤول النظام ثم :( - PlasmaHH
مثل معظم البشر ، أحب تكرارات brash المقتطعة مع الكثير من الموافقة ، ولكن الاستدلال أو التفكير سيجعل رخصتي الأنا العليا 1+. - Aaron Hall
اشرح إدارة شحن البضائع ، بالإضافة إلى ما سبق ، إذا كنت لا تمانع. ربما في تحرير المتابعة؟ ما زلت أحتفظ بـ 1+ ...: P - Aaron Hall
"من المحتمل أنه على الرغم من أن التطبيق الخاص بك قد لا يستخدم ذاكرة الوصول العشوائي هذه ، إلا أن نظام التشغيل Linux يعمل بشكل مؤقت على تخزين ذاكرته ، وعلى الرغم من أن التطبيق يحتاج إلى ذاكرة فإنه لن يقوم بتحرير بعض هذه الذاكرة المؤقتة ولكن سيبدأ بدلاً من ذلك التبادل." غير محددة جدا. من الناحية العملية ، فإن إدارة الذاكرة ليست مثالية ، ووجود مقبض للتحويل عندما يظهر هذا النقص هو أمر جيد. - Dan Pritts


نعم ، سيؤدي مسح ذاكرة التخزين المؤقت إلى تحرير ذاكرة الوصول العشوائي (RAM) ، إلا أنه يؤدي إلى البحث عن الملفات الموجودة على القرص بدلاً من ذاكرة التخزين المؤقت مما قد يتسبب في حدوث مشكلات في الأداء.

عادةً ما يقوم kernel بمسح ذاكرة التخزين المؤقت عند نفاد ذاكرة الوصول العشوائي المتاحة. وكثيراً ما يكتب المحتوى المنسوخ إلى القرص باستخدام pdflush.


62
2018-05-20 06:26



+1 للتوضيح لماذا ا إنها فكرة سيئة. - Ogre Psalm33


السبب لإسقاط ذاكرة التخزين المؤقت مثل هذا من أجل قياس أداء القرص ، وهو السبب الوحيد لوجودها.

عند تشغيل معيار I / O مكثف ، فإنك تريد أن تتأكد من أن الإعدادات المتنوعة التي تحاول القيام بها جميعها تقوم بالفعل بإدخال / إخراج القرص ، لذا يتيح لك Linux إسقاط ذاكرات تخزين مؤقت بدلاً من القيام بعملية إعادة تشغيل كاملة.

اقتبس من كابل بيانات:

هذا الملف ليس وسيلة للتحكم في نمو النواة المختلفة   مخابئ (inodes، dentries، pagecache، etc ...) هذه الكائنات هي   استصلاحها تلقائيا من النواة عندما تكون هناك حاجة إلى الذاكرة في مكان آخر   على النظام.

يمكن أن يتسبب استخدام هذا الملف في حدوث مشكلات في الأداء. لأنه يتخلى   كائنات مخزنة مؤقتًا ، قد يكلفك قدرًا كبيرًا من I / O ووحدة المعالجة المركزية   إعادة إنشاء الكائنات التي تم إسقاطها ، خاصةً إذا كانت تحت الاستخدام الكثيف.   وبسبب هذا ، استخدام خارج بيئة اختبار أو التصحيح   لا ينصح.


34
2018-05-20 13:51



وبالطبع ، استنادًا إلى ما تحاول القيام به ، قد لا تتمكن حتى إعادة التشغيل الكامل من مسح ذاكرة التخزين المؤقت على القرص. - α CVn
"هذه الكائنات يتم استردادها تلقائيًا بواسطة النواة عندما تكون هناك حاجة للذاكرة" هو هدف التصميم ولكن قد لا يكون دائمًا السلوك الفعلي. - Dan Pritts
DanPritts ما الذي يجعلك تظن أنه ليس كذلك؟ - Joe
والحالة الواضحة هي عندما تريد مسح ذاكرة الوصول العشوائي للسماح بتخصيص المزيد من الصفحات الضخمة (غير trnsparent) ؛ حالة أخرى شفافة البق ضخمة جمع القمامة وقفة (انظر إجابتي / تعليقات في مكان آخر على هذا السؤال). لكن قصدت تعليقي للحالة العامة. في بعض الأحيان يكون الأشخاص الذين يقومون بتشغيل النظام يعرفون أفضل من الأشخاص الذين قاموا بتصميمه / تنفيذه. في كثير من الأحيان ، لا - هذا ما يحاول تعليقاتهم حمايته. أنا سعيد فقط أن - Dan Pritts


ربما لا تكون الفكرة الأساسية هنا بهذا السوء (فقط ساذجة ومضللة): قد تكون هناك ملفات يتم تخزينها مؤقتًا ، والتي من غير المحتمل الوصول إليها في المستقبل القريب ، على سبيل المثال ملفات السجل. ذاكرة الوصول العشوائي "تلتهم" ، والتي سيتم تحريرها في وقت لاحق عند الضرورة من قبل نظام التشغيل بطريقة واحدة أو أخرى.

اعتمادًا على إعدادات السلاسة ، ونمط الوصول إلى الملفات ، ونمط تخصيص الذاكرة والعديد من الأشياء التي لا يمكن التنبؤ بها ، قد يحدث أنه عندما لا تقوم بتحرير ذاكرات التخزين المؤقت هذه ، فسوف يضطرون في وقت لاحق إلى إعادة استخدامها ، الأمر الذي يستغرق وقتًا أطول قليلاً من تخصيص الذاكرة من تجمع الذاكرة غير المستخدمة. في أسوأ الحالات ، ستؤدي إعدادات swappiness من linux إلى تبديل ذاكرة البرنامج ، لأن Linux يعتقد أن هذه الملفات قد تكون أكثر احتمالاً لاستخدامها في المستقبل القريب من ذاكرة البرنامج.

في بيئتي ، تخمينات لينكس خاطئة في كثير من الأحيان ، وفي بداية معظم البورصات الأوروبية (حوالي الساعة 0900 بالتوقيت المحلي) ، ستبدأ الخوادم في القيام بأشياء يفعلونها مرة واحدة فقط في اليوم ، وتحتاج إلى تبديل الذاكرة التي تم تبادلها سابقًا بسبب الكتابة كانت ملفات السجل ، وضغطها ، ونسخها وما إلى ذلك ، تملأ ذاكرة التخزين المؤقت إلى النقطة التي يجب فيها تبديل الأشياء.

لكن هل يتم إسقاط مخابئ الحل لهذه المشكلة؟ بالتأكيد لا. ما هو الحل هنا هو إخبار لينكس بما لا يعرفه: أنه من المحتمل ألا يتم استخدام هذه الملفات بعد الآن. يمكن القيام بذلك من خلال تطبيق الكتابة باستخدام أشياء مثل posix_fadvise()أو باستخدام أداة خط كمد مثل vmtouch (والتي يمكن استخدامها أيضًا للنظر في الأمور بالإضافة إلى ملفات ذاكرة التخزين المؤقت).

وبهذه الطريقة يمكنك إزالة البيانات التي لم تعد هناك حاجة إليها من ذاكرات التخزين المؤقت ، والاحتفاظ بالأشياء التي يجب تخزينها مؤقتًا ، لأنه عندما تقوم بإسقاط جميع ذاكرات التخزين المؤقت ، يجب إعادة قراءة الكثير من الأشياء من القرص. وهذا في أسوأ لحظة ممكنة: عندما تكون هناك حاجة إليه ؛ تسبب تأخيرات في تطبيقك ملحوظة وغير مقبولة في كثير من الأحيان.

ما يجب أن يكون موجودًا هو نظام يراقب أنماط استخدام الذاكرة (على سبيل المثال ، إذا تم تبديل شيء ما) ثم تحليله ، والعمل وفقًا لذلك. قد يكون الحل هو طرد بعض الملفات الكبيرة في نهاية اليوم باستخدام vtouch ؛ قد يكون أيضا لإضافة المزيد من ذاكرة الوصول العشوائي لأن الاستخدام اليومي الذروة للخادم هو ذلك تماما.


25
2018-05-20 19:46



يتم تشغيل جميع التطبيقات على الخادم الخاص بي على nohup. ربما يتم تخزينها مؤقتا nohup.out والأكل الذاكرة؟ - ivcode
ivcode: قد يكون هذا سببًا ، تحقق من مدى ضخامتك. ربما استخدام vmtouch لمعرفة مقدار المخزنة مؤقتًا. - PlasmaHH
لدي وظيفة كرون ل cat /dev/null > path/nohup.out في كل 15 دقيقة كما هو الحال في nohup.out ينمو بسرعة. ربما يقوم لينكس بالتخزين المؤقت nohup.out حتى إذا قمت بمسحها - ivcode
ivcode إذا لم تكن بحاجة إلى الإخراج منها nohup يجب إعادة توجيهها إلى /dev/null. يبدو أن لديك بعض sysadmins قليل الخبرة تعمل على الأنظمة الخاصة بك في مرحلة ما. نرى stackoverflow.com/questions/10408816/... لكيفية المباشرة nohupالإخراج ل /dev/null - David Wilkins
على الرغم من أنه يتم مسح nohup.out في 15 دقيقة ، إذا تم قتل عملية التطبيقات لسبب ما ، سيتم تلقائيا نسخ nohup.out من برنامج نصي آخر. حاولت فامتوت. إنها أداة جيدة للغاية بالفعل - ivcode


لقد رأيت مخزونات القطرة مفيدة عند بدء تشغيل مجموعة من الأجهزة الظاهرية. أو أي شيء آخر يستخدم صفحات كبيرة مثل بعض خوادم قواعد البيانات.

غالباً ما تحتاج الصفحات الكبيرة في Linux إلى إلغاء تجزئة RAM للعثور على 2 ميغابايت من ذاكرة الوصول العشوائي الفعلية المتجاورة لوضعها في صفحة. إن تحرير كل ذاكرة التخزين المؤقت للملف يجعل هذه العملية سهلة للغاية.

لكنني أتفق مع معظم الإجابات الأخرى في أنه لا يوجد سبب جيد بشكل عام لإسقاط ذاكرة التخزين المؤقت للملف كل ليلة.


16
2018-05-22 00:47



أنا upvoted للإشارة إلى التحيز النظام الثاني هو الردود لإسقاط مخابئ. - Noah Spurrier
أيضا ، في تطبيقات HPC على عقد الذاكرة العالية (1Tb) ، ينتج عن القراءة في عدد قليل من الملفات الكبيرة كمية كبيرة من الذاكرة المخزنة مؤقتًا. نظرًا لأن العديد من تطبيقات HPC تؤدي إلى المئات من الميجابايت من النظام العالمي للمركبة ، فإن النظام يمكن أن يتوقف لساعات حيث تحرك عمليات الترحيل أجزاء صغيرة من الذاكرة المجزأة بدون فوائد عبر عقد NUMA بمجرد وصول النظام إلى "حد" الذاكرة المخبأة. أسوأ ، لا شيء يمكنك القيام به في userland لتحرير المخابئ إلا خداع النظام في تخصيص جميع كتل صغيرة 2MB يمكن في وقت واحد ثم الإفراج عن ، ترك defpagepagage والتطبيقات تعمل بشكل طبيعي. - user1649948
+1 الأمر لإنشاء صفحات كبيرة (sysctl -w vm.nr_hugepages=...) يرفض العمل حتى ما لم أول قطرات مخبأ (Arch linux). - Aleksandr Dubinsky


من الممكن أن يتم تأسيس هذا كطريقة لتثبيت النظام عندما لا يكون هناك شخص لديه المهارات أو الخبرة للعثور على المشكلة.

تحرير الموارد

سيؤدي تخزين كميات مخبأة بشكل أساسي إلى تحرير بعض الموارد ، ولكن هذا له تأثير جانبي يجعل النظام يعمل فعليًا أكثر فأكثر ليقوم بما يحاول القيام به. إذا تم تبديل النظام (محاولة القراءة والكتابة من قسم تبديل القرص بشكل أسرع من قدرته الفعلية) ، فإن إسقاط ذاكرة التخزين المؤقت بشكل دوري يمكن أن يخفف من علامة مرضولكن لا يفعل شيئا لعلاج سبب.

ما هو تناول الذاكرة؟

يجب أن تحدد ما الذي يسبب الكثير من استهلاك الذاكرة التي تجعل إسقاط ذاكرة التخزين المؤقت يبدو أنها تعمل. يمكن أن يحدث هذا بسبب أي عدد من عمليات الخوادم التي تم تكوينها بشكل سيئ أو مجرد استخدامات خاطئة. على سبيل المثال ، على خادم واحد شاهدت أقصى استخدام للذاكرة عندما وصل موقع Magento الإلكتروني إلى عدد معين من الزوار في غضون 15 دقيقة. وينتهي الأمر إلى أن يتم تكوين Apache للسماح بإجراء عدد كبير جدًا من العمليات في وقت واحد. الكثير من العمليات ، وذلك باستخدام الكثير من الذاكرة (Magento هو وحش في بعض الأحيان) = مبادلة.

الحد الأدنى

لا تفترض فقط أنه شيء ضروري. كن استباقيًا في معرفة سبب وجودها ، لديك الشجاعة لتعطيلها إذا اقترح آخرون أنها خاطئة ، ومراقبة النظام - تعرف على المشكلة الحقيقية وأصلحها.


8
2018-05-20 15:16





يحتوي Linux / m68k بالفعل على خطأ kernel الذي يسبب kswapd في الجنون ويأكل وحدة المعالجة المركزية بنسبة 100٪ (50٪ إذا كان هناك بعض المهام الأخرى المرتبطة بالـ CPU ، مثل Debian ثنائي حزمة autobuilder - vulgo buildd - يعمل بالفعل) ، والتي يمكن (معظمها الوقت ، وليس دائمًا) يمكن تخفيفه عن طريق تشغيل هذا الأمر الخاص كل بضع ساعات.

أن يقال ... الخادم الخاص بك هو على الأرجح ليس m68k (أتاري ، أميغا ، كلاسيك ماكنتوش ، VME ، Q40 / Q60 ، Sun3) النظام ؛-)

في هذه الحالة ، يتبع الشخص الذي وضع في الخطوط بعض الأسئلة المشكوك فيها أو ، في أحسن الأحوال ، مشورة عفا عليها الزمن ، أو حصل على فكرة حول كيفية استخدام ذاكرة الوصول العشوائي خطأ (التفكير الحديث في الواقع يقول "ذاكرة الوصول العشوائي الحرة هي ذاكرة الوصول العشوائي مهدرة" وتقترح التخزين المؤقت) أو "اكتشف" أن هذا "حل" مشكلة أخرى في مكان آخر (وكان كسولًا جدًا للبحث عن حل مناسب).


4
2018-05-21 08:03



"علة النواة التي تسبب kswapd أن بالجنون" - أي علة هذا؟ - Ben
@ بن انظر هذا الموضوع (هذه الرسالة واثنين من المتابعة ، واحد منها يتضمن تخمينًا من أين يمكن أن يأتي منه) - mirabilos
أواجه مشكلة مشابهة (على الرغم من أنها x86_64) والحل الوحيد في هذه اللحظة هو إسقاط ذاكرات التخزين المؤقتة serverfault.com/questions/740790/... - Fernando
Fernando لدي cronjob "انخفاض caches" على مربع m68k كذلك - mirabilos


قد يكون أحد الأسباب هو أن الموقع يشغل نوعًا من المراقبة ، والذي يتحقق من مقدار ذاكرة الوصول العشوائي الحرة ويرسل تحذيرًا للمشرفين عندما ينخفض ​​مستوى ذاكرة الوصول العشوائي دون نسبة مئوية معينة. إذا كانت أداة المراقبة هذه غبية بما يكفي لعدم تضمين ذاكرة التخزين المؤقت في حساب ذاكرة الوصول العشوائي الحرة ، فقد ترسل تحذيرات زائفة. إن إفراغ ذاكرة التخزين المؤقت بشكل منتظم يمكن أن يوقف هذه التحذيرات بينما يستمر في السماح للأداة بملاحظة أن الكبش "الحقيقي" ينخفض.

بالطبع ، في هذا النوع من الحالات ، فإن الحل الحقيقي هو تعديل أداة المراقبة لتضمين ذاكرة التخزين المؤقت في حساب الكبس الحرة ؛ تنظيف ذاكرة التخزين المؤقت هو مجرد حل واحد ، وكذلك سيئة ، لأن ذاكرة التخزين المؤقت سوف يعيد ملء بسرعة عندما عمليات الوصول إلى القرص.

لذا ، حتى لو كان افتراضاتي صحيحًا ، فإن تنظيف ذاكرة التخزين المؤقت ليس أمرًا منطقيًا ، بل إنه حل بديل من قِبل شخص غير مؤهل بما فيه الكفاية لإصلاح المشكلة الأساسية.


3
2018-05-21 06:20