◾️ 서버 살펴보기
각 디렉토리 별로 디스크 사용량 확인해보기
sudo du -shc /* 2>/dev/null
# du -h : 하위 디렉토리까지 표현
# du -sh : 해당 디렉토리만 표현
# du -ah : 파일에 대한 정보도 표현
기가 용량인 디렉토리 조회해보기
du -h --max-depth=1 | grep "^[0-9.]\+G"
서버의 공인 IP 확인해보기
curl -L wgetip.com
스크립트를 사용하여 서버 상세 정보 조회해보기
#### 조회 목록
## 물리 Storage 정보 조회
## 메모리 갯수 조회
## NIC 정보 조회
## 프로세스별 메모리 사용량 조회
## Routing table 조회
## cron 스케줄 정보 조회
## 방화벽 정보 조회
####
git clone https://github.com/woowacourse/script-practice
cd script-practice/script
sudo chmod 755 ./*
sudo bash ./server_resource.sh all
◾️ 파일 다루기
- 파일 찾기 명령어 (find) 다뤄보기.
find 명령어 연습을 위해 Github 저장소를 clone하자.
git clone https://github.com/brainbackdoor/infra-workshop
파일 이름으로 파일을 찾아보자.
find ~/infra-workshop -name "*java"
find ~/infra-workshop -type f -user root \( -perm 4000 -o -perm -2000 \) -exec ls -lh {} \;
find ~/infra-workshop -type f -mtime -2 -exec ls -al {} \;
find ~/infra-workshop -type f -size 3M -exec ls -lh {} \;
◾️ 자바 프로세스 실행
- 자바 설치 / 빌드 / 실행 / 로그 확인 과정 살펴보기
A. 자바 설치
which java
sudo apt update
sudo apt install default-jre
sudo apt install default-jdk
B. 빌드
git clone [저장소]
cd [저장소]
./gradlew clean build
# jar파일을 찾아본다.
find ./* -name "*jar"
C. 실행
java -jar [jar파일명] &
# Application을 실행 후 정상적으로 동작하는지 확인해봅니다.
# 브라우저에서도 http://{서버 ip}:{port}로 접근해보세요.
curl http://localhost:8080
-Dserver.port=8000
옵션을 활용하여 port 변경이 가능- 서버 시작 시간이 너무 오래걸리는 경우
-Djava.security.egd
옵션을 적용해보자.
java -Djava.security.egd=file:/dev/./urandom -jar [jar파일명] &
- 터미널 세션이 끊어질 경우, background로 돌던 프로세스에 hang-up signal이 발생해 프로세스가 죽는 경우가 종종 있는데, 이 경우
nohup
명령어를 활용
nohup java -jar [jar파일명] 1> [로그파일명] 2>&1 &
또는
nohup java -jar [jar파일명] 1> [success log 파일명] 2>[fail log 파일명] &
D. 로그 확인
# java applicaion이 남기는 로그를 확인합니다.
tail -f [로그파일명]
tail -f /var/log/syslog
# 파일을 압축하고 파일 소유자와 모드를 변경해봅니다.
tar -cvf [파일명] [압축할파일 또는 디렉터리]
sudo chown [소유자계정명]:[소유그룹명] [file이름]
chmod [옵션] [파일명]
E. 실행 프로세스 종료
# 프로세스 pid를 찾아봅니다.
ps -ef | grep java
pgrep -f java
# 프로세스를 종료합니다.
## why not use SIGKILL
## https://stackoverflow.com/questions/2541475/capture-sigint-in-java
kill -KILL [PID]
kill -KILL $(pgrep -f java)
◾️ 문제 상황 진단
- 문제 상황 진단 시 자주 사용하는 명령어 정리
# 리눅스 방화벽 정책 확인
$ iptables -nL
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
## 리눅스 방화벽 정책 삭제
$ sudo iptables -t nat -L --line-numbers
$ sudo iptables -t nat -D PREROUTING [라인 넘버]
# Ping 테스트
$ ping -c 5 -s 128 www.google.com (c : 패킷 수, s : 패킷 사이즈)
$ traceroute google.com
# curl 테스트
$ curl -I google.com
# tcp dump 확인
$ tcpdump host 192.168.0.207
$ tcpdump port 80
$ tcpdump net 192.168
# 서버 리소스 및 프로세스 상태 확인
$ top
# 포트 상태 확인
$ netstat -antp | grep 8080
# 프로세스 확인
$ ps -auxfg
$ ps -ef
# 메모리 사용량순 프로세스 보기
$ ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,cmd --sort -rss | head -n 11
# 라우팅 테이블 확인
$ ip route
# DNS 정보 확인
$ nslookup brainbackdoor.com
# 포트 상태 확인
$ telnet brainbackdoor.com 443
# 부하 상태 및 서버장비 uptime 시간 확인
$ uptime
# 메모리 상태 확인
$ free -m
◾️ 리눅스 서버 상태 파악
- 리눅스 서버 상태 1분안에 파악하기
주로 CPU utilization, Available memory, RX / TX 패킷량, Disk 사용률, IOPS 등을 확인합니다.
1. 서버 상태를 파악하는데 필요한 도구를 설치해봅니다.
(https://b.luavis.kr/server/linux-performance-analysis)
$ sudo apt install sysstat
1. 우선, Load average를 확인합니다. 부하가 클 경우, 영향을 주는 프로세스를 확인합니다.
2. oom-killer 등 시스템 메시지가 발생한다면 dmesg 혹은 /var/log/syslog를 통해 확인할 수 있어요
3. vmstat를 통해 OS 커널에서 취득할 수 있는 정보를 확인해봅니다.
vmstat 5 5
procs -----------메모리---------- ---스왑-- ---입출력-- -시스템-- ------CPU-----
r b 스왑 가용 버퍼 캐시 입 출 입 출 in cs us sy id wa st
0 0 0 5398152 172996 1697260 0 0 105 22 75 164 0 1 99 0 0
0 0 0 5398152 172996 1697260 0 0 0 0 79 122 0 0 100 0 0
0 0 0 5398152 172996 1697260 0 0 0 1 78 117 0 0 100 0 0
0 0 0 5398152 172996 1697260 0 0 0 353 99 115 0 0 100 0 0
0 0 0 5398152 173004 1697244 0 0 0 10426 96 125 0 0 100 0 0
si
,so
: swap-in과 swap-out에 대한 값으로, 0이 아니라면 현재 시스템에 메모리가 부족하다는 의미입니다.us
,sy
,id
,wa
,st
: 각각 user time, 커널에서 사용되는 system time, idle, wait I/O 그리고 stolen time 을 의미합니다. stolen time은 hypervisor가 가상 CPU를 서비스 하는 동안 실제 CPU를 차지한 시간을 의미합니다.- I/O 대기와 관련해서는 wa 가 아닌, b 열을 참고합니다.
4. iostat을 통해 OS 커널에서 취득한 디스크 사용률을 알 수 있어요
iostat -xt
Linux 6.2.0-39-generic (jaehyo) 2023년 12월 22일 _x86_64_ (2 CPU)
2023년 12월 22일 16시 38분 03초
avg-cpu: %user %nice %system %iowait %steal %idle
0.08 0.01 0.66 0.06 0.00 99.18
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
loop0 0.00 0.00 0.00 0.00 0.00 1.21 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
loop1 0.30 1.42 0.00 0.00 0.06 4.80 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.02
r/s
,w/s
,rkB/s
,wkB/s
: read 요청과 write 요청, read kB/s, write kB/s를 의미합니다.
5. free 명령어로 메모리 사용량을 확인할 수 있어요
free -wh
총계 사용 여분 공유 버퍼 캐시 가용
메모리: 7.7Gi 799Mi 5.1Gi 13Mi 168Mi 1.6Gi 6.6Gi
스 왑: 2.0Gi 0B 2.0Gi
available
: swapping 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기
6,7. sar 명령어로 Network I/O, TCP stats 등을 확인할 수 있어요
sar -n DEV,TCP,ETCP 5
Linux 6.2.0-39-generic (jaehyo) 2023년 12월 22일 _x86_64_ (2 CPU)
16시 39분 30초 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
16시 39분 35초 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16시 39분 35초 ens33 1.60 1.60 0.09 0.15 0.00 0.00 0.00 0.02
16시 39분 35초 br-aeaddeee5444 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16시 39분 35초 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16시 39분 30초 active/s passive/s iseg/s oseg/s
16시 39분 35초 0.00 0.00 1.60 1.60
16시 39분 30초 atmptf/s estres/s retrans/s isegerr/s orsts/s
16시 39분 35초 0.00 0.00 0.00 0.00 0.00
rxkB/s
: Total number of kilobytes received per secondtxkB/s
: Total number of kilobytes transmitted per secondactive/s
: TCP 연결이 CLOSED 상태에서 SYN-SENT 상태로 직접 전환 된 초당 횟수 즉, 서버에서 다른 외부 장비로 TCP 연결한 횟수passive/s
: TCP 연결이 초당 LISTEN 상태에서 SYN-RCVD 상태로 직접 전환 한 횟수 즉, 서버에 새롭게 접근한 클라이언트 수retrans/s
: 초당 재전송 된 총 세그먼트 수- 재전송은 통신 품질을 판단할 수 있는 기준입니다. 네트워크 장비 불량이나 설정에 이상이 있는 경우 재전송 현상이 나타나는 경우가 많습니다. 로컬 네트워크인 경우 재전송 비율은 0.01% 이하로 거의 없어야 하고, 원거리 네트워크에서도 0.5% 이하가 일반적입니다. 재전송이 빈번히 발생한다면 네트워크 구간별 응답시간을 조사해봅니다.