วิธีการตรวจสอบการใช้งานหน่วยความจำเพื่อวัตถุประสงค์ในการเตือนภัย


9

เรามีระบบ Linux ในตัวโดยไม่มีการแลกเปลี่ยน

Currenly เราต้องแจ้งเตือนเมื่อหน่วยความจำเพิ่ม% การใช้งานผ่าน threashold และรีบูตเมื่อหน่วยความจำ% การใช้งานเพิ่มขึ้นกว่าขีด จำกัด (สูงกว่า)

เหตุใดเราจึงต้องการทำเช่นนั้น: หากมีบางโปรแกรมรั่วเราสามารถรีบูทเพื่อความปลอดภัยก่อนที่เคอร์เนลจะเริ่มฆ่ากระบวนการของเรา (ซึ่งอาจทำให้ข้อมูลเสียหายหรือไม่พร้อมใช้งาน)

แต่เรามีปัญหา:

วิธีการนับการใช้งานหน่วยความจำ -% ซึ่งสามารถใช้เพื่อวัตถุประสงค์ของเราได้อย่างไร

เราพยายามนับการใช้หน่วยความจำโดยใช้ค่าของ / proc / meminfo:

/ # cat /proc/meminfo
MemTotal:       126744 kB
MemFree:         58256 kB
Buffers:         16740 kB
Cached:          31308 kB
SwapCached:          0 kB
Active:          37580 kB
Inactive:        24000 kB

ปราศจากความสำเร็จ:

(MemTotal - MemFree) ไม่สามารถใช้งานได้เนื่องจากมีตัวอย่างแคช

(MemTotal - MemFree - Buffers - Cached)Inactiveไม่ละเลยผลกระทบของ ดังนั้นจึงให้ค่าการใช้หน่วยความจำที่ใหญ่เกินไป

(MemTotal - MemFree - Buffers - Cached - Inactive) ใช้ไม่ได้เนื่องจากผลลัพธ์อาจเป็นลบ

คำตอบ:


6

ตรวจสอบระบบผ่าน free

[root@localhost ~]# free
          total       used       free     shared    buffers     cached
Mem:    2058240    1776788     281452          0      89780    1335840
-/+ buffers/cache:  351168    1707072
Swap:   4095992        100    4095892

ดูที่-/+ buffers/cacheบรรทัดusedและfree

ตรวจสอบแต่ละกระบวนการผ่าน / proc

ฉันใช้สคริปต์ python นี้และ / proc / pid / stat เพื่อตรวจสอบหน่วยความจำของกระบวนการ:

http://phacker.org/2009/02/20/monitoring-virtual-memory-usage-with-python/

คุณอาจต้องการแปลสิ่งนี้เป็นค

จำกัด ทรัพยากรสำหรับแต่ละกระบวนการ

หรือใช้ulimit/setrlimit

/programming/4983120/limit-memory-usage-for-a-single-linux-process


คุณสามารถอธิบายวิธีการที่สคริปต์ Python ของคุณใช้เพื่อคำนวณการใช้หน่วยความจำได้หรือไม่? นั่นจะทำให้คำตอบนี้ดีขึ้นมาก
Flimzy

มันแค่บันทึกการใช้ vm ในขั้นตอนที่สอง ฉันใช้มันเพื่อสร้างกราฟปริมาณการใช้ mem ตลอดอายุการใช้งานของโปรแกรม สิ่งนี้มีประโยชน์ในการดีบักการรั่วไหล mem ในโปรแกรมที่ใช้เวลานาน
snies

คุณสามารถใช้สิ่งนี้เพื่อตรวจสอบ prog หลังจากเวลา init และแจ้งเตือนบางอย่าง "ธงผู้ต้องสงสัยการรั่วไหล" ถ้า vmusage ข้าม treshold บางอย่าง
snies

1
ไม่มีลิงก์ไปยัง phacker.org อีกต่อไป
f01

... ซึ่งเป็นสาเหตุที่ StarckExchange ขอให้โพสต์เนื้อหาของสคริปต์เสมอไม่ใช่แค่ลิงก์
JDS

4
#!/bin/bash

threshold=90
threshold2=95

freemem=$(($(free -m |awk 'NR==2 {print $3}') * 100))

usage=$(($freemem / 512))

if [ "$usage" -gt "$threshold" ]

then

/etc/init.d/service_name restart

     if [ "$usage" -gt "$threshold2" ]

     then

     echo "The memory usage has reached $usage% on $HOSTNAME." | mail -s "High Memory Usage Alert" admin@domain.com


     fi
fi

ตั้งชื่อนี้เป็น alert.sh และดำเนินการคำสั่ง: chmod +x alert.sh

กำหนดค่า cron เพื่อเรียกใช้สคริปต์นี้ทุก ๆ 10 นาที

ตรวจสอบให้แน่ใจว่าได้แทนที่ '512' ด้วยหน่วยความจำรวมของเซิร์ฟเวอร์เป็น MB และ 'admin@domain.com' ด้วยที่อยู่อีเมลจริง การดำเนินการนี้จะส่งการแจ้งเตือนทางอีเมลเมื่อใดก็ตามที่การใช้หน่วยความจำเกิน 95% และจะเริ่มบริการ "service_name" อีกครั้งหากถึง 90%


2

คุณสามารถใช้เชลล์สคริปต์ใน cron ด้วยคำสั่งฟรีเพื่อตรวจสอบหน่วยความจำและดำเนินการตามค่าของมัน ตัวอย่างเช่นในการตรวจสอบหน่วยความจำแรม:

#!/bin/bash

LOG_DIR=/var/log/memory_monitor.log

DATE=$(date +%d/%m/%Y)
TIME=$(date +%H:%M)
TIMESTAMP="$DATE $TIME"

MONITOR=$(free | grep Mem)
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')

echo "$TIMESTAMP $MEM_USED $MEM_FREE" >> $LOG_DIR

แทนที่จะสะท้อนเอาต์พุตคุณสามารถประเมินค่าตามขีด จำกัด ที่คุณต้องการและส่งเมลรีบูตหรือดำเนินการตามที่คุณต้องการ:

if [ eval_values > threshold ]
then
    # Do stuff (mail, reboot, etc)
fi

จากนั้นคุณเพิ่มลงใน crontab เพื่อให้ทำงานในช่วงเวลาที่คุณต้องการ


1

ยูทิลิตี้ที่มีประโยชน์อื่น ๆ จากแพ็คเกจ sysstat คือ sar

สำหรับข้อมูลหน่วยความจำให้ใช้:

$ sar -r 1
Linux 3.0.0-12-generic (HFC-2600)       05/03/2012      _i686_  (4 CPU)

01:35:45 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact
01:35:46 PM    118484    907364     88.45     59200    317368   2169716    104.75    412476    436140

ฉันสามารถใช้ RAM เพิ่มในกล่องนี้ได้อย่างแน่นอน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.