Load Average 정의


Load Average는 프로세스의 상태 중 R&D 상태에 있는 프로세스의 개수의 1, 5, 15분 마다의 평균 값입니다.

root@choi:/proc/1# uptime

00:22:03 up 38 days, 2:18, 2 users, load average: 0.00, 0.00, 0.00

, 얼마나 많은 프로세스가 실행 중 혹은 실행 대기 중이냐를 의미한다. Load Average가 높다면 프로세스가 실행 중이거나 I/O 등을 처리하기 위한 대기상태에 있다는 것이며, 낮다면 적은 수의 프로세스가 실행 중이거나 대기 중이라는 의미이다. 프로세스의 수를 세는 것이기 때문에 CPU Core 수에 따라 의미가 다소 상대적이다.

Load Average를 보다 자세히 분석하기 위해 strace를 이용해 보겠습니다.

root@choi:~# uptime

21:07:03 up 39 days, 23:03, 2 users, load average: 0.00, 0.00, 0.00

root@choi:~# strace -s 65535 -f -t -o uptime_dump uptime

21:07:28 up 39 days, 23:04, 2 users, load average: 0.00, 0.00, 0.00


uptime 명령은 /proc/loadavg 파일을 열어서 그 파일의 내용을 읽고 화면에 출력해주는 명령어이다. uptime이 계산하는 것이 아니고 커널이 미리 계산한 내용을 보여주게 된다. 커널은 Tick주기 마다 깨어나서 CPURun Queue에 있는 프로세스의 개수를 넣어서 계산한다. 과정은 복잡하게 보일 수 있지만, 결국에는 프로세스의 개수를 카운트 한다는 점이다.


9243  21:07:28 openat(AT_FDCWD, "/proc/loadavg", O_RDONLY) = 4

9243  21:07:28 lseek(4, 0, SEEK_SET)    = 0

9243  21:07:28 read(4, "0.00 0.00 0.00 1/384 9244\n", 8191) = 26

9243  21:07:28 fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 0

9243  21:07:28 write(1, " 21:07:28 up 39 days, 23:04,  2 users,  load average: 0.00, 0.00, 0.00\n", 71) = 71

9243  21:07:28 close(1)                 = 0

9243  21:07:28 close(2)                 = 0

9243  21:07:28 exit_group(0)            = ?

9243  21:07:28 +++ exited with 0 +++ 


 

Load Average가 높다는 것은 단순히 CPU를 사용하려는 프로세스가 많다는 의미도 포함해서 I/O에 병목이 생겨서 I/O 작업을 대기하는 프로세스가 많다는 의미도 있습니다. 아래의 코드를 바탕으로 CPU IO 리소스가 많이 사용해서 발생하는 부하에 대해 확인 할수 있다. 중요한 것은 Load Average가 높다고 무조건 CPU를 더 장착할 필요가 없다는 점이다.

#!/bin/bash

 

if [ $1 = "CPU" ]

then

while [ 1 ]

do

echo "1+1"|bc >& /dev/null

done

fi

 

if [ $1 = "IO" ]

then

while [ 1 ]

do

echo test > test.txt

done

fi


root@choi:/# ./test.sh CPU&

[1] 9448

root@choi:/# uptime

21:35:29 up 39 days, 23:32, 2 users, load average: 0.08, 0.02, 0.01

root@choi:/# uptime

21:35:38 up 39 days, 23:32, 2 users, load average: 0.23, 0.05, 0.02

root@choi:/# uptime

21:35:45 up 39 days, 23:32, 2 users, load average: 0.43, 0.10, 0.03

root@choi:/# ./test.sh IO&

[1] 28289

root@choi:/# uptime

21:36:45 up 39 days, 23:33, 2 users, load average: 0.75, 0.25, 0.09

root@choi:/# uptime

21:36:57 up 39 days, 23:33, 2 users, load average: 0.79, 0.27, 0.10

root@choi:/# uptime

21:37:01 up 39 days, 23:33, 2 users, load average: 0.81, 0.29, 0.11

 

 

 

root@choi:/# ./test.sh IO&

[1] 19321

root@choi:/# vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 1 9216 297768 7101296 8321568 0 0 0 62496 16165 47336 5 19 75 2 0

1 0 9216 297832 7101296 8321572 0 0 0 63252 16348 47953 7 17 76 1 0

0 1 9216 297856 7101296 8321572 0 0 0 63312 16339 47985 5 19 75 1 0

1 0 9216 297848 7101296 8321572 0 0 0 63264 16350 47992 5 19 75 1 0

1 0 9216 297840 7101296 8321568 0 0 0 63332 16352 47969 6 18 75 1 0

0 1 9216 297864 7101300 8321572 0 0 0 62528 16164 47326 5 18 74 2 0

1 0 9216 297864 7101300 8321572 0 0 0 63232 16332 47942 5 19 75 1 0

0 1 9216 297888 7101300 8321572 0 0 0 63288 16319 48000 5 20 74 1 0

1 0 9216 297888 7101300 8321572 0 0 0 63228 16336 47933 6 19 75 1 0

