Cách giám sát việc sử dụng bộ nhớ cho mục đích đáng báo động


9

Chúng tôi đã nhúng hệ thống Linux mà không cần trao đổi.

Cuối cùng, chúng ta phải tăng cảnh báo khi mức sử dụng bộ nhớ tăng lên so với mức tăng. Và khởi động lại khi mức sử dụng bộ nhớ% tăng trên ngưỡng (cao hơn).

Tại sao chúng tôi muốn làm điều đó: Nếu một số chương trình bị rò rỉ, chúng tôi có thể thực hiện khởi động lại an toàn, trước khi kernel bắt đầu giết chết các quy trình của chúng tôi (điều này có thể dẫn đến hỏng dữ liệu hoặc không có sẵn).

Nhưng chúng tôi có một vấn đề:

Làm thế nào để đếm mức sử dụng bộ nhớ-% có thể được sử dụng cho mục đích của chúng tôi?

Chúng tôi đã cố gắng đếm mức sử dụng bộ nhớ bằng cách sử dụng các giá trị của / 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

Không thành công:

(MemTotal - MemFree) không thể sử dụng được, vì nó chứa bộ đệm ví dụ.

(MemTotal - MemFree - Buffers - Cached)đã bỏ qua tác dụng của Inactive. Vì vậy, nó cũng cung cấp giá trị sử dụng bộ nhớ quá lớn.

(MemTotal - MemFree - Buffers - Cached - Inactive) là không thể sử dụng, bởi vì kết quả có thể là tiêu cực.

Câu trả lời:


6

Giám sát hệ thống qua 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

Nhìn vào -/+ buffers/cachedòng usedfree

Giám sát từng quá trình thông qua / Proc

Tôi đã sử dụng tập lệnh python này và / Proc / pid / stat để theo dõi bộ nhớ của một tiến trình:

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

bạn có thể muốn dịch một cái gì đó như thế này cho c.

Giới hạn tài nguyên cho mỗi quy trình

hoặc sử dụng ulimit/setrlimit

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


Bạn có thể giải thích phương thức mà tập lệnh Python của bạn sử dụng để tính toán mức sử dụng bộ nhớ không? Điều đó sẽ làm cho điều này một câu trả lời tốt hơn nhiều.
Flimzy

Vâng, nó chỉ ghi lại việc sử dụng vm trong các bước của một giây. Tôi đã sử dụng nó để vẽ đồ thị tiêu thụ mem trong suốt chương trình. Điều này rất hữu ích để gỡ lỗi các rò rỉ mem trong các chương trình chạy dài.
snies

Bạn chỉ có thể sử dụng điều này để theo dõi một prog sau một thời gian init. Và cảnh báo một số "cờ nghi ngờ rò rỉ" nếu vmusage vượt qua ngưỡng nhất định.
snies

1
Liên kết đến phacker.org không còn nữa
f01

... đó là lý do tại sao StarckExchange luôn yêu cầu đăng nội dung của các tập lệnh, không chỉ các liên kết
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

Đặt tên này là alert.sh và thực hiện lệnh: chmod +x alert.sh

Định cấu hình cron để chạy tập lệnh này cứ sau 10 phút

Đảm bảo thay thế '512' bằng tổng bộ nhớ máy chủ của bạn bằng MB và 'admin@domain.com' bằng địa chỉ email thực tế. Điều này sẽ gửi thông báo qua email bất cứ khi nào mức sử dụng bộ nhớ vượt quá 95% và sẽ khởi động lại dịch vụ "service_name" nếu nó đạt 90%


2

Bạn có thể sử dụng tập lệnh shell trong cron với lệnh miễn phí để theo dõi bộ nhớ và hành động theo các giá trị của nó. Ví dụ: để theo dõi bộ nhớ 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

Thay vì lặp lại đầu ra, bạn có thể đánh giá các giá trị đến giới hạn bạn muốn và gửi thư, khởi động lại hoặc bất kỳ hành động nào bạn muốn:

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

Sau đó, bạn thêm nó vào crontab để được chạy trong khoảng thời gian bạn muốn.


1

một tiện ích hữu ích khác từ gói sysstat là sar.

Để biết thông tin bộ nhớ, sử dụng:

$ 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

Tôi chắc chắn có thể sử dụng nhiều RAM hơn trên hộp này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.