리눅스
CPU 사용률
/proc/stat 파일에서 정보를 추출합니다. stat 파일의 예시는 아래와 같습니다:
$ cat /proc/stat
cpu 89829366 549 50831441 4904327651 1579033 0 360452 19132 0 0
cpu0 11468696 132 6445607 612491902 397397 0 42290 3187 0 0
cpu1 11211108 56 6256999 613178522 171835 0 45106 2422 0 0
cpu2 11302766 62 6419860 612619662 421274 0 41138 1795 0 0
cpu3 11318214 81 6377767 612920048 206548 0 48273 1660 0 0
cpu4 11337602 60 6366563 613024240 118444 0 43619 5503 0 0
cpu5 11115620 64 6306834 613314450 94990 0 47299 1542 0 0
cpu6 11087838 48 6397700 613274563 85902 0 45369 1515 0 0
cpu7 10987518 44 6260107 613504262 82640 0 47354 1505 0 0
intr 8326656785 27 11 0 0 231 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2206280 8914 945 9025630 2651086 6313690 48821344 49242419 64624757 58591414 41058485 4797378 4 92035710 46633274 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 15158569751
btime 1560054009
processes 6729554
procs_running 1
procs_blocked 0
softirq 5676777856 0 1637234788 1185996 1196182601 0 0 12865662 1571479502 0 125 7829307
stat 파일에서 cpu 전체 및 cpu 코어별 수치가 표시됩니다. 최상단의 cpu 값은 순서대로 각각 아래의 의미를 가집니다:
-
user: 89829366
-
nice: 549
-
system: 50831441
-
idle: 4904327651
-
iowait: 1579033
-
irq: 0
-
softirq: 360452
-
steal: 19132
-
guest: 0
위의 값은 CPU 틱에 해당하기 때문에, 200 밀리초 간격으로 stat 파일을 2번 읽어서 user, nice, system, idle 의 차이를 측정합니다. 차이 값을 이용하여 아래와 같이 계산합니다.
-
idle (%) = 100 x idle 변화량 / (user 변화량 + nice 변화량 + system 변화량 + idle 변화량)
-
user (%) = 100 x (idle 변화량 + nice 변화량) / (user 변화량 + nice 변화량 + system 변화량 + idle 변화량)
-
system (%) = 100 - (idle (%) + user (%))
메모리 사용량
참고: 리눅스 센트리 2017-10-31_16-03 (#58) 이전의 배포 버전에서는 메모리 가용량에 파일시스템 캐시를 반영하지 않으므로, 메모리를 99% 사용하는 것처럼 표시될 수 있습니다.
/proc/meminfo 파일에서 정보를 추출합니다. meminfo 파일의 예시는 아래와 같습니다:
MemTotal: 32122900 kB
MemFree: 444656 kB
MemAvailable: 7296636 kB
Buffers: 0 kB
Cached: 7101292 kB
SwapCached: 0 kB
Active: 27750516 kB
Inactive: 3489308 kB
Active(anon): 24138852 kB
Inactive(anon): 376 kB
Active(file): 3611664 kB
Inactive(file): 3488932 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 1104 kB
Writeback: 0 kB
AnonPages: 24138584 kB
Mapped: 83588 kB
Shmem: 660 kB
Slab: 251800 kB
SReclaimable: 209856 kB
SUnreclaim: 41944 kB
KernelStack: 8064 kB
PageTables: 57204 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 16061448 kB
Committed_AS: 25763104 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 272356 kB
DirectMap2M: 24061952 kB
DirectMap1G: 9437184 kB
이 파일에서 물리 메모리의 총량, 물리 메모리의 가용량, 스왑 메모리의 총량, 스왑 메모리의 가용량을 측정합니다. 원본의 단위는 kB로 기입되어 있으므로 실제 수집 시에는 1024를 곱한 값을 사용합니다.
-
물리 메모리 총량: MemTotal 항목
-
물리 메모리 가용량: MemAvailable 항목I/O 캐시 사용량 등을 포함한 사용 가능한 메모리 양을 의미합니다.커널 주석 참조: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
-
스왑 메모리 총량: SwapTotal 항목
-
스왑 메모리 가용량: SwapFree 항목
네트워크 대역폭 사용량
ifconfig -a 명령을 실행한 결과를 사용합니다:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 172.31.13.212 netmask 255.255.240.0 broadcast 172.31.15.255
inet6 fe80::d1:78ff:fef9:99a6 prefixlen 64 scopeid 0x20<link>
ether 02:d1:78:f9:99:a6 txqueuelen 1000 (Ethernet)
RX packets 299442066 bytes 207243561255 (193.0 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 225721863 bytes 85013373457 (79.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
명령을 1초 간격으로 2회 실행한 후, 수신 (RX)과 송신 (TX) 항목 각각에 대하여 변화량을 계산합니다. 데이터는 바이트 단위로 측정되고 대역폭은 비트 단위이므로, 바이트 단위의 변화량에 8을 곱하여 대역폭으로 나눈 값을 대역폭 사용률로 계산합니다.
NIC의 링크된 네트워크 대역폭은 아래와 같이 추출합니다.
-
시도 1: cat /sys/class/net/eth0/speed
-
시도 2: ethtool eth0
설치 환경에 따라 두 가지 명령 모두 실패할 수 있는데, 이 경우에는 부팅 시 지정한 아래 시스템 스위치의 값을 NIC 대역폭으로 가정합니다 (1Gbps 예시):
-Dlogpresso.sentry.default_link_speed=1g
윈도우
CPU 사용률
GetSystemTimes WIN32 API를 사용하여 정보를 수집합니다.
100 밀리초 간격으로 GetSystem32를 2회 호출하여 변화량을 계산합니다. API 반환값은 커널 시간이 유휴 시간을 포함하므로 커널 시간에서 유휴 시간을 제외합니다.
-
kernel (%) = (커널 시간 변화량 / 시스템 시간 변화량) x 100
-
user (%) = (유저 시간 변화량 / 시스템 시간 변화량) x 100
-
idle (%) = 100 - kernel (%) - user (%)
계측 시간 간격이 100 밀리초이기 때문에 부하가 걸리는 순간에 계측되면 차이가 발생할 수 있습니다. (1초 간격의 평균에 비해 100 밀리초 간격의 평균이 변동성이 강함)
메모리 사용량
GlobalMemoryStatusEx WIN32 API를 사용하여 정보를 수집합니다.
https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-globalmemorystatusex
MEMORYSTATUSEX 구조체의 값을 아래와 같이 사용합니다:
-
물리 메모리 총량: ullTotalPhys
-
물리 메모리 가용량: ullAvailPhys
-
스왑 메모리 총량: 0 (지원하지 않음)
-
스왑 메모리 가용량: 0 (지원하지 않음)
네트워크 대역폭 사용량
윈도우즈 성능 카운터 목록에서 Network Interface 이나 Network Adapter 인스턴스를 대상으로 아래 값을 수집합니다:
-
Current Bandwidth - NIC 대역폭
-
Bytes Received/sec - 수신 바이트/초
-
Bytes Sent/sec - 송신 바이트/초
-
Packets Received Unicast/sec - 수신 유니캐스트 패킷/초
-
Packets Sent Unicast/sec - 송신 유니캐스트 패킷/초
-
Packets Received Non-Unicast/sec - 수신 비-유니캐스트 패킷/초
-
Packets Sent Non-Unicast/sec - 송신 비-유니캐스트 패킷/초
윈도우용 자바 런타임에서 NetworkInterface.getNetworkInterfaces() 호출이 반환하는 NIC 이름이 성능 카운터 인스턴스의 이름과 완전히 동일하지 않은 경우가 있습니다. 가능한 특수문자를 배제하고 비슷한 이름의 성능 카운터 인스턴스를 검색하지만, 특이한 이름은 매핑을 찾지 못할 수 있습니다.
1초 단위로 성능 카운터 값을 측정하여 바이트 및 패킷의 변화량을 측정합니다.
-
수신 바이트 변화량 = Bytes Received/sec
-
송신 바이트 변화량 = Bytes Sent/sec
-
수신 패킷 변화량 = Packets Received Unicast/sec + Packets Received Non-Unicast/sec
-
송신 패킷 변화량 = Packets Sent Unicast/sec + Packets Sent Non-Unicast/sec
AIX
CPU 사용률
sar -u 1 명령으로 추출합니다. 실행 결과 예시는 아래와 같습니다:
AIX 121div 1 7 00FBAEB24C00 05/09/19
System configuration: 1cpu=8 ent=0.50 mode=Uncapped
11:58:31 %usr %sys %wio %idle physc %entc
11:58:32 3 2 0 95 0.15 29.4
각각 아래와 같이 추출됩니다:
-
usr: 유저모드 사용률 (%)
-
sys: 커널모드 사용률 (%)
-
idle: 유휴률 (%)
메모리 사용량
물리 메모리 정보 수집은 svmon -G 명령어를 사용합니다. 실행 예시는 아래와 같습니다:
size inuse free pin virtual mmode
MEMORY 5242880 5226843 16037 1039413 3474101 Ded
pg space 2621440 24432
work pers clnt other
pin 809806 0 3655 225952
in use 3464517 0 1762326
PageSize PoolSize inuse pgsp pin virtual
s 4 KB - 2328779 16432 342613 566453
m 64 KB - 181129 500 342613 566453
L 16 MB - 0 0 0 0
S 16 GB - 0 0 0 0
위 데이터에서 수집되는 값은 아래와 같습니다:
-
물리 메모리 총량: 5242880 x 4096 바이트
-
물리 메모리 가용량: (16037 + 1762326) x 4096 바이트
스왑 메모리 정보 수집은 swap -s 명령을 사용합니다. 실행 예시는 아래와 같습니다:
allocated = 2621440 blocks used = 24433 blocks free = 2597007 blocks
위 데이터에서 수집되는 값은 아래와 같습니다:
-
스왑 메모리 총량: 2621440 x 4096 바이트
-
스왑 메모리 가용량: 2597007 x 4096 바이트
HP-UX
CPU 사용률
sar -u 1 명령으로 추출합니다. 실행 결과 예시는 아래와 같습니다:
HP-UX test B.11.31 U ia64 08/05/16
14:08:14 %usr %sys %wio %idle
14:11:20 1 0 1 98
마지막 줄을 읽어서 아래와 같이 수집합니다:
-
usr: 유저모드 사용률 (%)
-
sys: 커널모드 사용률 (%)
-
idle: 유휴률 (%)
메모리 사용량
물리 메모리 정보 수집은 dmesg 명령어를 사용합니다. 실행 예시는 아래와 같습니다:
Aug 5 16:53
Loaded ACPI revision 2.0 tables.
...중략...
Memory Information:
physical page size = 4096 bytes, logical page size = 4096 bytes
Physical: 8367268 Kbytes, lockable: 6033460 Kbytes, available: 6854788 Kbytes
Physical: 문자열로 시작하는 줄을 선택하여 쉼표로 구분하면 3개의 항목이 추출됩니다. 각 항목을 공백 문자 기준으로 다시 절단하여 두번째 위치의 숫자를 추출합니다. 이 데이터에서 수집되는 값은 아래와 같습니다:
-
물리 메모리 총량: 8367268 x 1024 바이트
-
물리 메모리 가용량: 6854788 x 1024 바이트
스왑 메모리 정보 수집은 swapinfo -t 명령을 사용합니다. 실행 결과 예시는 아래와 같습니다:
Kb Kb Kb PCT START/ Kb
TYPE AVAIL USED FREE USED LIMIT RESERVE PRI NAME
dev 8388608 0 8388608 0% 0 - 1 /dev/vg00/lvol2
reserve - 502460 -502460
memory 7957668 1452396 6505272 18%
total 16346276 1954856 14391420 12% - 0 -
total 문자열로 시작하는 줄을 선택하여 공백 문자 기준으로 절단하고, 두번째 항목 (AVAIL)과 세번째 항목 (USED) 수치를 추출합니다. 이 데이터에서 수집되는 값은 아래와 같습니다:
-
스왑 메모리 총량: 16346276 x 1024 + 1954856 x 1024 바이트
-
스왑 메모리 가용량: 16346276 x 1024 바이트
솔라리스
CPU 사용률
sar -u 1 명령으로 추출합니다. 실행 결과 예시는 아래와 같습니다:
SunOS solaris10 5.10 Generic_147148-26 i86pc 06/16/2016
14:14:46 %usr %sys %wio %idle
14:14:47 1 3 0 96
마지막 줄을 읽어서 아래와 같이 수집합니다:
-
usr: 유저모드 사용률 (%)
-
sys: 커널모드 사용률 (%)
-
idle: 유휴률 (%)
메모리 사용량
물리 메모리 정보 수집은 메모리 페이지 크기를 구하기 위하여 pagesize 명령을 먼저 실행하고, 그 이후 kstat -n system_pages 명령어를 사용합니다. 실행 예시는 아래와 같습니다:
module: unix instance: 0
name: system_pages class: pages
availrmem 1093070
crtime 0
desfree 9170
desscan 25
econtig 4225028096
fastscan 586889
freemem 985843
kernelbase 0
lotsfree 18340
minfree 4585
nalloc 35977634
nalloc_calls 15658
nfree 35741070
nfree_calls 10333
nscan 0
pagesfree 985843
pageslocked 80708
pagestotal 1173778
physmem 1177486
pp_kernel 84823
slowscan 100
snaptime 2763938.12480908
줄마다 공백 문자로 구분하여 키와 값을 먼저 파싱합니다. 그 중에서 physmem과 freemem 항목의 값을 추출합니다. 이 데이터에서 수집되는 값은 아래와 같습니다:
-
물리 메모리 총량: 1177486 x 4096 (페이지 크기) 바이트
-
물리 메모리 가용량: 985843 x 4096 (페이지 크기) 바이트
스왑 메모리 정보 수집은 swap -s 명령을 사용합니다. 실행 결과 예시는 아래와 같습니다:
total: 157328k bytes allocated + 67180k reserved = 224508k used, 4089160k available
정규표현식으로 연속된 숫자 부분(\d+)만 검색하여 세 번째, 네 번째 값을 추출합니다. 이 데이터에서 수집되는 값은 아래와 같습니다:
-
스왑 메모리 총량: 4089160 x 1024 + 224508 x 1024 바이트
-
스왑 메모리 가용량: 4089160 x 1024 바이트