التخزين المؤقت لينكس. تحسين نظام التشغيل Linux للتحميل. يكتب قرص التخزين المؤقت. التخزين المؤقت في لينكس

09.07.2020

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

التخزين المؤقت في لينكس

عند كتابة البيانات على القرص (بواسطة أي برنامج)، يقوم Linux بتخزين هذه المعلومات مؤقتًا في منطقة من الذاكرة تسمى "Page Cache". يمكن عرض المعلومات حول منطقة الذاكرة هذه باستخدام الأوامر مجاني، فمستاتأو قمة. معلومات كاملةيمكنك أن ترى حول منطقة الذاكرة هذه في الملف /proc/meminfo. فيما يلي مثال لهذا الملف على خادم مزود بذاكرة وصول عشوائي (RAM) سعة 4 جيجابايت:

إجمالي الذاكرة: 3950112 كيلو بايت MemFree: 622560 كيلو بايت المخازن المؤقتة: 78048 كيلو بايت مخزنة مؤقتًا: 2901484 كيلو بايت مخزنة مؤقتًا: 0 كيلو بايت نشط: 3108012 كيلو بايت غير نشط: 55296 كيلو بايت عالي الإجمالي: 0 كيلو بايت عالي مجاني: 0 كيلو بايت منخفض الإجمالي: 3950112 كيلو بايت منخفض مجاني: 62256 0 كيلو بايت إجمالي المبادلة: 4198272 كيلو بايت قابلة للتبديل : 4198244 كيلو بايت متسخ: 416 كيلو بايت الكتابة: 0 كيلو بايت المعينة: 999852 كيلو بايت اللوحة: 57104 كيلو بايت الالتزام_AS: 3340368 كيلو بايت جداول الصفحات: 6672 كيلو بايت Vmalloc الإجمالي: 536870911 كيلو بايت Vmalloc المستخدمة: 35300 كيلو بايت VmallocChunk: 53683 5 611 كيلو بايت صفحات ضخمة_الإجمالي: 0 صفحات ضخمة_مجانية: 0 حجم صفحات ضخمة: 2048 كيلو بايت

يظهر حجم ذاكرة التخزين المؤقت للصفحة في المعلمة "نسخة مخبأة"، في في هذا المثالتبلغ مساحتها 2.9 جيجابايت. أثناء كتابة الصفحات في الذاكرة، يزداد حجم المعلمة "القذرة". عند بدء الكتابة مباشرة على القرص، ستزداد معلمة "الكتابة" حتى انتهاء التسجيل. من الصعب جدًا رؤية معلمة "إعادة الكتابة" عالية، نظرًا لأن قيمتها تزيد فقط أثناء الاستقصاء، عندما تكون عمليات الإدخال/الإخراج (I/O) في قائمة الانتظار ولكن لم تتم كتابتها بعد على القرص.
يقوم Linux عادةً بكتابة البيانات من ذاكرة التخزين المؤقت إلى القرص باستخدام عملية ما pdflush. في أي لحظة يوجد من 2 إلى 8 خيوط تعمل في النظام pdflush. في الملف /proc/sys/vm/nr_pdflush_threadsيمكنك معرفة عدد المواضيع النشطة النشطة حاليًا. في كل مرة تكون جميع سلاسل pdflush الموجودة مشغولة على الأقل 1 ثانية. تحاول الخيوط الجديدة كتابة البيانات لتحرير قوائم انتظار الأجهزة، بحيث يوجد لكل جهاز نشط مؤشر ترابط واحد يقوم بمسح البيانات من ذاكرة التخزين المؤقت. في كل مرة تمر ثانية دون أي نشاط من pdflush، تتم إزالة موضوع واحد. في نظام التشغيل Linux، يمكنك ضبط الحد الأدنى والحد الأقصى لعدد سلاسل عمليات pdflush.

إعداد pdflush

