센트리 OS별 성능 측정 가이드

리눅스

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를 곱한 값을 사용합니다.

네트워크 대역폭 사용량

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를 사용하여 정보를 수집합니다.

https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getsystemtimes

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 바이트