성능 도구를 설치할 수 없는 서버에서 네트워크와 디스크 사용량을 재야 한다. 모니터링 에이전트가 무엇을 근거로 수치를 내는지도 알아 둘 필요가 있다.
이 파일들의 값은 부팅 이후 누계다. 한 번 읽어서는 아무 의미가 없다. 두 시점에 읽어 차이를 시간으로 나눠야 초당 값이 된다. sar · iostat · node_exporter 가 하는 일이 정확히 이것이다.
카운터는 32비트나 64비트에서 넘칠 수 있다. 차이가 음수로 나오면 넘친 것으로 보고 건너뛴다.
cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
eth0: 98423112 128344 0 0 0 0 0 0 45123008 98221 0 0 0 0 0 0
읽어야 할 자리는 bytes 와 packets, 그리고 오류 계열인 errs · drop 이다. drop 이 꾸준히 늘면 버퍼가 모자라거나 커널이 처리 속도를 못 따라가는 것이고, errs 는 물리 계층 쪽을 의심한다.
초당 값으로 바꾸는 간단한 방법은 이렇다.
IF=eth0
r1=$(awk -v i="$IF:" '$1==i {print $2}' /proc/net/dev)
t1=$(awk -v i="$IF:" '$1==i {print $10}' /proc/net/dev)
sleep 5
r2=$(awk -v i="$IF:" '$1==i {print $2}' /proc/net/dev)
t2=$(awk -v i="$IF:" '$1==i {print $10}' /proc/net/dev)
echo "rx $(( (r2-r1)/5/1024 )) KiB/s tx $(( (t2-t1)/5/1024 )) KiB/s"
같은 값을 더 읽기 좋게 보여 주는 명령도 있다.
ip -s link show eth0
sar -n DEV 1 5
측정 자체의 부담은 사실상 없다. 파일 하나를 읽는 것이고 커널이 이미 들고 있는 값이다. 부담은 얼마나 자주 읽느냐에서 온다. 1초 간격으로 수백 개 인터페이스를 긁으면 그때는 무시할 수 없어진다.
cat /proc/partitions
major minor #blocks name
8 0 976762584 sda
8 1 524288 sda1
8 2 976237296 sda2
253 0 524288000 dm-0
#blocks 는 1KiB 블록 수다. 즉 값에 1024 를 곱하면 바이트가 된다. 여기에는 용량만 있고 사용량은 없다. 사용률은 마운트된 파일시스템 쪽이므로 df 를 본다.
디스크 장치를 목록으로 뽑을 때 쓴다. 파티션이 아닌 물리 장치만 보려면 이름이 숫자로 끝나지 않는 것을 고른다.
cat /proc/diskstats
주요 필드는 다음과 같다. 장치 이름 뒤로 이어진다.
| 위치 | 뜻 |
|---|---|
| 4 | 읽기 완료 횟수 |
| 6 | 읽은 섹터 수 |
| 7 | 읽기에 쓴 시간(ms) |
| 8 | 쓰기 완료 횟수 |
| 10 | 쓴 섹터 수 |
| 11 | 쓰기에 쓴 시간(ms) |
| 12 | 진행 중인 I/O 개수 |
| 13 | I/O 에 쓴 시간(ms) |
섹터는 512바이트로 계산한다. 즉 읽은 바이트는 읽은 섹터 수 × 512 다.
13번 필드가 핵심이다. 이 값의 증가분을 경과 시간으로 나눈 것이 장치 사용률이고, iostat 의 %util 이 바로 이 값이다. 100% 에 가까우면 그 장치가 쉬지 않고 일하고 있다는 뜻이다.
iostat -xz 1 5
iostat 이 없다면 위 파일을 두 번 읽어 직접 계산한다. 다만 SSD·NVMe 처럼 병렬 처리가 되는 장치에서는 %util 이 100% 여도 포화가 아닐 수 있다. 응답 시간(await)을 함께 본다.
| 경로 | 내용 |
|---|---|
/proc/loadavg |
1·5·15분 평균 실행 대기 |
/proc/meminfo |
메모리 상세 |
/proc/stat |
CPU 시간 누계, 컨텍스트 스위치 |
/proc/net/snmp |
TCP 재전송 등 프로토콜 통계 |
/proc/net/sockstat |
소켓 사용량 |
/proc/<pid>/io |
프로세스별 읽기·쓰기 바이트 |
프로세스 하나가 디스크를 쓰고 있는지 볼 때는 마지막 것이 유용하다.
cat /proc/$(pgrep -f java | head -1)/io
컨테이너 안에서 /proc 을 읽으면 호스트 전체 값이 보인다. 네임스페이스로 가려지지 않는 항목이 많다. 컨테이너 단위 값은 cgroup 쪽에서 읽어야 한다.
cat /sys/fs/cgroup/memory.current
cat /sys/fs/cgroup/io.stat
가상화 환경에서는 게스트가 보는 I/O 시간이 호스트 사정에 좌우된다. 게스트 안의 %util 만으로 판단하지 않는다.