root@choi:/# ./test.sh CPU >/dev/null&

[1] 19328

root@choi:/# vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

1 0 9216 296692 7101384 8321572 0 0 2 4 2 1 0 0 100 0 0

3 0 9216 296652 7101384 8321572 0 0 0 0 1052 14372 11 23 67 0 0

1 0 9216 296504 7101384 8321572 0 0 0 0 1064 14440 10 23 67 0 0

1 0 9216 296192 7101384 8321572 0 0 0 0 1070 14447 8 25 67 0 0

2 0 9216 296444 7101384 8321572 0 0 0 0 1051 14459 9 24 67 0 0

2 0 9216 295960 7101384 8321572 0 0 0 0 1048 14365 10 23 67 0 0

1 0 9216 296440 7101384 8321572 0 0 0 0 1049 14413 10 23 67 0 0

2 0 9216 296588 7101384 8321572 0 0 0 0 1064 14424 9 24 67 0 0

1 0 9216 296768 7101384 8321572 0 0 0 68 1052 14454 10 23 67 0 0

다음은 vmstat를 이용해서 부하의 원인을 분석하는 방법을 알아보고자 한다. 첫 번째 , 두 번째 칼럼의 차이가 보인다.

r은 실행되기를 기다리거나 실행되고 있는 프로세스의 개수, bI/O를 위해 대기열에 있는 프로세스의 개수를 말한다.

 

ex) CPU기반의 부하를 일으키는 경우 : 응답속도가 느려진다. nginxjava같은 실제 서비스를 방해하는 프로세스로 인해 전체적인 응답속도가 느려지게 된다.

I/O기반의 부하를 일으키는 경우 : CPU 경합이 떨어지기 때문에 다소 응답속도가 느려지지 않지만, I/O가 들어가는 경우 I/O에 의한 병목현상이 발생할 수 있다.

 

 

 

 

 

Posted by 국화꽃내음

1)top - 23:34:08 up 38 days, 1:31, 2)2 users, load average: 0.02, 0.01, 0.00

3)Tasks: 226 total, 1 running, 225 sleeping, 0 stopped, 0 zombie

4)%Cpu(s): 1.6 us, 1.6 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

MiB Mem : 15923.4 total, 633.3 free, 578.7 used, 14711.5 buff/cache

MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 14918.0 avail Mem

 

PID USER 5)PR 6)NI 7)VIRT 8)RES 9)SHR 10)S %CPU %MEM TIME+ COMMAND

1 root 20 0 226244 9888 6856 S 0.0 0.1 0:53.39 systemd

2 root 20 0 0 0 0 S 0.0 0.0 0:00.41 kthreadd

4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H

6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq

7 root 20 0 0 0 0 S 0.0 0.0 0:04.42 ksoftirqd/0


1)top - 23:34:08 up 38 days

현재 시스템의 시간과 서버가 얼마나 구동되었는지 구동시간이 나와있다

 

2)2 users, load average: 0.02, 0.01, 0.00

몇 명의 사용자가 로그인해 있는지, 시스템의 Load Average는 어느 정도인지 보여준다. Load Average는 현재 시스템이 얼마나 많은 일을 하고 있는지를 보여주는 데이터이다.

 

3)Tasks: 226 total, 1 running, 225 sleeping, 0 stopped, 0 zombie

현재 시스템에 구동중인 프로세스의 개수를 나타낸다. 또한 프로세스 상태에 대한 통계 정보 제공

 

4)%Cpu(s): 1.6 us, 1.6 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

MiB Mem : 15923.4 total, 633.3 free, 578.7 used, 14711.5 buff/cache

MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 14918.0 avail Mem

CPU, MEM, SWAP 메모리의 사용량이다.


 

5)PR은 프로세스의 실행 우선순위이며 6)NIPR을 얼만큼 조절할건지를 의미한다. 기본적으로 5)PR6)NI를 더해서 실제 우선순위를 계산한다.

 

7)VIRTTASK(프로세스)가 사용하고 있는 Virtual Memory의 전체 용량

8)RES는 현재 TASK가 사용하고 있는 물리 메모리의 양

9)SHR는 다른 프로세스와 공유하고 있는 공유메모리의 양

, VIRT는 프로세스의 할당된 가상메모리 전체크기 이며 RES는 기중 실제로 메모리에 올려서 사용하고 있는 물리 메모리의 크기이고 SHR은 다른 프로세스와 공유하고 있는 메모리의 크기이다

 

10)S는 프로세스의 상태이다.

Posted by 국화꽃내음

네트워크 카드 정보 역시 하드웨어 적인 이슈를 확인 할 때 매우 유용하게 사용된다.

root@choi:/media# lspci |grep -i ether

00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (rev 04) 


위 시스템은 인텔에서 인보드 형태로 만든  82579M 모델이고 기가비트 네트워크 카드 입니다. 이 정보가 중요한 이유는 가혹 특정 모델에서 버그나 이슈가 보고 될때 자신의 시스템이 해당되는지 확인해야 되고 관련된 펌웨어를 찾기 위함입니다.