يتم التحكم في كل دفق pdflush بواسطة عدة معلمات في /proc/sys/vm:

  • /proc/sys/vm/dirty_writeback_centisecs(الافتراضي 500): بمئات الثواني. يشير هذا الإعداد إلى عدد المرات التي يستأنف فيها pdflush كتابة البيانات على القرص. بشكل افتراضي، يتم استئناف خيطين كل 5 ثوانٍ.
    قد يكون هناك سلوك غير موثق يحبط محاولات تقليل dirty_writeback_centisecs للسماح لعملية pdflush بتخزين البيانات مؤقتًا بشكل أكثر قوة. على سبيل المثال، في الإصدارات السابقةفي نواة Linux 2.6، في mm/page-writeback.c، تضمن الكود المنطق الذي يقول "إذا كانت الكتابة إلى القرص تستغرق وقتًا أطول من المعلمة dirty_writeback_centisecs، فقم بتعيين الفاصل الزمني على ثانية واحدة." يتم وصف هذا المنطق فقط في كود kernel، ويعتمد تشغيله على إصدار Linux kernel. وبما أن هذا ليس جيدًا جدًا، فستتم حمايتك من تقليل هذه المعلمة.
  • /proc/sys/vm/dirty_expire_centithans(الافتراضي 3000): بمئات الثواني. تحدد هذه المعلمة المدة التي يمكن أن تبقى فيها البيانات في ذاكرة التخزين المؤقت قبل كتابتها على القرص. القيمة الافتراضية طويلة جدًا: 30 ثانية. وهذا يعني أنه عندما التشغيل العاديوإلى أن يتم كتابة ما يكفي من البيانات إلى ذاكرة التخزين المؤقت لاستدعاء طريقة pdflush أخرى، لن يقوم Linux بكتابة البيانات إلى القرص الموجود في ذاكرة التخزين المؤقت لمدة تقل عن 30 ثانية.
  • /proc/sys/vm/dirty_background_ratio(الافتراضي 10): الحد الأقصى للنسبة المئوية كبشوالتي يمكن ملؤها بواسطة ذاكرة التخزين المؤقت للصفحة قبل كتابة البيانات على القرص. قد تقوم بعض إصدارات Linux kernel بتعيين هذه المعلمة على 5%.

    تصف معظم الوثائق هذه المعلمة كنسبة مئوية من إجمالي ذاكرة الوصول العشوائي (RAM)، ولكن وفقًا لـ رموز المصدرنواة لينكس ليست كذلك. بالنظر إلى meminfo، يتم حساب المعلمة dirty_background_ratio من القيمة MemFree + مخبأة - تم تعيينها. لذلك بالنسبة لنظامنا التجريبي، فإن 10% أقل بقليل من 250 ميجابايت، ولكن ليس 400 ميجابايت.

الإجمالي: متى يبدأ pdflush التسجيل؟

في التكوين الافتراضي، تظل البيانات المكتوبة على القرص في الذاكرة حتى:

  • وتظل في الذاكرة لأكثر من 30 ثانية؛
  • تشغل الصفحات المخزنة مؤقتًا أكثر من 10% من الذاكرة العاملة.

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

عملية كتابة الصفحة

المعلمة /proc/sys/vm/dirty_ratio(الافتراضي 40): الحد الأقصى للنسبة المئوية لإجمالي ذاكرة الوصول العشوائي التي يمكن تخصيصها لذاكرة التخزين المؤقت للصفحة قبل أن يكتب pdflush البيانات إلى القرص.

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

توصيات لتحسين Linux للعمليات التي تتطلب التسجيل المتكرر

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

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

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

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

تعليمات لإعداد المعلمات

في الملف /etc/sysctl.confندخل مثلا :

Vm.dirty_background_ratio = 10 vm.dirty_ratio = 40

ثم نقوم بمزامنة ذاكرة التخزين المؤقت وبيانات القرص ومسح ذاكرة التخزين المؤقت وحفظ الإعدادات.

مزامنة؛ صدى 3 > /proc/sys/vm/drop_caches; سيسكتل -ص

دعونا نغير سلوك Ubuntu فيما يتعلق باستخدام ذاكرة الوصول العشوائي (RAM) والمبادلة (قسم المبادلة). هناك معلمة تسمى vm.swappiness، والتي تكون قيمتها الافتراضية 60 وتتحكم في النسبة المئوية ذاكرة مجانية، حيث سيبدأ الإلقاء النشط للصفحات في قسم المبادلة. بمعنى آخر، عند 100-60=40% من الذاكرة المشغولة، سيبدأ Ubuntu بالفعل في استخدام قسم المبادلة. في كميات كبيرةذاكرة الوصول العشوائي (RAM) في الكمبيوتر، من الأفضل تغيير معلمة vm.swappiness إلى 10 وبالتالي أمر Ubuntu بعدم استخدام المبادلة حتى تصل ذاكرة الوصول العشوائي المشغولة إلى 100-10=90%. لنقم بتعيين القيمة على 10 بدلاً من 60. في وحدة التحكم، أدخل الأمر التالي:

صدى 10 > /proc/sys/vm/swappiness

