Develop

Ubuntu - 사용량체크

기린정 2022. 11. 21. 11:44

■ 개 요 : 리눅스 서버의 자원사용량을 일정 시간 간격으로 로그로 남겨서 모니터링 + 이상감지 하려고 함.
■ 대 상 : CPU/Memory/Disk
■ 스 펙 : 80~90% 알람 수준
■ 내 용 : top의 결과를 Log File로 남겨서 Spec이상 여부를 감지
■ 방 법 :
** Linux이외 별도의 Util은 사용하지 않음.
(1) 일단 df/free/top등 명령어의 결과를 일정 시간 간격으로 Log File로 남길 수 있는지 확인 필요. 
- 이건 해봐서 된다는걸 알고있긴 해
 
(2) 내가 필요한 정보가 무엇인지 확인해야 함
- 자원사용량(CPU/Memory/Disk)
- 나는 프로세스별 자원사용량이 필요한가? 전체의 자원사용량이 필요한가?
- 시스템은 프로세스별 자원사용량이 높아도, 전체의 자원사용량이 높아도 죽음
- 전체는 프로세스별 자원사용량을 포함함, 따라서 CPU/Memory는 Whole로, Disk를 Usage별로 구분.
- 이번 Monitoring에서 Network는 제외, 추후 RV Message 관련 Monitoring은 추가 용의 있음.
 
3) 모니터링 명령어 중 필요한 것을 선택해야 함
0. CPU : top, pstree, ps, vmstat, uptime,/proc/cpuinfo
1. Memory : top, vmstat, free, more /proc/meminfo
2. Process : top, pstree, ps
3. Disk : df, du, quota
- #df -m : MB 단위의 파일시스템 파티션 별 사용량
- #du -m : MB 단위의 디렉토리의 사용량
- #df - h : Disk 용량 파악
- #du -skh * : 서브 디렉토리 용량 파악
4. Network : ping, netstat, traceroute, tcpdump
5. User : who, w, last
 
(4) top명령어는 실행시켜두면 5초? 단위로 refresh하는 것으로 보임. 리소스도 먹는애임.
- 내가필요한전 전체 CPU/Memory사용량 및 특정 Disk 몇 개의 사용량에 대한 사용률임.   
- 이걸 초단위 까지는 아니더라도 5분단위 정도로만 남기면 될거같음.
 
ps -e -p "user,pcpu,vsz,comm" | grep -v "<" | grep -v "ps" | grep -v "기준" | grep -v "grep" > "$logdir/resourceMonitoring.list"

free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }'
9.24%

1
2
3
4
5
[root@localhost tmp]# free -m
             total       used       free     shared    buffers     cached
Mem:           996         92        904          0         11         31
-/+ buffers/cache:         49        947
Swap:         1583          0       1583



df -h | awk '$NF=="/"{printf "%s\t\t", $5}'
7%

1
2
3
4
5
[root@localhost tmp]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   14G  814M   12G   7% /
tmpfs                         499M     0  499M   0% /dev/shm
/dev/sda1                     485M   32M  428M   7% /boot

cd /tmp
vi stats.sh
#! /bin/bash
printf "Memory\t\tDisk\t\tCPU\n"
end=$((SECONDS+3600))
while [ $SECONDS -lt $end ]; do
MEMORY=$(free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }')
DISK=$(df -h | awk '$NF=="/"{printf "%s\t\t", $5}')
CPU=$(top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}')
echo "$MEMORY$DISK$CPU"
sleep 5
done

./stats.sh >> log.txt

728x90