سؤال

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

  • هل هناك أي أدوات جيدة يمكن استخدامها للعثور على تسرب الذاكرة في روبي/القضبان؟
  • ما نوع أنماط الترميز التي تسبب تسرب الذاكرة في روبي؟
هل كانت مفيدة؟

المحلول

بعض النصائح للعثور على تسرب الذاكرة في Rails:

الأول هو استكشاف رسومي لاستخدام الذاكرة بواسطة الكائنات الموجودة في ObjectSpace.

سيساعدك الخياران الأخيران على تحديد أنماط استخدام محددة تؤدي إلى تضخيم استخدام الذاكرة، ويمكنك العمل من هناك.

أما بالنسبة لأنماط الترميز المحددة، فمن خلال التجربة، يتعين عليك مشاهدة أي شيء يتعامل مع ملف io، ومعالجة الصور، والعمل مع سلاسل ضخمة وما شابه ذلك.

سأتحقق مما إذا كنت تستخدم مكتبة XML الأكثر ملاءمة - من المعروف أن ReXML بطيء ويُعتقد أنه متسرب (ليس لدي أي دليل على ذلك!).تحقق أيضًا مما إذا كان بإمكانك ذلك حفظ عمليات باهظة الثمن.

نصائح أخرى

طريقة بسيطة للغاية لتسجيل استخدام الذاكرة بعد أو قبل كل طلب (فقط لنظام التشغيل Linux).

#Put this in applictation_controller.rb
before_filter :log_ram # or use after_filter
def log_ram
  logger.warn 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
end

قد ترغب في تحميل البرنامج النصي/وحدة التحكم وتجربة العبارة أولاً للتأكد من أنها تعمل على الصندوق الخاص بك.

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip

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

يعد تسرب الذاكرة مشكلة في تطبيق روبي الحالي، وهو مكان جيد للبدء في هذا الأمرhttp://whytheluckystiff.net/articles/theFullyUpturnedBin.html موقع Whytheluckystiff لم يعد موجودًا ولكن يمكنك العثور على المقالة الأصلية هنا: http://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

للحصول على إجابة أكثر تحديدًا حول المشكلات المتعلقة بعمليات روبي طويلة المدى، راجعhttp://zdavatz.wordpress.com/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/

ربما يمكنك تجربة الركاب (mod_rails). http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails

يجب عليك إلقاء نظرة على روبي البروفيسور.

قم بالتبديل إلى jruby واستخدم محلل الذاكرة الكسوف.لا توجد أداة مماثلة لروبي في الوقت الحالي.

الآن، يمكنك تشغيل ما يلي للحصول على الذاكرة بتنسيق يمكن لـ R قراءته.أفترض أن سطر السجل الخاص بك يبدو كما يلي:

1234567890 RAM USAGE: 27456K

قم بتشغيل هذا (أو قم بالتعديل إلى المجموعة):

$ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log

ثم يمكنك تشغيل هذا:

#!/bin/sh
rm -f mem.png
R --vanilla --no-save --slave <<RSCRIPT
    lst <- read.table("mem.log")
    attach(lst)
    m = memory / 1024.0
    summary(m)
    png(filename="mem.png", width=1024)
    plot(date, m, type='l', main="Memory usage", xlab="time", ylab="memory")
RSCRIPT

والحصول على رسم بياني جميل.

عملت هذه الأحجار الكريمة بالنسبة لي:

ميموري لوجيك

يضيف معرف العملية واستخدام الذاكرة في سجلات Rails الخاصة بك، وهو أمر رائع لتتبع تسرب الذاكرة

وينك

محلل السجل لتحديد الإجراءات التي تزيد بشكل كبير من حجم كومة الذاكرة المؤقتة VM

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top