روبي/روبي أون ريلز كشف تسرب الذاكرة
-
03-07-2019 - |
سؤال
لقد كتبت تطبيق ويب صغيرًا باستخدام Ruby on Rails، والغرض الرئيسي منه هو تحميل النتائج من ملفات xml وتخزينها وعرضها (يمكن أن تصل الملفات إلى عدة ميغابايت).بعد التشغيل لمدة شهرين تقريبًا، لاحظت أن عملية الهجين كانت تستخدم حوالي 4 جيجابايت من الذاكرة.لقد أجريت بعض الأبحاث حول تصحيح أخطاء تسرب ذاكرة روبي ولم أتمكن من العثور على الكثير.لذلك لدي سؤالين.
- هل هناك أي أدوات جيدة يمكن استخدامها للعثور على تسرب الذاكرة في روبي/القضبان؟
- ما نوع أنماط الترميز التي تسبب تسرب الذاكرة في روبي؟
المحلول
بعض النصائح للعثور على تسرب الذاكرة في Rails:
- استخدم ال منزل كئيب توصيل في
- ينفذ المراقبة الكشفية على وجه التحديد منشئ ملفات تعريف استخدام الذاكرة
ينفذ مراقبة FiveRuns- جرب شئ اخر مسجل استخدام الذاكرة بسيط
الأول هو استكشاف رسومي لاستخدام الذاكرة بواسطة الكائنات الموجودة في 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