사전 준비
원활한 점검을 위해 아래 패키지를 사전에 설치해주자.
# Debian
sudo apt-get install -y sysstat
# Redhat
sudo yum install -y sysstat
# Arch
yay -S sysstat
1. 로그 점검
dmesg | tail
명령어로 커널 로그 확인dmesg
명령만 실행 시 모든 커널에 대한 메시지를 출력하므로,tail
을 파이프라인으로 넘겨 마지막 10줄만 출력하도록 하자.dmesg -w
를 실행하면 실시간 로그 확인이 가능하다.
dmesg | tail
[...]
[ 23.241970] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 23.247129] Bridge firewalling registered
[ 23.748429] Initializing XFRM netlink socket
2. CPU 상태 점검
- 서버에 배포된 애플리케이션이 많은 경우 해당 애플리케이션이 점유하고 있는 resource를 점검해보고, 특정 애플리케이션의 리소스가 높다면 최적화를 고민해보도록 하자.
- 아래 명령어들을 차례로 실행하여 CPU 상태를 점검해보자.
2-1. top
top
top - 12:27:19 up 1:49, 4 users, load average: 0.10, 0.05, 0.01
작 업: 119 총계, 1 실행, 118 대기, 0 멈춤, 0 좀비
%Cpu: 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB 메모리 : 15995.3 총계, 15063.3 잔여, 727.3 사용, 464.3 버퍼/캐시
MiB 스 왑: 1024.0 총계, 1024.0 잔여, 0.0 사용. 15267.9 가용 메모리
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1591 a-user 20 0 14604 6588 4992 S 0.3 0.0 0:00.27 sshd
1 root 20 0 21024 12448 9196 S 0.0 0.1 0:00.67 systemd
2 ...
3 ...
4 ...
5 ...
2-2. mpstat
- CPU 별 균형 상태 확인
sysstat
패키지 필요
mpstat -P ALL 1
Linux 6.9.6-arch1-1 (arch) 2024년 07월 29일 _x86_64_ (3 CPU)
12시 28분 19초 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
12시 28분 20초 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
12시 28분 20초 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
12시 28분 20초 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
12시 28분 20초 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
3. 메모리 상태 확인
- 적어도 500MB 이상의
buffers
및cached
메모리가 남아있는지 확인
free -m
총계 사용 여분 공유 버퍼/캐시 가용
메모리: 15995 739 15050 0 464 15255
스 왑: 1023 0 1023
buffers
: Block 장치 I/O의 buffer 캐시 사용량cached
: 파일 시스템에 사용되는 page cache- 위
buffer
,cached
값이 0에 가깝다는건 높은 Disk I/O가 발생했음을 의미함.iostat
으로도 확인 가능
[안전한 메모리 상태]
free memory
값이 0에 가까운 경우used memory
가total
에 가까운 경우available memory
(또는free
+buff/cache
)에 충분한 여유가 있음.Swap used
값에 변화가 없음
[위험한 메모리 상태]
available memory
(또는free
+buff/cache
) 값이 0에 가까움swap used
값이 증가하거나 변동 중인 경우dmesg | grep oom-killer
명령을 실행했을때OutOfMemory-killer
가 출력된 경우
4. 프로세스 (Thread) 상태 확인
4-1. ps
- 띄워놓은 Process가 살아있는지 확인
- Process가 과하게 생기거나 혹은 아예 죽어버리는 경우도 있음
ps -ef | grep <process name>
4-2. pidstat
pidstat
으로 process 부하 확인.top
명령어와 유사하게 process 정보만을 정리하여 띄워줌.
pidstat 1
평균: UID PID %usr %system %guest %wait %CPU CPU Command
평균: 0 202 0.00 0.12 0.00 0.00 0.12 - kworker/2:2-events
평균: 1000 874 0.00 0.12 0.00 0.00 0.12 - node
평균: 1000 1473 0.00 0.12 0.00 0.00 0.12 - sshd
평균: 1000 1591 0.00 0.12 0.00 0.00 0.12 - sshd
평균: 1000 2984 0.00 0.25 0.00 0.00 0.25 - pidstat
5. Service / Daemon 확인
- 서버 프로그램이 daemon으로 동작한다면, 해당 daemon이 정상 동작 중인지 확인
daemon
: 백그라운드에서 동작하는 process
service <daemon name> status
6. 네트워크 상태 확인
6-1. ifconfig
- 현재 서버의 network 설정 및 상태 확인
ifconfig
6-2. nc
- Host 서버에 접속 가능한지 확인
- TCP 80, 443(HTTP, HTTPS) 포트 점검
nc <hostname> <port>
nc localhost 80
nc localhost 443
6-3. lsof
- 애플리케이션 배포 시 포트 충돌이 발생했을 경우, 어떤 프로세스와 포트가 중복 된건지 확인
- 아래 예시는 충돌 포트가 8000인 경우
lsof -i TCP:8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 2698 a-user 30u IPv4 13795 0t0 TCP *:irdmi (LISTEN)
node 2698 a-user 31u IPv4 14397 0t0 TCP arch:irdmi->192.168.219.164:59576 (ESTABLISHED)
node 2698 a-user 33u IPv4 13797 0t0 TCP arch:irdmi->192.168.219.164:59592 (ESTABLISHED)
6-4. netstat
- 서버 응답이 늦어지는 경우, 트래픽이 서버에 몰려있는지 확인 (네트워크 커넥트 수 체크)
netstat -nap | grep "ESTAB" | wc -l
- 1. 네트워크 연결 수가 많은데 요청이 외부에서 들어와 몰리는게 아니라면 서버에 이상이 있는 것.
- 2.
TIME_WAIT
의 수가 비정상적으로 많다면, 서버로 들어오는 요청을 제대로 처리하고 있지 못하는 것. (병목)
netstat -nap | grep "TIME_WAIT" | wc -l
6-5. sar
sar
명령어로 network throughput(Rx
,Tx
KB/s)을 측정할 수 있다.
sar -n DEV 1
$ sar -n DEV 1
Linux 5.15.0-94-generic (game) 02/16/2024 _x86_64_ (3 CPU)
03:33:17 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
03:33:18 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM ens18 2.00 1.00 0.12 0.16 0.00 0.00 0.00 0.00
03:33:18 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM br-caf1866ef9af 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM br-d1bb618ddb67 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM vethd181427 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM veth6d522c5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM vethe8dbc16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM vethb955523 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM veth9838c3f 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:33:18 PM vetheb4cf0a 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sar -n TCP,ETCP 1
$ sar -n TCP,ETCP 1
Linux 5.15.0-94-generic (game) 02/16/2024 _x86_64_ (3 CPU)
03:35:28 PM active/s passive/s iseg/s oseg/s
03:35:29 PM 0.00 0.00 1.00 1.00
03:35:28 PM atmptf/s estres/s retrans/s isegerr/s orsts/s
03:35:29 PM 0.00 0.00 0.00 0.00 0.00
위 명령어로 TCP 통신량을 요약해서 확인이 가능하다.
active/s
: 로컬에서부터 요청한 초당 TCP 커넥션 수passive/s
: 원격으로부터 요청한 초당 TCP 커넥션 수retrans/s
: 초당 TCP 재연결 수
active
와 passive
수를 보는 것은 서버의 부하를 대강 측정하는데에 편리하다.
위 설명을 참고하면 active를 outbound, passive를 inbound 연결로 판단할 수 있는데, 꼭 그렇지만은 않다고 한다.
(예를 들어 localhost에서 localhost로 연결같은 connection)
retransmits는 네트워크나 서버의 이슈가 있음을 의미한다. 신뢰성이 떨어지는 네트워크 환경이나(공용인터넷),
서버가 처리할 수 있는 용량 이상의 커넥션이 붙어서 패킷이 드랍되는 것을 의미한다.
7. 디스크 상태 확인
- 서버가 오랜 시간 재부팅 없이 가동 중인 경우 disk에 쓰레기가 쌓임.
- Disk가 full 되면 시스템에서 파일을 만들지 못해 서버가 죽게됨.
- 아래 명령어를 통해 Disk 볼륨 별로 얼마나 차있는지, 빈 공간이 얼마나 남았는지 확인
- 위 문제를 간단하게 해결하기 위해서는 특정 주기마다 불 필요한 파일을 지우는 셸 스크립트를 작성하여 crontab에 등록.
7-1. df
df -h
7-2. iostat
iostat
으로 디스크 성능 확인sysstat
패키지 필요
iostat -xz 1
Linux 6.9.6-arch1-1 (arch) 2024년 07월 29일 _x86_64_ (3 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.79 0.00 0.14 1.50 0.00 97.57
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util
dm-0 1.66 38.98 0.00 0.00 13.92 23.54 0.74 3.71 0.00 0.00 12.03 5.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.03 1.96
dm-1 3.37 64.39 0.00 0.00 7.43 19.12 4.06 29.01 0.00 0.00 17.87 7.15 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.10 3.74
sda 3.76 104.36 1.31 25.85 6.57 27.76 2.20 32.71 2.59 54.08 20.52 14.85 0.00 0.00 0.00 0.00 0.00 0.00 0.74 36.92 0.10 4.15
sr0 0.00 0.13 0.00 0.00 0.27 35.07 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
r/s | w/s | rkB/s | wkB/s |
---|---|---|---|
read 요청 | write 요청 | read kB/s 속도 | write kB/s 속도 |
- r/s 나 w/s 값이 너무 크지 않은지 확인
- 예상보다 과도한 요청으로 문제가 발생한 경우
- await : I/O 처리 평균 시간.
- 일반적인 장치의 요청 처리 시간보다 긴 경우(위 예시 dm-1), 블럭 장치 자체의 문제 혹은 장치가 포화 상태임을 의미.
7-3. du
du
명령어로 용량이 높은 폴더를 찾아낼 수 있다.
du -sh /* 2>/dev/null | grep 'G'
3.7G /home
1.4G /snap
8.1G /swap.img
3.3G /usr
1.2G /var