리눅스 서버 부하 및 행 문제 해결방법 8가지

리눅스 서버에 성능 이슈로 인해서 가장 먼저 체크 해봐야 할 사항은 어떤 것들이 있을까요?

오늘은 리눅스의 대표적인 성능 체크 툴을 사용하여 리눅스 문제 점을 빠르게 알아보도록 하겠습니다.

 

리눅스 성능 문제 / 서버 부하 확인 방법

체크 순서

$ uptime; dmesg | tail; vmstat 1
$ mpstat -P ALL 1
$ pidstat 1
$ iostat -xz1
$ free -m

$ sar -nDEV 1
$ sar -nTCP,ETCP 1
$ top

 

일부 Command는 sysstat package를 설치해야만합니다.

각 커맨드에 대한 더 많은 설명은 리눅스 카테고리 또는 manual 페이지를 이용해서 찾아 보시길 바랍니다.

 

1. $ uptime; dmesg | tail; vmstat 1

uptime

uptime

uptime
16:52:59 up 6 days, 7:42, 1 user, load average: 3.41, 3.70, 3.81

uptime은 장비 on 시간 뿐만 아니라 현재 대기중인 프로세스가 얼마나 있는지를 나타내는 load average값을 확인하는 가장 쉬운 방법입니다.

리눅스 시스템에서 이 값은 대기 중인 프로세스뿐만 아니라 disk I/O와 같은 I/O작업으로 block된 프로세스까지 포함되어 있습니다.

위에 있는 3개의 숫자는 각각 1분, 5분, 15분에 load average 값입니다.

이를 통해서 시간의 변화를 알 수 있는데, 예를들어서 장애가 발생했다는 소식을 듣고 해당 instance에 로그인 했을때 1분 동안의 값이 15분 값에 비해서 작다면 이는 장애가 발생하고선 내가 너무 뒤늦게 로그인했음을 알 수 있습니다.

 

 

dmesg | tail

$ dmesg | tail[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]

[129939.144021] vboxnetflt: 0 out of 1114137 packets were not sent (directed to host)

[448449.736478] vboxdrv: 0000000000000000 VMMR0.r0

[448450.101917] vboxdrv: 0000000000000000 VBoxDDR0.r0

dmesg는 시스템 메세지를 확인할 수 있는 커맨드입니다.

부팅시부터 시작해서 모든 커널 메세지가 출력되기 때문에 tail을 이용해서 마지막 10줄만 출력해서 확인하는 것이 빠릅니다.

이 메세지를 통해서 성능에 문제를 줄 수 있는 에러를 찾을 수도 있습니다.

 

vmstat 1

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

3 0 1180936 4447024 1428 8460640 2 1 14 127 6 5 20 24 56 0 0

 

vmstat는 virtual memory stat의 약자입니다.

첫번째 라인은 부팅된 뒤에 평균적인 값을 나타냅니다.

 

확인해봐야할 항목

r: CPU에서 동작중인 프로세스의 숫자

CPU 자원이 포화(saturation)가 발생하는지 확인할 때에 좋은 값입니다 . r 값이 CPU의 값보다 큰 경우에 포화되어 있다고 해석됩니다.

free: free memory를 kb단위로 나타냄. free memory가 너무 자리수가 많은 경우 free -m를 이용하면 조금 더 상세한 값으로 확인할 수 있다.

si, so: swap-in과 swap-out에 대한 값. 0이 아니라면 현재 시스템에 메모리가 부족한 것입니다.

