تشخيص مشاكل تحميل خادم لينكس مع سيناريو بسيط
إذا كنت مسؤولاً عن أي فترة من الوقت ، فقد اكتشفت بالتأكيد الحالات التي يرتفع فيها الخادم في استخدام وحدة المعالجة المركزية أو استخدام الذاكرة و / أو مستويات التحميل. تشغيل 'top' لن يعطيك الإجابة دائمًا. إذا كيف يمكنك العثور على تلك العمليات الخادعة التي تمضغ موارد النظام لديك حتى تتمكن من قتلهم?
قد يكون البرنامج النصي التالي قادرًا على المساعدة. تم كتابته لخادم الويب ، لذلك بعض أجزاء منه تبحث تحديدًا عن عمليات httpd وبعض الأجزاء التي تتعامل مع MySQL. استنادًا إلى نشر الخادم ، ما عليك سوى التعليق / حذف هذه الأقسام وإضافة أخرى. يجب استخدامه لنقطة البداية.
المتطلبات الأساسية لهذا الإصدار من البرنامج النصي هي بعض البرامج المجانية التي تم إصدارها تحت رخصة جنو العمومية العامة المسماة mytop (متوفرة على http://jeremy.zawodny.com/mysql/mytop/) والتي تعتبر أداة رائعة للتحقق من أداء MySQL. إنها قديمة ، ولكنها لا تزال رائعة في أغراضنا هنا.
بالإضافة إلى ذلك ، أستخدم mutt كجهاز الإرسال - قد ترغب في تغيير البرنامج النصي ببساطة باستخدام أداة linux المضمنة في "البريد". أديرها عبر cron كل ساعة. ضبط كما ترى مناسبا. أوه - وهذا البرنامج النصي يحتاج إلى تشغيل كجذر لأنه لا يقرأ من بعض المناطق المحمية من الخادم.
لذلك دعونا نبدأ ، يجب علينا?
أولاً ، قم بتعيين متغيرات البرنامج النصي الخاص بك:
#! / بن / سحق
#
# Script للتحقق من مستويات متوسط تحميل النظام لمحاولة تحديد
# ما هي العمليات التي تأخذها مرتفعة بشكل مفرط ...
#
# 07Jul2010 tjones
#
# مجموعة البيئة
dt = "date +٪ d٪ b٪ Y-٪ X"
# من الواضح ، تغيير الدلائل التالية إلى حيث يتم الاحتفاظ ملفات السجل بالفعل
tmpfile = "/ تمة / checkSystemLoad.tmp"
ملف السجل = "/ تمة / checkSystemLoad.log"
msgLog = "/ فار / السجل / رسائل"
mysqlLog = "/ فار / سجل / mysqld.log"
# mailstop الأول هو البريد الإلكتروني القياسي للتقارير. والثاني هو للهاتف المحمول (مع تقرير انخفض إلى أسفل)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
الجهاز = "المضيف"
# الثلاثة التالية هي لاستخدام mytop - استخدام مستخدم ديسيبل لديه حقوق لائقة
dbusr = "اسم المستخدم"
dbpw = "كلمة السر"
ديسيبل = "yourdatabasename"
# ما يلي هو مستوى التحميل للتحقق - 10 مرتفع حقًا ، لذلك قد ترغب في خفضه.
levelToCheck = 10
بعد ذلك ، تحقق من مستوى التحميل لمعرفة ما إذا كان يجب متابعة النص البرمجي:
# مجموعة المتغيرات من النظام:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "٪ 0.f" $ loadLevel)# إذا كان مستوى التحميل أكبر مما تريد ، فابدأ عملية البرنامج النصي. خلاف ذلك ، الخروج 0
إذا كان [$ loadLevel -gt $ levelToCheck] ؛ ثم
echo ""> $ tmpfile
صدى "**************************************" >> tmpfile $
صدى "التاريخ: $ dt" >> tmpfile $
صدى "التحقق من تحميل النظام والعمليات" >> tmpfile $
صدى "**************************************" >> tmpfile $
وتستمر من خلال الشيكات ، وكتابة النتائج إلى الملف المؤقت. إضافة أو حذف عناصر من هنا حيثما ينطبق ذلك على موقفك:
# الحصول على المزيد من المتغيرات من النظام:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# عرض مستوى التحميل الحالي:
صدى "مستوى التحميل: $ loadLevel" >> tmpfile $
صدى صوت "************************************************ * ">> tmpfile $# عرض عدد عمليات httpd التي يتم تشغيلها الآن (لا تشمل الأطفال):
echo "عدد عمليات httpd الآن: $ httpdProcesses" >> tmpfile $
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# عرض قائمة العملية:
صدى "العمليات قيد التشغيل الآن:" >> tmpfile $
ملاحظة f -ef >> $ tmpfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# عرض معلومات MySQL الحالية:
صدى "النتائج من mytop:" >> tmpfile $
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $
لاحظ بالأمر الأعلى ، نكتب إلى ملفين مؤقتين. واحد هو لرسالة أصغر بكثير إلى الهاتف الخليوي. إذا كنت لا ترغب في إلحاح تنبيهات الهاتف الخليوي في الساعة الثالثة صباحًا ، فيمكنك إخراج ذلك (واخراج روتين البريد الثاني لاحقًا في البرنامج النصي).
# إظهار الجزء العلوي الحالي:
صدى "أعلى الآن يظهر:" >> tmpfile $
صدى "أعلى الآن يظهر:" >> $ topfile
/ usr / bin / top -b -n1 >> tmpfile $
/ usr / bin / top -b -n1 >> $ topfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $
مزيد من الشيكات:
# إظهار الاتصالات الحالية:
صدى "netstat الآن يظهر:" >> tmpfile $
/ bin / netstat -p >> tmpfile $
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# تحقق من مساحة القرص
صدى "مساحة القرص:" >> tmpfile $
/ bin / df -k >> $ tmpfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $
ثم اكتب محتويات الملف المؤقتة إلى ملف سجل أكثر دوامًا وارسل النتائج عبر البريد الإلكتروني إلى الأطراف المناسبة. الرسائل البريدية الثانية هي عبارة عن نتائج مجملة تتكون ببساطة من المعيار القياسي من "top":
# إرسال النتائج إلى ملف السجل:
/ bin / cat $ tmpfile >> $ logfile# ونتائج البريد الإلكتروني إلى مسؤول النظام:
/ usr / bin / mutt -s "$ machine يحتوي على مستوى تحميل عالي! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ ملف السجل
ثم بعض التدبير المنزلي والخروج:
# ثم قم بإزالة الملف المؤقت:
rm $ tmpfile
rm $ topfile
فاي#
الخروج 0
نأمل أن يساعد هذا شخص ما هناك. البرنامج النصي المجمّع بالكامل هو:
#! / بن / سحق
#
# Script للتحقق من مستويات متوسط تحميل النظام لمحاولة تحديد العمليات
# أخذها مرتفعا للغاية ...
#
# مجموعة البيئة
dt = "date +٪ d٪ b٪ Y-٪ X"
# من الواضح ، تغيير الدلائل التالية إلى حيث يتم الاحتفاظ ملفات السجل بالفعل
tmpfile = "/ تمة / checkSystemLoad.tmp"
ملف السجل = "/ تمة / checkSystemLoad.log"
msgLog = "/ فار / السجل / رسائل"
mysqlLog = "/ فار / سجل / mysqld.log"
# mailstop الأول هو البريد الإلكتروني القياسي للتقارير. والثاني هو للهاتف المحمول (مع تقرير انخفض إلى أسفل)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
الجهاز = "المضيف"
# الثلاثة التالية هي لاستخدام mytop - استخدام مستخدم ديسيبل لديه حقوق لائقة
dbusr = "اسم المستخدم"
dbpw = "كلمة السر"
ديسيبل = "yourdatabasename"
# ما يلي هو مستوى التحميل للتحقق - 10 مرتفع حقًا ، لذلك قد ترغب في خفضه.
levelToCheck = 10
# مجموعة المتغيرات من النظام:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "٪ 0.f" $ loadLevel)# إذا كان مستوى التحميل أكبر مما تريد ، فابدأ عملية البرنامج النصي. خلاف ذلك ، الخروج 0
إذا كان [$ loadLevel -gt $ levelToCheck] ؛ ثم
echo ""> $ tmpfile
صدى "**************************************" >> tmpfile $
صدى "التاريخ: $ dt" >> tmpfile $
صدى "التحقق من تحميل النظام والعمليات" >> tmpfile $
صدى "**************************************" >> tmpfile $# الحصول على المزيد من المتغيرات من النظام:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# عرض مستوى التحميل الحالي:
صدى "مستوى التحميل: $ loadLevel" >> tmpfile $
صدى صوت "************************************************ * ">> tmpfile $# عرض عدد عمليات httpd التي يتم تشغيلها الآن (لا تشمل الأطفال):
echo "عدد عمليات httpd الآن: $ httpdProcesses" >> tmpfile $
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# عرض قائمة العملية:
صدى "العمليات قيد التشغيل الآن:" >> tmpfile $
ملاحظة f -ef >> $ tmpfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# عرض معلومات MySQL الحالية:
صدى "النتائج من mytop:" >> tmpfile $
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# إظهار الجزء العلوي الحالي:
صدى "أعلى الآن يظهر:" >> tmpfile $
صدى "أعلى الآن يظهر:" >> $ topfile
/ usr / bin / top -b -n1 >> tmpfile $
/ usr / bin / top -b -n1 >> $ topfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# إظهار الاتصالات الحالية:
صدى "netstat الآن يظهر:" >> tmpfile $
/ bin / netstat -p >> tmpfile $
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# تحقق من مساحة القرص
صدى "مساحة القرص:" >> tmpfile $
/ bin / df -k >> $ tmpfile
صدى صوت "************************************************ * ">> tmpfile $
صدى "" >> tmpfile $# إرسال النتائج إلى ملف السجل:
/ bin / cat $ tmpfile >> $ logfile# ونتائج البريد الإلكتروني إلى مسؤول النظام:
/ usr / bin / mutt -s "$ machine يحتوي على مستوى تحميل عالي! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ ملف السجل# ثم قم بإزالة الملف المؤقت:
rm $ tmpfile
rm $ topfile
فاي#
الخروج 0