كيفية الكشف عن تسرب الذاكرة في أوبونتو



جرب أداة القضاء على المشاكل

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



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



كشف تسربات الذاكرة في أوبونتو

نظرًا لأن الأدوات المستخدمة لاكتشاف تسرب الذاكرة تعتمد بشكل أساسي على موجه CLI ، فلا يهم إصدار Ubuntu الذي تقوم بتشغيلها عليه. يجب أن تعمل هذه بشكل جيد داخل محطة Unity في Ubuntu العادية ، من وحدة تحكم افتراضية في Ubuntu Server ، من lxterm في Lubuntu ، أو Konsole في Kubuntu أو حتى داخل Xfce في Xubuntu. حاول تنفيذ مهمة بسيطة مثل sudo -s واكتب كلمة مرورك للبدء.



من المفترض أن يؤدي هذا إلى الحصول على غلاف جذر إذا تم إجراؤه بشكل صحيح ، ولكنه قد يتسبب في حدوث خطأ في الذاكرة إذا كنت تعمل مع تسريب تجاوز الحد. إذا كنت قادرًا بالفعل على الوصول إلى shell root ، فحاول كتابة echo 3> / proc / sys / m / drop_caches ، واضغط على مفتاح الإدخال ثم اكتب exit. حاول تشغيل -m مجانًا أو free -m مرة أخرى لمعرفة ما إذا كان ذلك قد ساعد في تحرير الذاكرة.

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

اقترح عدد قليل من الأشخاص إضافة مزامنة الخط ؛ sudo echo 3> / proc / sys / vm / drop_caches إلى نص يعمل كرون باستمرار ، لكن هذا يتعارض مع الغرض من التخزين المؤقت للذاكرة في المقام الأول. الذاكرة الخالية بحد ذاتها هي مجرد ذاكرة وصول عشوائي غير مستخدمة ، وهذا يعني أنه يجب تحميل البيانات من ذاكرة أبطأ بكثيرالكهروميكانيكية أو أجهزة تخزين NAND. بغض النظر عن مدى سرعة هذه الأجهزة ، فهي ليست بنفس سرعة ذاكرة الوصول العشوائي ، مما يعني أنه بينما يجب عليك إصلاح تسرب الذاكرة ، يجب ألا تتلاعب بنظام ذاكرة التخزين المؤقت بمجرد ضبطه على الإعداد الأمثل.



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

إذا أعطاك Ubuntu خطأً غير عادي حول الجزء العلوي ، فحاول إصدار BUSYBOX top بدلاً من ذلك للوصول إلى إصدار أبسط من هذا البرنامج. بمجرد الحصول على قائمة ، انظر إلى٪ MEM أو عمود مشابه لمعرفة التطبيقات التي تم تخصيص معظم الذاكرة لها. بينما يمكنك ملاحظة PID وإصدار أمر kill إلى الرقم الدقيق لمعرف PID ، فإن هذا سيؤدي فقط إلى إغلاق التطبيق. قد لا يتم تحرير الذاكرة التي يستخدمونها بعد القيام بذلك ، على الرغم من أنها تستحق التصوير بالطبع.

إذا وجدت تطبيقًا يستخدم قدرًا كبيرًا من الذاكرة ، فاضغط على q للإغلاق ثم حاول قتل #### برقم PID من الشاشة السابقة. لا ينبغي قتل عمليات النظام بهذه الطريقة ، ولا يجب أن يعمل أي شيء لم يتم حفظه فيه. فكر في هذا بشكل مشابه لقتل شيء ما باستخدام قائمة مهام Ctrl + Alt + Del ، والتي يمكنك استخدامها أيضًا لهذه العملية نفسها.

عندما تعثر على برنامج يحدث له هذا باستمرار ، يمكنك حينئذٍ تهيئته لمنع السلوك في المستقبل. سيحتاج كل برنامج فردي ، بالطبع ، إلى ملاذ مختلف ، وهو ما يتجاوز مهمة اكتشاف تسرب الذاكرة فقط.

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

ما عليك سوى استخدام manembarrier أو man memusage أو man memusagestat لعرض صفحات دليل Linux للمبرمجين على هذه الإجراءات الهامة. إذا كانت هناك ترقيات في الإصدارات المستقبلية من المكتبات مع ظهور إصدارات جديدة من Ubuntu ، فسيتم تحديد التغييرات هنا دائمًا.

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

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

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

4 دقائق للقراءة