[Linux] /proc/stat /proc/net/dev 파일로 시스템 상태 구하기 Computer Tip

CPU, NIC 등의 정보를 구하는 방법을 살펴본 적이 있습니다.

하지만 이번에는 일반 리눅스에서 약간 다른방법으로 (더 하위레벨에서) 시스템 정보를 구할 수 있는 
방법을 살펴보겠습니다.

리눅스 시스템은 커널의 각 모듈이 /proc에 device 파일을 만들어 결과를 출력하거나, 혹은
입력값을 얻을 수 있습니다.

여러 파일 중에서 /proc/stat 디바이스 파일을 읽어 현재의 CPU 상태나 부하율을 확인하거나
각 NIC 포트별 TX/RX PPS/BPS 정보를 구하는 방법을 간단히 살펴 보겠습니다.

1) CPU 부하율 구하기
$ cat /proc/stat
cpu  16442 0 5145 740228 310 0 116 0 0 0
cpu0 8472 0 2748 369656 103 0 25 0 0 0
cpu1 7970 0 2397 370571 207 0 90 0 0 0
intr 1417823 58 8096 0 0 0 0 3 0 1 0 0 0 34356 0 0 3852 0 17291 93 16587 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
btime 1355808692
processes 2676
procs_running 2
procs_blocked 0
softirq 421983 0 120513 775 16892 19757 0 5307 65475 810 192454

위와 같은 결과를 출력합니다.

cpu, cpu0,... 등과 같이 cpu로 시작하는 경우에는
cpu :user:system:nice:idle:wait:hi:si:zero
cpu0:8472:0:2748:369656:103:0:25:0:0:0

와 같은 형식으로 되어 있습니다.
각각은 time 리눅스 명령에서 출력하는 것과 같은 모든 프로세스가 사용한
사용자/시스템/NICE 시각의 누적치를 갖습니다.

이곳에서 1초마다 CPU 부하율을 구하는 방법은,

1.1) 우선 현재의 각 항목의 값을 1초 이전의 값에서 빼어 그 차이값을 구한다.
예) user_diff = user[t] - user[t-1]

1.2) 1.1에서 구한 차이값으로 다음과 같은 결과를 구한다.
User모드사용율(%)=(user_diff) / (user_diff + system_diff + nice_diff + idle_diff) * 100.0
System모드사용율(%)=(system_diff) / (user_diff + system_diff + nice_diff + idle_diff) * 100.0

2) Network TX/RX 정보 구하기
$ cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo: 14990624  123278    0    0    0     0          0         0 14990624  123278    0    0    0     0       0          0
  eth1:   74968     463    0    0    0     0          0         0     7704      42    0    0    0     0       0          0
  eth0: 10409357   10867    0    0    0     0          0         0   748831    7513    0    0    0     0       0          0


lo, eth1,.. 등과 같은 인터페이스에 대하여 RX/TX의 각 여덟가지의 서로다른 항목 카운트가 있습니다.
이 카운트 역시 NIC가 UP 되고 나서 부터의 누적치가 쌓이게 됩니다.

1초 마다의 PPS/BPS를 구하려고 한다면,

2.1) 모든 현재 항목값에서 1초전의 항목 값을 뺍니다.
예)
eth1_rx_packets_diff = eth1_rx_packets[t] - eth1_rx_packets[t-1]
...

2.2) PPS/BPS
eth1_rx_pps = eth1_rx_packets_diff
그런데 BPS는 약간의 계산을 더 합니다.
일단 최근 1초동안 왔다 갔다 했던 패킷의 평균 길이를 구한 뒤,
avg_packet_len = eth1_rx_bytes_diff / eth1_rx_packets_diff

eth1_rx_bps = (avg_packet_len + 12 + 8) * 8 * eth1_rx_packets_diff

위와 같이 구합니다.
평균 패킷 길이에 8바이트 [preamble] 및 12바이트[SFD] 는 다음 블로그 내용을 참조하시면 됩니다.


어느 분께는 도움이 되셨기를...


덧글

  • costzero 2012/12/21 00:18 # 답글

    대단합니다...책 내시면 알려주십시오.
  • 지훈현서아빠 2012/12/23 08:27 #

    살면서 기술에 지식이나 정보에 대한 것들이 마치, 조각 조각 모음 같다는 느낌이 들 때가 있습니다.
    그 만큼 개인으로 알고 있는 것들이 단편적인 것 때문이지요.
    제가 블로그로 정리하는 것들도 그런 단편적인 지식들이 최대한 넚어져서
    전체적인 지식이 되기를 바라는 것도 있습니다.
    감사합니다~
  • costzero 2012/12/23 10:10 #

    교보문고에서 개인출판용 e-BOOK 프로그램이 있습니다.
    아직 사용해 보지는 않았는데 간단하게 만드셔서 상용으로 교보문고 사이트에서 게시가 되는 듯 합니다.
    짧은 분량으로 핵심만 요약해서 판매하셔도 될 것 같습니다.
  • costzero 2012/12/23 10:11 # 답글

    1년 배너해서 배너니 차라리 그게 나을 것 같습니다.블로그를 모아서 출판.
  • 오곡 2014/02/23 22:24 # 삭제 답글

    잘배우고 갑니다~
  • 지훈현서아빠 2014/02/24 08:54 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트