Cara memantau penggunaan memori untuk tujuan yang mengkhawatirkan

9

Kami telah menanamkan sistem Linux tanpa swap.

Saat ini kita harus meningkatkan alarm ketika penggunaan memori% meningkat lebih dari tiga kali lipat. Dan reboot ketika penggunaan memori% meningkat lebih dari ambang (lebih tinggi).

Mengapa kami ingin melakukan itu: Jika beberapa program bocor, kami dapat melakukan reboot keamanan, sebelum kernel mulai mematikan proses kami (yang dapat menyebabkan korupsi data atau tidak tersedianya).

Tapi kami punya masalah:

Bagaimana cara menghitung penggunaan memori-% yang dapat digunakan untuk tujuan kita?

Kami mencoba menghitung penggunaan memori dengan menggunakan nilai / 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

Tanpa keberhasilan:

(MemTotal - MemFree) tidak dapat digunakan, karena mengandung misalnya cache.

(MemTotal - MemFree - Buffers - Cached)tidak mengabaikan efek Inactive. Jadi itu juga memberikan nilai penggunaan memori yang terlalu besar.

(MemTotal - MemFree - Buffers - Cached - Inactive) tidak dapat digunakan, karena hasilnya bisa negatif.

Main ski
sumber

Jawaban:

6

Sistem monitor via 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

Lihatlah -/+ buffers/cachegaris useddanfree

Pantau setiap proses melalui / proc

Saya menggunakan skrip python ini dan / proc / pid / stat untuk memonitor memori suatu proses:

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

Anda mungkin ingin menerjemahkan sesuatu seperti ini ke c.

Batasi sumber daya untuk setiap proses

atau gunakan ulimit/setrlimit

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

snies
sumber
Bisakah Anda menjelaskan metode yang digunakan skrip Python Anda untuk menghitung penggunaan memori? Itu akan membuat ini jawaban yang jauh lebih baik.
Flimzy
Yah, itu hanya mencatat penggunaan vm dalam langkah sedetik. Saya menggunakannya untuk membuat grafik konsumsi mem selama masa program. Ini berguna untuk men-debug kebocoran mem dalam program yang berjalan lama.
snies
Anda bisa menggunakan ini untuk memantau prog setelah beberapa waktu init. Dan waspadai beberapa "flag tersangka kebocoran" jika vmusage melintasi treshold tertentu.
snies
1
Tautan ke phacker.org tidak lebih
f01
... itulah sebabnya StarckExchange selalu meminta untuk memposting konten skrip, bukan hanya tautan
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" [email protected]


     fi
fi

Beri nama ini sebagai alert.sh dan jalankan perintah: chmod +x alert.sh

Konfigurasikan cron untuk menjalankan skrip ini setiap 10 menit

Pastikan untuk mengganti '512' dengan total memori server Anda dalam MB dan '[email protected]' dengan alamat email yang sebenarnya. Ini akan mengirimkan peringatan email setiap kali penggunaan memori melampaui 95% dan akan memulai kembali layanan "service_name" jika mencapai 90%

Saurabh Singla
sumber
2

Anda dapat menggunakan skrip shell di cron dengan perintah gratis untuk memantau memori dan bertindak sesuai nilainya. Misalnya, untuk memonitor memori RAM:

#!/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

Alih-alih menggemakan output, Anda bisa mengevaluasi nilai hingga batas yang Anda inginkan dan mengirimkan, me-reboot atau tindakan apa pun yang Anda inginkan:

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

Kemudian Anda menambahkannya ke crontab untuk dijalankan dalam interval yang Anda inginkan.

Peter
sumber
1

utilitas lain yang bermanfaat dari paket sysstat adalah sar.

Untuk informasi memori, gunakan:

$ 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

Saya pasti bisa menggunakan lebih banyak RAM di kotak ini.

Tao Joannes
sumber