
우리는 스왑 없이 임베디드 Linux 시스템을 가지고 있습니다.
현재 메모리 사용량 %가 임계값을 초과하면 경보를 발생시켜야 합니다. 메모리 사용량 %가 (더 높은) 임계값을 초과하면 재부팅됩니다.
원하는 이유: 일부 프로그램이 누출되면 커널이 프로세스를 종료하기 전에(데이터 손상 또는 사용 불가로 이어질 수 있음) 안전하게 재부팅할 수 있습니다.
하지만 문제가 있습니다.
우리의 목적에 사용될 수 있는 메모리 사용량-%를 계산하는 방법은 무엇입니까?
/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)
결과가 음수일 수 있으므로 사용할 수 없습니다.
답변1
시스템을 통해 모니터링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/
당신은 아마도 이와 같은 것을 c로 번역하고 싶을 것입니다.
각 프로세스에 대한 리소스 제한
또는 ulimit
/를 사용하세요setrlimit
https://stackoverflow.com/questions/4983120/limit-memory-usage-for-a-single-linux-process
답변2
#!/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
이름을 Alert.sh로 지정하고 다음 명령을 실행하십시오.chmod +x alert.sh
10분마다 이 스크립트를 실행하도록 cron을 구성하십시오.
'512'를 서버의 총 메모리(MB)로 바꾸고 '[이메일 보호됨]'를 실제 이메일 주소로 입력하세요. 메모리 사용량이 95%를 초과할 때마다 이메일 알림을 보내고 90%에 도달하면 "service_name" 서비스를 다시 시작합니다.
답변3
free 명령과 함께 cron의 쉘 스크립트를 사용하여 메모리를 모니터링하고 해당 값에 따라 작동할 수 있습니다. 예를 들어 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
출력을 에코하는 대신 원하는 제한 값을 평가하고 메일, 재부팅 또는 원하는 작업을 보낼 수 있습니다.
if [ eval_values > threshold ]
then
# Do stuff (mail, reboot, etc)
fi
그런 다음 원하는 간격으로 실행되도록 crontab에 추가합니다.
답변4
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을 사용할 수 있습니다.