Sysctl -w vm.swappiness=10

لحفظ الإعداد بعد إعادة التشغيل، أضف السطر التالي إلى نهاية الملف /etc/sysctl.conf:

Vm.swappiness=10

لتطبيق الإعداد على الفور:

سيسكتل -ص

بالإضافة إلى ذلك، يمكننا التحدث عن عدة معلمات أخرى.
يقوم الملف الزائف vfs_cache_pressure بتخزين قيمة - مستوى الذاكرة المخصصة لذاكرة التخزين المؤقت. القيمة الافتراضية: 100. تؤدي زيادة هذه المعلمة إلى قيام النواة بتفريغ صفحات الذاكرة غير المستخدمة من ذاكرة التخزين المؤقت بشكل أكثر نشاطًا، أي. ستزداد كمية ذاكرة الوصول العشوائي المخصصة لذاكرة التخزين المؤقت بشكل أبطأ، مما يؤدي بدوره إلى تقليل احتمالية استخدام قسم المبادلة. من خلال تقليل هذه المعلمة، فإن النواة، على العكس من ذلك، ستحتفظ بصفحات الذاكرة في ذاكرة التخزين المؤقت لفترة أطول، بما في ذلك المبادلة. وهذا منطقي عندما يكون هناك كمية صغيرة من ذاكرة الوصول العشوائي، على سبيل المثال، إذا كان لدينا 512 ميجابايت من الذاكرة، فإن يمكن ضبط المعلمة vfs_cache_pressure على 50. سيؤدي ذلك إلى تقليل عدد عمليات القرص في قسم المبادلة، وبالتالي فإن إزالة الصفحات غير المستخدمة ستحدث بشكل أقل تكرارًا مما قد يؤدي إلى نقص الذاكرة.
إذا كنت تريد تسريع النظام ولديك ذاكرة وصول عشوائي كافية (2 جيجابايت أو أكثر)، فقم بتغيير قيمة النظام مثل هذا: Swappiness = 10, vfs_cache_pressure = 1000 (افتراضي 100)، أضف السطر التالي إلى /etc/sysctl ملف .conf:

Vm.vfs_cache_pressure=1000

أو على الطاير:

Sysctl -w vm.vfs_cache_pressure=1000

التخزين المؤقت في لينكس

عند كتابة البيانات على القرص (بواسطة أي برنامج)، يقوم Linux بتخزين هذه المعلومات مؤقتًا في منطقة من الذاكرة تسمى "Page Cache". يمكن عرض المعلومات حول منطقة الذاكرة هذه باستخدام الأوامر المجانية أو vmstat أو الأوامر العليا. يمكن الاطلاع على المعلومات الكاملة حول منطقة الذاكرة هذه في الملف /proc/meminfo. فيما يلي مثال لهذا الملف على خادم مزود بذاكرة وصول عشوائي (RAM) سعة 4 جيجابايت:

مجموع الذاكرة: 3950112 كيلو بايت
MemFree: 622560 كيلو بايت
المخازن المؤقتة: 78048 كيلو بايت
مخبأة: 2901484 كيلو بايت
SwapCached: 0 كيلو بايت
نشط: 3108012 كيلو بايت
غير نشط: 55296 كيلو بايت
إجمالي عالي: 0 كيلو بايت
HighFree: 0 كيلو بايت
الإجمالي المنخفض: 3950112 كيلو بايت
منخفض مجاني: 622560 كيلو بايت
إجمالي المبادلة: 4198272 كيلو بايت
SwapFree: 4198244 كيلو بايت
القذرة: 416 كيلو بايت
إعادة الكتابة: 0 كيلو بايت
المعينة: 999852 كيلو بايت
بلاطة: 57104 كيلو بايت
Commit_AS: 3340368 كيلو بايت
جداول الصفحات: 6672 كيلو بايت
فمالوكالإجمالي: 536870911 كيلو بايت
Vmalloc المستخدمة: 35300 كيلو بايت
VmallocChunk: 536835611 كيلو بايت
صفحات ضخمة_الإجمالي: 0
صفحات ضخمة_مجانية: 0
حجم الصفحة ضخم: 2048 كيلو بايت

