متوسط الحمل الخام مضلِّل، فحملٌ قيمته 4 يُعدّ صحياً على خادم بثماني أنوية لكنه كارثي على نواة واحدة. يحلّ هذا السكربت المشكلة عبر التطبيع: يقرأ قيمة الدقيقة الواحدة من /proc/loadavg، ويقسمها على عدد الأنوية المأخوذ من nproc، ثم يقارن النسبة الناتجة لكل نواة بالحدّ LOAD_RATIO_LIMIT (1.50 افتراضياً، أي تجاوز الإشباع بنسبة 50%). وبما أن Bash لا يدعم الأرقام العشرية، تُسنَد كل العمليات الحسابية والمقارنات إلى awk الذي يطبع النسبة وعلامة منطقية لتجاوز الحدّ. عند خرق العتبة يُنشئ السكربت تقريراً مفصلاً يضم قيم الحمل لدقيقة وخمس وخمس عشرة دقيقة، والنسبة المطبَّعة، وأكثر العمليات استهلاكاً للمعالج من ps مرتبةً حسب الاستهلاك. تساعدك هذه اللقطة على تشخيص السبب فوراً بدل معرفة وجود خطأ فقط. شغّله عبر cron كل بضع دقائق للإنذار المبكر بالعمليات الجامحة أو مشاكل السعة.
تنبيه متوسط حمل المعالج
ينبّه عبر البريد عند تجاوز متوسط الحمل لكل نواة معالج نسبةً محددة.
2 مشاهدة
مشاركة
السكربت
تحميل .shbash
#!/usr/bin/env bash
#
# cpu_load_alert.sh
# Alerts when the system 1-minute load average exceeds a per-core threshold.
# Load is normalised by CPU count so the script behaves the same on any host.
#
set -euo pipefail
# ---- Configuration -----------------------------------------------------------
# Alert when (load1 / cores) is greater than this ratio. 1.00 == fully loaded.
LOAD_RATIO_LIMIT="${LOAD_RATIO_LIMIT:-1.50}"
ALERT_EMAIL="${ALERT_EMAIL:-root@localhost}"
HOSTNAME_FQDN="$(hostname -f 2>/dev/null || hostname)"
# ---- Gather metrics ----------------------------------------------------------
# /proc/loadavg fields: load1 load5 load15 running/total lastpid
read -r load1 load5 load15 _ < /proc/loadavg
cores="$(nproc)"
# Compute the normalised ratio with awk (bash has no floating-point math).
ratio="$(awk -v l="${load1}" -v c="${cores}" 'BEGIN { printf "%.2f", l / c }')"
# Compare the floats; awk returns 1 (true) when over the limit.
over_limit="$(awk -v r="${ratio}" -v lim="${LOAD_RATIO_LIMIT}" \
'BEGIN { print (r > lim) ? 1 : 0 }')"
# ---- Report ------------------------------------------------------------------
if [[ "${over_limit}" -eq 1 ]]; then
subject="[CPU ALERT] ${HOSTNAME_FQDN}: load ratio ${ratio} (>${LOAD_RATIO_LIMIT})"
{
echo "High CPU load detected on ${HOSTNAME_FQDN}."
echo
echo "Cores : ${cores}"
echo "Load (1/5/15 min): ${load1} / ${load5} / ${load15}"
echo "Per-core ratio : ${ratio} (limit ${LOAD_RATIO_LIMIT})"
echo
echo "Top CPU consumers:"
ps -eo pid,comm,%cpu --sort=-%cpu | head -n 6
echo
echo "Checked at: $(date '+%Y-%m-%d %H:%M:%S %Z')"
} | mail -s "${subject}" "${ALERT_EMAIL}"
echo "Alert sent: ratio ${ratio} over ${LOAD_RATIO_LIMIT}."
else
echo "OK: load ratio ${ratio} within limit ${LOAD_RATIO_LIMIT}."
fiكيفية التشغيل
راجع السكربت أولاً، ثم حمّله أو انسخه وشغّله في بيئتك.
قد يعجبك أيضاً
bashlinuxمبتدئ
تنبيه تجاوز عتبة استخدام القرص
يرسل بريداً إلكترونياً للمسؤول عند تجاوز أي قسم مثبّت لنسبة استخدام محددة.
pythoncross-platformمتوسط
حاسبة موعد التشغيل التالي لتعبير cron
عند إعطاء تعبير cron يطبع المواعيد التالية لتشغيله مع العد التنازلي لكل منها.
bashlinuxمتوسط
نسخ احتياطي لكل قواعد بيانات MySQL باستخدام mysqldump
يُفرغ كل قاعدة بيانات MySQL في ملف SQL مضغوط مستقل.