المقدمة
يصف هذا المستند إجراء أستكشاف أخطاء إستخدام الذاكرة العالية وإصلاحها باستخدام مجموعة سياسات Cisco (CPS).
المتطلبات الأساسية
المتطلبات
توصي Cisco بأن تكون لديك معرفة بالمواضيع التالية:
ملاحظة: توصي Cisco بوجود حق وصول جذر امتياز إلى CPS CLI.
المكونات المستخدمة
تستند المعلومات الواردة في هذا المستند إلى إصدارات البرامج والمكونات المادية التالية:
- CPS 20.2
- نظام الحوسبة الموحدة (UCS)-B
- MongoDB الإصدار 3.6.17
تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك قيد التشغيل، فتأكد من فهمك للتأثير المحتمل لأي أمر.
معلومات أساسية
يملك Linux مجموعة واسعة من الأدوات لدعم وإدارة ومراقبة ونشر تطبيقات البرامج.
يمكن أن تستهلك الخدمات والميزات التي تمت إضافتها إلى تطبيق المنتج مساحة كبيرة من الذاكرة. إن تحسين الذاكرة لخوادم لينوكس لا يجعل التطبيقات تعمل بسلاسة وسرعة فحسب، بل يقلل أيضا من مخاطر فقدان البيانات وتعطل الخادم.
لتحسين ذاكرة أجهزة لينوكس، تحتاج أولا لفهم كيفية عمل الذاكرة في لينوكس. يمكنك البدء ببعض مصطلحات الذاكرة ومناقشة كيفية تعامل نظام التشغيل Linux مع الذاكرة ثم التعرف على كيفية أستكشاف أخطاء الذاكرة وإصلاحها ومنع حدوثها.
يعتمد المقدار الإجمالي للذاكرة الذي يمكن أن يحتوي عليه جهاز واحد على بنية نظام التشغيل.
الذاكرة بأكملها في بيئة لينوكس تسمى الذاكرة الافتراضية، فهي تشتمل على الذاكرة الفعلية (التي تسمى في كثير من الأحيان RAM - ذاكرة الوصول العشوائي Randon Access Memory) ومساحة بديلة. لا يمكن زيادة الذاكرة الفعلية للنظام ما لم نقوم بإضافة المزيد من ذاكرة الوصول العشوائي (RAM). ومع ذلك، يمكن زيادة مساحة الذاكرة الظاهرية باستخدام مساحة التبديل من القرص الثابت.
تحدد ذاكرة الوصول العشوائي (RAM) ما إذا كان الجهاز لديك يمكنه معالجة عمليات إستهلاك ذاكرة عالية أم لا.
يتم إرسال البيانات من المستخدم وعمليات الكمبيوتر ومحرك الأقراص الثابتة (HDD) إلى ذاكرة الوصول العشوائي (RAM). عند الحاجة، تقوم ذاكرة الوصول العشوائي (RAM) بتخزين هذه الذاكرة وإرسالها مرة أخرى إلى المستخدم أو محرك الأقراص الثابتة. إذا كانت البيانات بحاجة إلى الاحتفاظ بها، ترسلها ذاكرة الوصول العشوائي (RAM) إلى وحدة المعالجة المركزية (CPU).
للتحقق من توفر مساحة حرة في جهازك، يمكنك إستخدام الأمر "مجاني".
[root@installer ~]# free -h
total used free shared buff/cache available
Mem: 11Gi 1.3Gi 2.9Gi 105Mi 7.4Gi 10Gi
Swap: 0B 0B 0B
[root@installer ~]#
المشكلة
يستطيع خادم لينوكس إستهلاك مقدار كبير من الذاكرة لأسباب مختلفة. لحل المشاكل بسرعة وبشكل فعال، عليك أولا إستبعاد الأسباب المحتملة.
عملية Java:
هناك العديد من التطبيقات التي تم تنفيذها باستخدام Java، وقد يؤدي تنفيذها أو تكوينها غير الصحيح إلى إستخدام الذاكرة بشكل كبير في الخادم. السببان الأكثر شيوعا هما التكوين الخاطئ في ذاكرة التخزين المؤقت وذاكرة التخزين المؤقت للجلسة المضادة للنمط.
يعتبر التخزين المؤقت طريقة شائعة لتحقيق أداء فائق للتطبيقات، ولكن عند تطبيقه بشكل غير صحيح، فقد يؤدي ذلك إلى الإضرار بأداء النظام بدلا من ذلك. قد تؤدي التهيئة الخاطئة إلى زيادة ذاكرة التخزين المؤقت بسرعة كبيرة، مما يؤدي إلى ترك مساحة أقل من الذاكرة للعمليات الأخرى التي يتم تشغيلها في النظام.
غالبا ما يتم إستخدام التخزين المؤقت للجلسة عند تخزين الحالة الوسيطة للتطبيق. إنها تسمح للمطورين بتخزين المستخدمين في كل جلسة عمل وتجعل من السهل حفظ أو الحصول على قيمة كائن البيانات. على أي حال، يميل المطورون إلى نسيان تنظيف بيانات التخزين المؤقت للجلسة بعد ذلك.
عند العمل باستخدام قواعد البيانات في Java، يتم إستخدام جلسة الإسبات بشكل شائع لإنشاء الاتصالات وإدارة الجلسة بين الخادم وقاعدة البيانات. ولكن هناك خطأ يحدث كثيرا عندما يعمل المطورون مع جلسات الإسبات. بدلا من أن يتم عزلها لضمان أمان مؤشر الترابط، يتم تضمين جلسة عمل الإسبات في نفس جلسة عمل بروتوكول نقل النص التشعبي (HTTP). وهذا يجعل من مخزن التطبيقات حالات أكثر من اللازم، ومع عدد قليل من المستخدمين فقط، يزداد إستخدام الذاكرة بشكل كبير.
قاعدة البيانات:
عند مناقشة عمليات إستهلاك الذاكرة العالية، يجب ذكر قواعد البيانات. مع وجود العديد من عمليات القراءة والكتابة إلى قاعدة البيانات أثناء معالجة التطبيق لطلبات المستخدم، يمكن لقاعدة البيانات أن تستهلك مساحة كبيرة من الذاكرة.
أستخدم قاعدة بيانات MongoDB كمرجع: لتحقيق أداء عال، فإنها تطبق آلية تخزين مؤقت لتخزين البيانات مؤقتا وفهرستها. إذا قمت بتكوين قاعدة البيانات لاستخدام الحد الأقصى من الذاكرة عندما يكون لديك العديد من الطلبات إلى قاعدة البيانات، فسيصبح من الممكن قريبا تجاوز سعة الذاكرة الموجودة في خادم Linux.
يمكن مراقبة إستهلاك ذاكرة CPS باستخدام مؤشرات الأداء الرئيسية (KPI) المناسبة في الرسومات البيانية Grafana أو أدوات أخرى للمراقبة. إذا زاد إستهلاك الذاكرة عن الحد الافتراضي البالغ 90٪ على أي جهاز افتراضي (VM) يعمل CPS على توليد تنبيه منخفض الذاكرة لذلك الجهاز الظاهري. يمكن تكوين هذه العتبة في "قالب نشر CPS" باستخدام إعدادات free_mem_per.
التعرف على العملية/الأداة المساعدة التي تتسبب في زيادة إستخدام الذاكرة:
1. سجل الدخول إلى الجهاز الظاهري (VM) الذي أصدر تنبيه انخفاض الذاكرة.
2. انتقل إلى /var/log الدليل وقم بإيداع top_memory_consuming_processesالملف لتحديد معرف العملية (PID) الذي يحتوي على نسبة عالية من إستهلاك الذاكرة.
******************** Date: Tue May 16 05:06:01 UTC 2023 *****************
PID PPID CMD %MEM %CPU RSS PRI STAT PSR WCHAN NI P
9435 1 /usr/bin/java -XX:OnOutOfMe 26.7 77.9 4353796 5 S<l 2 - -15 *
24139 1 /usr/java/default/bin/java 1.0 0.0 174636 20 Sl 3 - 0 *
2905 2862 /usr/sbin/collectd -C /etc/ 1.0 0.2 169104 20 Sl 1 hrtimer_nanosl 0 *
913 1 /usr/lib/systemd/systemd-jo 0.4 0.1 69364 20 Ss 5 do_epoll_wait 0 *
1513 1 /usr/libexec/platform-pytho 0.1 0.0 27912 20 Ssl 5 - 0 *
3379 2905 /usr/sbin/collectd -C /etc/ 0.1 0.0 23716 20 Sl 3 - 0 *
3377 2905 /usr/sbin/collectd -C /etc/ 0.1 0.0 23712 20 Sl 4 - 0 *
3378 2905 /usr/sbin/collectd -C /etc/ 0.1 0.0 23712 20 Sl 5 - 0 *
3380 2905 /usr/sbin/collectd -C /etc/ 0.1 0.0 23712 20 Sl 5 - 0 *
******************** END *****************
3. تحقق من صحة العملية بواسطة هذا الأمر، سواء كانت عملية تطبيق أو قاعدة بيانات.
#ps -ef | grep <PID>
إجراء حل مشاكل إستخدام الذاكرة العالية باستخدام CPS
إن تحسين سعة الذاكرة في نظام التشغيل Linux أمر معقد، وإن إصلاح سعة الذاكرة التي تم تحميلها بشكل زائد يتطلب جهدا كبيرا.
الاقتراب 1.
اكتشاف الذاكرة المخزنة مؤقتا واستعادتها:
في بعض الحالات، يمكن أن يكون انخفاض تنبيه الذاكرة نتيجة لإدارة ذاكرة لينوكس حيث تقوم بتخصيص الكائنات في ذاكرة التخزين المؤقت.
لتقييم مقدار الذاكرة التي قام الجهاز الظاهري بتخزينها مؤقتا وتشغيل Linux لتحرير بعض من الذاكرة المخزنة مؤقتا.
1. قارن مقدار الذاكرة المخزنة مؤقتا على إثنين أو أكثر من الأجهزة الافتراضية من فئة CPS، للقيام بذلك free -m لتشغيل الأمر على كل جهاز افتراضي.
[root@dc1-qns01 ~]# free -m
total used free shared buff/cache available
Mem: 15876 5262 4396 808 6217 9628
Swap: 4095 0 4095
[root@dc1-qns01 ~]#
2. لاستعادة بعض الذاكرة غير النشطة المخزنة مؤقتا، قم بتشغيل هذا الأمر.
#free && sync && echo 3 > /proc/sys/vm/drop_caches && echo "" && free
[root@dc1-qns01 ~]# free -m
total used free shared buff/cache available
Mem: 15876 5016 8782 872 2076 9809
Swap: 4095 0 4095
[root@dc1-qns01 ~]#
يرجى الملاحظة:
1. يتجاهل هذا الأمر كائنات ذاكرة التخزين المؤقت التي يمكن أن تتسبب في زيادة مؤقتة في إستخدام إخراج الإدخال (IO) ووحدة المعالجة المركزية (CPU)، لذلك فمن المستحسن تشغيل هذا الأمر في ساعات غير ساعات الذروة/إطار الصيانة.
2. هذا أمر غير مدمر والذاكرة الحرة فقط غير المستخدمة.
إذا كان تنبيه انخفاض الذاكرة لا يزال بلا حل، فتابع مع النهج 2.
الاقتراب 2.
إذا كان إستهلاك الذاكرة العالي يرجع إلى أي من عمليات التطبيق مثل QNS وما إلى ذلك.
1. قم بإعادة تشغيل العملية.
Command Syntax:
#monit restart <process name>
2. التحقق من تقليل إستخدام الذاكرة حسب free-m الأمر.
إذا كان تنبيه انخفاض الذاكرة لا يزال بلا حل، فتابع مع النهج 3.
الاقتراب 3.
قم بإعادة تشغيل VM الذي تم إنشاء تنبيهات له، حيث تتم إعادة تشغيل VM عادة لزيادة الموارد إلى VM (وحدة المعالجة المركزية لذاكرة القرص).
إذا تم ملاحظة إستخدام كبير للذاكرة من أجل VM لخادم SessionMgr، فقم بالمتابعة مع النهج 4.
الاقتراب 4.
1. سجل الدخول إلى الجهاز الظاهري (VM) الذي تم اكتشاف إستخدام كبير للذاكرة من أجله.
2. انتقل إلى /var/log الدليل وقم بإيداع mongodb-<xxxx>.log الملف للتحذير/الرسائل المتعلقة باستهلاك الذاكرة والمعلمةwriteConcernMajorityJournalDefault.
2022-12-13T00:30:39.012+0200 I REPL [replexec-0] ** WARNING: This replica set node is running without journaling enabled but the
2022-12-13T00:30:39.012+0200 I REPL [replexec-0] ** writeConcernMajorityJournalDefault option to the replica set config
2022-12-13T00:30:39.012+0200 I REPL [replexec-0] ** is set to true. The writeConcernMajorityJournalDefault
2022-12-13T00:30:39.012+0200 I REPL [replexec-0] ** option to the replica set config must be set to false
2022-12-13T00:30:39.012+0200 I REPL [replexec-0] ** or w:majority write concerns will never complete.
2022-12-13T00:30:39.012+0200 I REPL [replexec-0] ** In addition, this node's memory consumption may increase until all
2022-12-13T00:30:39.012+0200 I REPL [replexec-0] ** available free RAM is exhausted.
3. تسجيل الدخول إلى MongoShell الخاص بكل منهما والتحقق من القيم الحالية لبروتوكول Mongo وwriteConcernMajorityJournalDefault .
set04:PRIMARY> rs.status().optimes.lastCommittedOpTime.t
NumberLong(0)
set04:PRIMARY>
ملاحظة: دائما ما تكون القيمة السالبة في NumberLong O/P مع الإصدار 0 من بروتوكول أحادي.
set04:PRIMARY> rs.conf().writeConcernMajorityJournalDefault
set04:PRIMARY>
ملاحظة: إذا كان الإخراج لا يرجع شيئا، فيجب عليك إعتبار أن writeConcernMajorityJournalDefault القيمة تم تعيينها كقيمة صحيحة بشكل افتراضي.
4. إذا كانت protocolVersion 1 وwriteConcernMajorityJournalDefaultالقيمة true writeConcernMajorityJournalDefault، فقم بتشغيل هذه الأوامر من MongoShell المقابلة لتعديل القيمة إلى false.
#cfg=rs.conf()
#cfg.writeConcernMajorityJournalDefault=false
#rs.reconfig(cfg)
5. تأكد من أن writeConcernMajorityJournalDefault القيمة قد تغيرت إلى false .
set03:PRIMARY> rs.conf().writeConcernMajorityJournalDefault
false
set03:PRIMARY>
6. التحقق من تقليل إستخدام الذاكرة حسب free-m الأمر.