يظهر حجم ذاكرة التخزين المؤقت للصفحة في المعلمة "نسخة مخبأة"، وفي هذا المثال يبلغ 2.9 جيجابايت. أثناء كتابة الصفحات في الذاكرة، يزداد حجم المعلمة "القذرة". عند بدء الكتابة على القرص، ستزداد معلمة "الكتابة" حتى انتهاء التسجيل. من الصعب جدًا رؤية معلمة "إعادة الكتابة" عالية، نظرًا لأن قيمتها تزيد فقط أثناء الاستقصاء، عندما تكون عمليات الإدخال/الإخراج (I/O) في قائمة الانتظار ولكن لم تتم كتابتها بعد على القرص.
يقوم Linux عادةً بكتابة بيانات ذاكرة التخزين المؤقت على القرص باستخدام عملية pdflush. في أي لحظة، هناك من 2 إلى 8 سلاسل pdflush قيد التشغيل على النظام. في الملف /proc/sys/vm/nr_pdflush_threads، يمكنك معرفة عدد سلاسل الرسائل النشطة حاليًا. في كل مرة تكون جميع سلاسل pdflush الموجودة مشغولة لمدة ثانية واحدة على الأقل. تحاول الخيوط الجديدة كتابة البيانات لتحرير قوائم انتظار الأجهزة، بحيث يوجد لكل جهاز نشط مؤشر ترابط واحد يقوم بمسح البيانات من ذاكرة التخزين المؤقت. في كل مرة تمر ثانية دون أي نشاط من pdflush، تتم إزالة موضوع واحد. في نظام التشغيل Linux، يمكنك ضبط الحد الأدنى والحد الأقصى لعدد سلاسل عمليات pdflush.

إعداد pdflush
يتم التحكم في كل موضوع pdflush بواسطة عدة معلمات في /proc/sys/vm:

  • /proc/sys/vm/dirty_writeback_centisecs (الافتراضي 500): بالمئات من الثواني. يشير هذا الإعداد إلى عدد المرات التي يستأنف فيها pdflush كتابة البيانات على القرص. بشكل افتراضي، يتم استئناف خيطين كل 5 ثوانٍ.
    قد يكون هناك سلوك غير موثق يحبط محاولات تقليل dirty_writeback_centisecs للسماح لعملية pdflush بتخزين البيانات مؤقتًا بشكل أكثر قوة. على سبيل المثال، في الإصدارات المبكرة من Linux kernel 2.6، كان الملف mm/page-writeback.c يتضمن منطقًا يقول "إذا استغرقت عملية الكتابة على القرص وقتًا أطول من المعلمة dirty_writeback_centisecs، فقم بتعيين الفاصل الزمني على ثانية واحدة." يتم وصف هذا المنطق فقط في كود kernel، ويعتمد تشغيله على إصدار Linux kernel. وبما أن هذا ليس جيدًا جدًا، فستتم حمايتك من تقليل هذه المعلمة.
  • code>/proc/sys/vm/dirty_expire_centithans (الافتراضي 3000): بالمئات من الثواني. تحدد هذه المعلمة المدة التي يمكن أن تبقى فيها البيانات في ذاكرة التخزين المؤقت قبل كتابتها على القرص. القيمة الافتراضية طويلة جدًا: 30 ثانية. هذا يعني أنه أثناء التشغيل العادي، حتى يتم كتابة ما يكفي من البيانات إلى ذاكرة التخزين المؤقت لاستدعاء طريقة pdflush أخرى، لن يقوم Linux بكتابة البيانات إلى القرص الذي كان موجودًا في ذاكرة التخزين المؤقت لمدة تقل عن 30 ثانية.
  • /proc/sys/vm/dirty_background_ratio (افتراضي 10): الحد الأقصى لنسبة ذاكرة الوصول العشوائي التي يمكن ملؤها بواسطة ذاكرة التخزين المؤقت للصفحة قبل كتابة البيانات إلى القرص. قد تقوم بعض إصدارات Linux kernel بتعيين هذه المعلمة على 5%.
    تصف معظم الوثائق هذا الإعداد كنسبة مئوية من إجمالي ذاكرة الوصول العشوائي (RAM)، ولكن وفقًا لكود مصدر Linux kernel، فإن هذا ليس هو الحال. بالنظر إلى meminfo، يتم حساب المعلمة dirty_background_ratio من القيمة MemFree + Cached - Mapped. لذلك بالنسبة لنظامنا التجريبي، فإن 10% أقل بقليل من 250 ميجابايت، ولكن ليس 400 ميجابايت.

متى يبدأ pdflush التسجيل؟
في التكوين الافتراضي، تظل البيانات المكتوبة على القرص في الذاكرة حتى:

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