us, sy, id, wa, st: 모든 CPU의 평균적인 CPU time을 측정. 각각 user time, 커널에서 사용되는 system time, idle, wait I/O 그리고 stolen time순이다(stolen time은 hypervisor가 가상 CPU를 서비스 하는 동안 실제 CPU를 차지한 시간을 이야기합니다.

 

2 . mpstat -p ALL 1

mpstat

$ mpstat -PALL 1

Linux 3.10.0-1160.6.1.el7.x86_64 (localhost.localdomain) 2023년 01월 31일 _x86_64_ (8 CPU)

CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78
07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99
07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00
07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03
[...]

이 커멘드는 CPU time을 CPU 별로 측정할 수 있습니다.

각 CPU별로 불균형한 상태를 확인할 수 있는데, 한 CPU만 일하고 있는 것은 application이 single thread로 동작한다는 이야기입니다.

 

3. pidstat 1

pidstat

$ pidstat 1

Linux 3.10.0-1160.6.1.el7.x86_64 (localhost.localdomain) 2023년 01월 31일 _x86_64_ (8 CPU) UID PID %usr %system %guest %CPU CPU Command
07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/0
07:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave
07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java
07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java
07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java
07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat

07:41:03 PM UID PID %usr %system %guest %CPU CPU Command
07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave
07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java
07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java
07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass
07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat

 

pidstat은 process당 top 명령을 수행 하는 것과 비슷합니다.

차이점은 스크린 전체에 표시 하는 것이 아니라 지속적으로 변화하는 상황을 띄워주기 떄문에 변화를 기록하기 좋습니다.

%CPU 항목은 모든 CPU의 전체 사용량을 이야기합니다.

 

4. iostat -xz 1

iostat

$ iostat -xz 1

Linux 3.10.0-1160.6.1.el7.x86_64 (localhost.localdomain) 2023년 02월 02일 _x86_64_ (8 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
73.96 0.00 3.73 0.03 0.06 22.21

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09
xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25
xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26
dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04
dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00
dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03

 

%user - CPU가 사용자 모드에서 사용된 시간의 비율의 출력값 입니다.

%nice : 작업 우선순위 정책에 의하여 우선순위가 바뀐 프로세서가 사용한 시간의 비율을 출력하값 입니다.

%system : CPU가 시스템 모드에서 사용된 시간의 비율을 출력한 값 입니다.

%iowait - 디스크의 입출력을 대기하는데 사용된 시간의 비율을 출력한 값 입니다.

%steal - Steal CPU의 사용시간을 비율로 출력한 값 입니다.

%idle - 디스크의 입출력을 대기하지 않은 유휴상태의 시간을 출력한 값 입니다.

 

 

block device(HDD, SSD 등)가 어떻게 동작하는지 이해하기 좋은 명령어입니다.

확인해 봐야 할 항목

r/s, w/s rkB/s, wkB/s: read 요청과 write 요청, read kB/s, write kB/s를 나타냄.

어떤 요청이 가장 많이 들어오는지 확인해볼 수 있는 중요한 지표입니다. 성능 문제는 생각보다 과도한 요청때문에 발생하는 경우도 있기 때문입니다.

await: I/O처리 평균 시간을 밀리초로 표현한 값. application한테는 I/O요청을 queue하고 서비스를 받는데 걸리는 시간이기 때문에 application이 이 시간동안 대기하게 된다. 일반적인 장치의 요청 처리 시간보다 긴 경우에는 블록 장치 자체의 문제가 있거나 장치가 포화된 상태임을 알 수 있습니다.

 

5. free -m

free

$ free -m

total used free shared buff/cache available

Mem: 31965 19393 4296 266 8275 11909

Swap: 16063 1153 14910

 

확인해봐야할 항목

buffers: Block 장치 I/O의 buffer 캐시, 사용량

cached: 파일 시스템에서 사용되는 page cache의 양

위 값들이 0에 가까워 지면 안됩니다. 이는 곧 높은 Disk I/O가 발생하고 있음을 의미합니다. (iostat으로 확인 가능).

“-/+ buffers/cache”는 사용중인 메모리와 여유 메모리의 양을 나타냅니다.

리눅스는 자주 사용하는 데이터에 대해서, 빠르게 다시 애플리케이션에 메모리가 할당될 수 있도록 캐시메모리를 사용합니다. 따라서 캐시 메모리도 여유 메모리에 포함되어 보여야 합니다.

 

6. sar -n DEV 1

sar

$ sar -n DEV 1

Linux 3.10.0-1160.6.1.el7.x86_64 (localhost.localdomain) 2023년 02월 02일 _x86_64_ (8 CPU)

12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00
12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00
12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00
12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00
12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

 

이 툴을 사용하면 network throughput(Rx, Tx KB/s)을 측정할수 있습니다.

위 값중 %ifutil은 nicstat로도 측정 가능한 네트워크 장치 사용률입니다. 하지만 nicstat에서도 그렇듯 정확한 값을 가져오는게 어려워서 잘 작동하지 않습니다.

 

7. sar -n TCP,ETCP 1

sar tcp

[root@localhost ~]# sar -n TCP,ETCP 1

Linux 3.10.0-1160.6.1.el7.x86_64 (localhost.localdomain) 2023년 03월 06일 _x86_64_ (8 CPU)

16시 12분 49초 active/s passive/s iseg/s oseg/s

16시 12분 50초 0.00 0.00 2.00 1.00

 

16시 12분 49초 atmptf/s estres/s retrans/s isegerr/s orsts/s

16시 12분 50초 0.00 0.00 0.00 0.00 0.00

 

16시 12분 50초 active/s passive/s iseg/s oseg/s

16시 12분 51초 0.00 0.00 1.00 2.00

 

16시 12분 50초 atmptf/s estres/s retrans/s isegerr/s orsts/s

16시 12분 51초 0.00 0.00 0.00 0.00 0.00

 

 

TCP 성능을 측정하기 위한 명령어입니다.

이 값은 TCP 통신량을 요약해서 보여줍니다.

active/s: 로컬에서부터 요청한 초당 TCP 커넥션 수를 보여줌 (예를들어, connect()를 통한 연결).

passive/s: 원격으로부터 요청된 초당 TCP 커넥션 수를 보여줌 (예를들어, accept()를 통한 연결).

retrans/s: 초당 TCP 재연결 수를 보여줌.

active와 passive 수를 보는것은 서버의 부하를 대략적으로 측정 하는데에 편리함.

위 설명을 보면 active를 outbound passive를 inbound 연결로 판단할 수 있는데, 꼭 그렇지만은 않습니다. (예를들면 localhost에서 localhost로 연결같은 connection)

retransmits은 네트워크나 서버의 이슈가 있음을 이야기한다. 신뢰성이 떨어지는 네트워크 환경이나(공용인터넷), 서버가 처리할 수 있는 용량 이상의 커넥션이 붙어서 패킷이 드랍 되는 것을 이야기한다. 위 예제에서는 초당 하나의 TCP 서버가 들어오는 것을 알 수 있습니다.

 

8. top

top

 

$ top

top - 16:13:52 up 8 days, 7:03, 1 user, load average: 3.68, 3.64, 3.57

Tasks: 391 total, 1 running, 389 sleeping, 0 stopped, 1 zombie

%Cpu(s): 20.1 us, 22.9 sy, 0.3 ni, 56.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 32733140 total, 9007264 free, 11598868 used, 12127008 buff/cache

KiB Swap: 16449532 total, 15293940 free, 1155592 used. 20454360 avail Mem

 

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

3758 sysadmin 20 0 2289192 33648 4692 S 123.0 0.1 14099:32 VBoxSVC

3696 sysadmin 20 0 1596892 36576 13984 S 86.0 0.1 9534:46 VirtualBox

2966 sysadmin 20 0 1730680 136412 41876 S 84.7 0.4 9306:47 VirtualBox

3752 sysadmin 20 0 213012 648 348 S 50.3 0.0 5653:56 VBoxXPCOMIPCD

14895 sysadmin 20 0 11.0g 5.9g 5.8g S 18.7 18.8 89:33.00 VirtualBoxVM

2174 sysadmin 20 0 4070244 312944 70508 S 1.7 1.0 309:29.06 gnome-shell

1895 sysadmin 20 0 565332 315332 65984 S 0.7 1.0 34:04.31 Xvnc

2411 gdm 20 0 707812 3884 440 S 0.3 0.0 3:12.59 gsd-color

5657 root 20 0 162376 2596 1576 R 0.3 0.0 0:00.09 top

1 root 20 0 194372 5480 2936 S 0.0 0.0 3:06.25 systemd

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

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

6 root 20 0 0 0 0 S 0.0 0.0 0:06.22 ksoftirqd/0

 

top 명령어는 위에서 체크해본 다양한 측정치를 쉽게 체크할 수 있습니다.

시스템 전반적으로 값을 확인하기 쉽다는 장점이 있습니다.

일시적으로 멈추는 현상을 잡기 위해서도 화면을 주기적으로 빠르게 멈춰주지 않으면 찾기 힘들기 때문에 멈추고 확인하시는 것을 추천드립니다. (Ctrl+S는 업데이트를 중지시키고, Ctrl+Q는 다시 시작시킨다)

Enter 또는 Space Bar 키를 이용해서 top 결과를 최신화 할 수 있습니다.

 

[IT/리눅스(Linux)] - [Linux] iowait를 sar 명령어로 확인하기

 

[Linux] iowait를 sar 명령어로 확인하기

%iowait은 sar 명령어로 확인할 수 있는 로그 항목입니다. iowait 은 cpu 본연의 job이 아닌 다른 장치와의 통신 때문에 cpu job이 일시적으로 waiting 된 상태를 말합니다. cpu 성능이 좋으면 iowait이 감소할

coconuts.tistory.com

[IT/리눅스(Linux)] - 리눅스 날짜 기준으로 파일 삭제하는 방법

 

리눅스 날짜 기준으로 파일 삭제하는 방법

find 명령어에 -mtime +일수 옵션을 주면 되는데 생각한 일수보다 1 적게 주어야 합니다. -mtime : 파일의 데이터가 마지막으로 수정 된 날짜와 시간 (일 지정) -daystart : 하루 기준을 0시로 설정 3일 초

coconuts.tistory.com

 

댓글

Designed by JB FACTORY