이번에는 ethtool을 이용해서 연결 상태를 확인해 보겠습니다.

root@choi:/media# ethtool eth0

Settings for eth0:

        Supported ports: [ TP ]

        Supported link modes:   10baseT/Half 10baseT/Full

                                100baseT/Half 100baseT/Full

                                1000baseT/Full

        Supported pause frame use: No

        Supports auto-negotiation: Yes

        Supported FEC modes: Not reported

        Advertised link modes:  10baseT/Half 10baseT/Full

                                100baseT/Half 100baseT/Full

                                1000baseT/Full

        Advertised pause frame use: No

        Advertised auto-negotiation: Yes

        Advertised FEC modes: Not reported

        Speed: 1000Mb/s

        Duplex: Full

        Port: Twisted Pair

        PHYAD: 1

        Transceiver: internal

        Auto-negotiation: on

        MDI-X: on (auto)

        Supports Wake-on: pumbg

        Wake-on: g

        Current message level: 0x00000007 (7)

                               drv probe link

        Link detected: yes 


ethtool을 통해서 확인할 수 있는 정보는 우선 해당 네트워크 카드가 어느정도 속도 까지 지원되는지 확인이 가능하고 현재 연결된 스피드, 네트워크 연결상태의 정상 유무를 확인 할수 잇습니다.


또한 ethtool을 이용해서 네트워크 카드의 여러가지 세팅 정보도 확인이 가능합니다.


-g 옵션을 이용해서 Ring Buffer의 크기를 확인 할 수 있고 -G 옵션을 이용해서 Ring buffer의 사이즈를 조절할 수 있습니다.

root@choi:/media# ethtool -g eth0

Ring parameters for eth0:

Pre-set maximums:

RX:             4096

RX Mini:        0

RX Jumbo:       0

TX:             4096

Current hardware settings:

RX:             256

RX Mini:        0

RX Jumbo:       0

TX:             256


root@choi:/media# ethtool -G eth0 rx 300

root@choi:/media# ethtool -g eth0

Ring parameters for eth0:

Pre-set maximums:

RX:             4096

RX Mini:        0

RX Jumbo:       0

TX:             4096

Current hardware settings:

RX:             304

RX Mini:        0

RX Jumbo:       0

TX:             256 



-k 옵션을 이용해서 현재 사용중인 옵션을 이용해서 네트워크 카드의 다양한 성능 최적화 옵션을 확인 할 수 있고 -K 옵션을 이용해서 성능 최적화를 설정할 수 있습니다.

root@choi:/media# ethtool -k eth0

Features for eth0:

rx-checksumming: on

tx-checksumming: on

        tx-checksum-ipv4: off [fixed]

        tx-checksum-ip-generic: on

        tx-checksum-ipv6: off [fixed]

        tx-checksum-fcoe-crc: off [fixed]

        tx-checksum-sctp: off [fixed]

scatter-gather: on

        tx-scatter-gather: on

        tx-scatter-gather-fraglist: off [fixed]

tcp-segmentation-offload: on

        tx-tcp-segmentation: on

        tx-tcp-ecn-segmentation: off [fixed]

        tx-tcp-mangleid-segmentation: off

        tx-tcp6-segmentation: on

udp-fragmentation-offload: off

generic-segmentation-offload: on

generic-receive-offload: on

...중략...


root@choi:/media# ethtool -K eth0  gro off

root@choi:/media# ethtool -k eth0

Features for eth0:

rx-checksumming: on

tx-checksumming: on

        tx-checksum-ipv4: off [fixed]

        tx-checksum-ip-generic: on

        tx-checksum-ipv6: off [fixed]

        tx-checksum-fcoe-crc: off [fixed]

        tx-checksum-sctp: off [fixed]

scatter-gather: on

        tx-scatter-gather: on

        tx-scatter-gather-fraglist: off [fixed]

tcp-segmentation-offload: on

        tx-tcp-segmentation: on

        tx-tcp-ecn-segmentation: off [fixed]

        tx-tcp-mangleid-segmentation: off

        tx-tcp6-segmentation: on

udp-fragmentation-offload: off

generic-segmentation-offload: on

generic-receive-offload: off

...중략...


여기서 제가 off한 기능은 tcp-offload 기능인데 이 기능은 MTU 이상의 크기를 가지는 패킷의 분할 작업을 CPU가 아닌 네트워크 카드가 직접 함으로서 CPU의 부담을 줄이고 패킷 처리 성능을 높이는 기능입니다. 하지만 이 기능은 네트워크 대역폭이 너무 높은 서버들에서 이슈를 일으킬 수 있기 때문에 불특정한 패킷 유실이 일어나는 것 같다면 기능을 off 하는것이 좋다. 

Posted by 국화꽃내음

블로그 이미지
국화꽃내음

공지사항

Yesterday28
Today71
Total28,766

달력

 « |  » 2019.5
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

최근에 달린 댓글

최근에 받은 트랙백

글 보관함