عملية كتابة الصفحة
المعلمة /proc/sys/vm/dirty_ratio (الافتراضي 40) هي النسبة المئوية القصوى لإجمالي ذاكرة الوصول العشوائي التي يمكن تخصيصها لذاكرة التخزين المؤقت للصفحة قبل أن يكتب pdflush البيانات إلى القرص.

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

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

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

ونتيجة لذلك نحصل
في الملف /etc/sysctl.conf نضيف:

Vm.dirty_background_ratio = 10 vm.dirty_ratio = 40

ثم نقوم بمزامنة ذاكرة التخزين المؤقت وبيانات القرص ومسح ذاكرة التخزين المؤقت وحفظ المعلمات:

مزامنة؛ صدى 3 > /proc/sys/vm/drop_caches; سيسكتل -ص

لتقليل عدد عمليات إنهاء الكتابة على القرص، تحتاج إلى ضبط:

Vm.dirty_writeback_centisecs = 15000

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

فيما يلي قائمة جزئية بواجهة المستخدم الرسومية أو برامج سطر الأوامر لتمنحك الكثير للاختيار من بينها للتحقق من الذاكرة المستخدمة والمجانية على منصات Linux.

1. /proc/meminfo

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

$ cat /proc/meminfo

2. فوق

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

$ سودو فوق

3. مجاني

يعد الأمر المجاني طريقة سريعة وسهلة للحصول على نظرة عامة على استخدام الذاكرة المستمدة من /proc/meminfo. يعرض لقطة من الذاكرة الفعلية الإجمالية/المتوفرة ومبادلة النظام بالإضافة إلى المساحة المخزنة المستخدمة/المجانية في kernel.

4. مراقب نظام جنوم

GNOME System Monitor هو تطبيق رسومي يعرض تاريخًا مختصرًا لاستخدام موارد النظام لوحدة المعالجة المركزية والذاكرة ومساحة المبادلة والشبكة. كما يوفر أيضًا عملية مراقبة لاستخدام وحدة المعالجة المركزية والذاكرة.

$ جنوم-نظام-مراقبة

5.htop

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

6. مراقب نظام كيدي

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

$ksysguard

7. ميمستات

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

$ ميمستات -ص

8.نمون

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

9. ملاحظة

يمكن للأمر ps إظهار استخدام الذاكرة للعمليات الفردية في الوقت الفعلي. تتضمن معلومات استخدام الذاكرة المعروضة %MEM (النسبة المئوية للذاكرة الفعلية المستخدمة)، وVSZ (إجمالي مقدار الذاكرة الافتراضية المستخدمة)، وRSS (إجمالي مقدار الذاكرة الفعلية المستخدمة). يمكنك فرز قائمة العمليات باستخدام خيار "-فرز". على سبيل المثال، للفرز بترتيب RSS تنازلي:

$ ps aux --sort -rss

10. سم

يسمح لك الأمر smem بقياس استخدام الذاكرة الفعلية لمختلف العمليات والمستخدمين بناءً على المعلومات المتوفرة من /proc. تستخدم هذه الأداة مقياس الحجم المتناسب (PSS) لتقدير الاستخدام بدقة عمليات لينكسحجم الذاكرة الفعال يمكن تصدير تحليل استخدام الذاكرة إلى الرسوم البيانيةعلى شكل أعمدة ومقطعة إلى قطع.

$ sudo smem - اسم الفطيرة -c "pss"

11. أعلى

يوفر الأمر العلوي المراقبة العمليات الجاريةفي الوقت الحقيقي إلى جانب إحصائيات مختلفة لعمليات استخدام الموارد. تتضمن المعلومات المتعلقة بالذاكرة %MEM (النسبة المئوية للذاكرة المستخدمة)، وVIRT (إجمالي مقدار الذاكرة الافتراضية المستخدمة)، وSWAP (مقدار الذاكرة الافتراضية المبادلة)، وCODE (مقدار الذاكرة الفعلية المخصصة لتنفيذ التعليمات البرمجية)، وDATA (مقدار الذاكرة الفعلية الذاكرة المخصصة لعدم التنفيذ). - البيانات القابلة للتنفيذ)، RES (إجمالي حجم الذاكرة الفعلية المستخدمة، CODE+DATA) وSHR (حجم الذاكرة التي يحتمل مشاركتها مع العمليات الأخرى). يمكنك فرز قائمة العمليات بناءً على استخدام الذاكرة أو حجمها.

12. فمستات

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

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

$ فمستات-س


في كل توزيعة لينكسيمكنك استخدام ثلاثة أوامر لمسح ذاكرة التخزين المؤقت لذاكرة Linux. علاوة على ذلك، ليس علينا إكمال أي عمليات. هذه هي الأوامر:

مسح ذاكرة التخزين المؤقت للصفحة:
#مزامنة؛ صدى 1 > /proc/sys/vm/drop_caches
تنظيف inode و dentrie:
#مزامنة؛ صدى 2 > /proc/sys/vm/drop_caches
تنظيف inode و dentrie و PageCache:
#مزامنة؛ صدى 3 > /proc/sys/vm/drop_caches
قبل تشغيل أي من هذه الأوامر، قم بتشغيل:
$سو -
يعد ذلك ضروريًا لأن كل أمر يتطلب حقوق المستخدم المتميز للعمل. الآن دعونا نلقي نظرة على ما يحدث عند تنفيذ هذه الأوامر.

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

إذا لم يتم تنفيذ الأمر مزامنةسنقوم أيضًا بتحرير بعض المساحة، ولكن بعد القيام بذلك ستكون النتيجة أفضل.

رمز القسمة يخبر الصدفة بالانتظار حتى يكتمل الأمر الأول قبل تنفيذ أمر آخر. الأمر الأخير صدى 1 > /proc/sys/vm/drop_cachesيكتب القيمة 1 إلى الملف /proc/sys/vm/drop_caches. يشير هذا إلى النواة بأننا بحاجة إلى مسح نوع ذاكرة التخزين المؤقت التي اخترناها.

أنواع ذاكرة التخزين المؤقت في لينكس

الآن دعونا نلقي نظرة على أنواع ذاكرات التخزين المؤقت التي تسمح لك بمسح هذه الأوامر، وكيف يعمل كل ذلك.

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

يمكنك عرض حجم ذاكرة التخزين المؤقت للصفحة باستخدام الأداة المساعدة المجانية. يظهر هنا في العمود الأخير - مخبأ:
$ مجانا -ح

يعد هذا النوع من ذاكرة التخزين المؤقت هو الأكثر كفاءة وأمانًا للمسح.

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

تشغل ذاكرة التخزين المؤقت هذه القليل جدًا من الذاكرة. يتم تقديم البيانات بالبايت، وكما ترون، فهي صغيرة جدًا. يمكنك مشاهدته باستخدام الأمر:
$ القط /proc/slabinfo | egrep dentry\|inode

لا يُنصح بمسحها لتحرير ذاكرة Linux، حيث يتم استهلاك القليل من الذاكرة، ويستغرق الفحص الجديد لنظام الملفات وقتًا طويلاً نسبيًا.

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

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

مسح ذاكرة التخزين المؤقت التلقائي

دعونا نلقي نظرة على كيفية مسح ذاكرة التخزين المؤقت للذاكرة تلقائيًا كل يوم في الساعة الثانية صباحًا باستخدام برنامج جدولة مهام cron.

أولاً، لنقم بإنشاء برنامج نصي bash بالمحتوى التالي:
$ sudo vi /usr/local/bin/clearcache.sh
#!/bin/bash sync ; صدى 1 > /proc/sys/vm/drop_caches
سنقوم فقط بمسح ذاكرة التخزين المؤقت للصفحة، لأنها تستهلك معظم المساحة. لن نتطرق إلى الأنواع الأخرى، حتى لا نقلل من أداء النظام بلا داع.

بعد ذلك، اجعل البرنامج النصي قابلاً للتنفيذ:
$ sudo chmod 755 /usr/local/bin/clearcache.sh
كل ما تبقى هو إضافة المهمة إلى برنامج جدولة cron. للقيام بذلك، قم بتشغيل الأمر:
$ سودو كرونتاب -e
وفي المحرر الذي يفتح، أضف السطر:
0 2 * * * /usr/local/bin/clearcache.sh
الآن سيتم تشغيل هذا البرنامج النصي كل ليلة وتنظيف الذاكرة حتى يتمكن الخادم من العمل بشكل طبيعي.

ضبط حجم ذاكرة التخزين المؤقت

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

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

على سبيل المثال، لنجعل الحد الأدنى لحجم ذاكرة التخزين المؤقت:
# صدى 1000 > /proc/sys/vm/vfs_cache_pressure
لا تنس أن هذا سوف يقلل بشكل كبير من أداء نظامك لأنه سيتم قراءة البيانات من القرص بدلاً من ذاكرة التخزين المؤقت.

كيفية مسح ذاكرة المبادلة

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