리눅스가 처음인 분들을 대상으로 작성한 포스팅입니다. cheatsheet을 함께 활용해주셔도 좋고, Bash 쉘스크립팅 가이드를 따라가보시는 것도 좋습니다.
리눅스가 프로그램의 명령을 수행하는 과정이나, 서버의 각 메트릭의 의미는 강의를 통해 확인할 수 있어요.
1. 서버 살펴보기
# 현재 위치를 확인합니다.
$ pwd
# 명령어의 메뉴얼을 확인
$ man pwd
# 파일시스템별 가용공간을 확인합니다.
$ df -h
# 각 디렉토리별로 디스크 사용량을 확인합니다.
$ sudo du -shc /*
# https://ko.wikipedia.org/wiki/Sudo
# du -h : 하위디렉토리까지 표현
# du -sh : 해당 디렉토리만 표현
# du -ah : 파일에 대한 정보도 표현
# 현재 경로의 파일들(숨김파일 포함)의 정보를 확인합니다.
$ ls -al
## 서버의 공인 IP 확인해봅니다.
$ curl wgetip.com
# git 명령어의 위치를 확인해봅니다.
$ which git
# 스크립트를 활용하여 서버 상세 정보를 확인해봅니다.
## 물리 Storage 정보 조회
## 메모리 갯수 조회
## NIC 정보 조회
## 프로세스별 메모리 사용량 조회
## Routing table 조회
## cron 스케줄 정보 조회
## 방화벽 정보 조회
$ git clone https://github.com/woowacourse/script-practice
$ cd script-practice/script/
$ sudo chmod 755 ./*
$ sudo ./server_resource.sh all
# 소스코드를 관리할 디렉토리를 생성하고 이동합니다.
$ mkdir brainbackdoor && cd brainbackdoor
Shell
복사
2. 파일 다루기
# GitHub 저장소를 clone해봅니다.
$ git clone https://github.com/brainbackdoor/infra-workshop
# 하위경로까지 복제합니다.
$ cp -R [원본디렉토리] [목적지디렉토리]
$ cp -R ./infra-workshop ../
$ ls -al ../infra-workshop
# 디렉토리의 이름을 변경합니다.
$ mv [원본디렉토리] [목적지디렉토리]
$ mv ../infra-workshop ./infra-bak
# 파일 및 디렉토리를 삭제합니다.
$ rm -rf ./infra-bak
# 파일 내용을 표준출력해봅니다.
$ cat ./infra-workshop/README.md
# 파일 이름으로 파일을 찾아봅니다.
$ sudo apt install mlocate
$ sudo updatedb
$ locate build.gradle*
# find ./* -name "*java"
# find . -type f -user root \( -perm 4000 -o -perm -2000 \) -exec ls -al {} \;
# find . -type f -mtime -2 -exec ls -al {} \;
# find . -type f -size 3M -exec ls -al {} \;
Shell
복사
3. 자바 프로세스 실행해보기
A. 자바 설치
$ which java
$ sudo apt update
$ sudo apt install default-jre
$ sudo apt install default-jdk
Bash
복사
B. 빌드
$ git clone [저장소]
$ cd [저장소]
$ ./gradlew clean build
# jar파일을 찾아본다.
$ find ./* -name "*jar"
# 프로세스를 정기 스케줄에 등록하고 관리할 수 있습니다.
# crontab -l : list crontab
# crontab -e : edit crontab
# vi /etc/crontab : 특정 사용자 권한으로 실행이 가능
Bash
복사
C. 실행
$ java -jar [jar파일명] &
# Application을 실행 후 정상적으로 동작하는지 확인해봅니다.
# 브라우저에서도 http://{서버 ip}:{port}로 접근해보세요.
$ curl http://localhost:8080
Bash
복사
•
-Dserver.port=8000 옵션을 활용하여 port를 변경할 수 있어요.
•
서버를 시작 시간이 너무 오래 걸리는 경우 -Djava.security.egd 옵션을 적용해보세요.
$ java -Djava.security.egd=file:/dev/./urandom -jar [jar파일명] &
Bash
복사
•
$ nohup java -jar [jar파일명] 1> [로그파일명] 2>&1 &
Bash
복사
D. 로그 확인
# java applicaion이 남기는 로그를 확인합니다.
$ tail -f [로그파일명]
$ tail -f /var/log/syslog
# 파일을 압축하고 파일 소유자와 모드를 변경해봅니다.
$ tar -cvf [파일명] [압축할파일 또는 디렉터리]
$ sudo chown [소유자계정명]:[소유그룹명] [file이름]
$ chmod [옵션] [파일명]
> https://ko.wikipedia.org/wiki/Chmod
Bash
복사
E. 종료
# 프로세스 pid를 찾아봅니다.
$ ps -ef | grep java
$ pgrep -f java
# 프로세스를 종료합니다.
## why not use SIGKILL
## https://stackoverflow.com/questions/2541475/capture-sigint-in-java
$ kill -2 [PID]
Bash
복사
F. 명령어 이력 확인
$ history
Bash
복사
4. 문제 상황 진단시 자주 사용하는 명령어
# 리눅스 방화벽 정책 확인
$ 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
Shell
복사
5. 리눅스 서버 상태 1분안에 파악하기
주로 CPU utilization, Available memory, RX / TX 패킷량, Disk 사용률, IOPS 등을 확인합니다.
0. 서버 상태를 파악하는데 필요한 도구를 설치해봅니다.
https://b.luavis.kr/server/linux-performance-analysis
$ sudo apt install sysstat
Shell
복사
1.
2.
oom-killer 등 시스템 메시지가 발생한다면 dmesg 혹은 /var/log/syslog를 통해 확인할 수 있어요
3.
vmstat를 통해 OS 커널에서 취득할 수 있는 정보를 확인해봅니다.
$ vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 20774188 124872 10659336 0 0 0 9 3 3 0 0 100 0 0
0 0 0 20771628 124872 10659576 0 0 0 0 1143 1041 0 0 99 0 0
Shell
복사
•
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 열을 참고합니다.
6. iostat을 통해 OS 커널에서 취득한 디스크 사용률을 알 수 있어요
$ iostat -xt
Linux 5.4.0-1038-aws (ip-192-168-0-146.ap-northeast-2.compute.internal) 03/19/21 _x86_64_ (8 CPU)
03/19/21 14:59:35
avg-cpu: %user %nice %system %iowait %steal %idle
0.15 0.00 0.08 0.00 0.04 99.73
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 aqu-sz %util
loop0 0.01 0.01 0.00 0.00 0.30 1.04 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.00 0.00 0.00 0.00 2.27 1.25 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
Shell
복사
•
r/s, w/s rkB/s, wkB/s: read 요청과 write 요청, read kB/s, write kB/s를 의미합니다.
7.
free 명령어로 메모리 사용량을 확인할 수 있어요
$ free -wh
total used free shared buffers cache available
Mem: 31Gi 1.3Gi 19Gi 0.0Ki 122Mi 10Gi 29Gi
Swap: 0B 0B 0B
Shell
복사
•
available : swapping 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기
8,9. sar 명령어로 Network I/O, TCP Stats 등을 확인할 수 있어요
$ sar -n DEV,TCP,ETCP 5
Linux 5.3.0-1032-aws (ip-192-168-0-207) 08/13/20 _x86_64_ (2 CPU)
23:17:08 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
23:17:13 eth0 0.60 0.20 0.03 0.01 0.00 0.00 0.00 0.00
23:17:08 active/s passive/s iseg/s oseg/s
23:17:13 0.00 0.00 0.40 0.00
23:17:08 atmptf/s estres/s retrans/s isegerr/s orsts/s
Shell
복사
•
rxkB/s : Total number of kilobytes received per second
•
txkB/s : Total number of kilobytes transmitted per second
•
active/s : TCP 연결이 CLOSED 상태에서 SYN-SENT 상태로 직접 전환 된 초당 횟수 즉, 서버에서 다른 외부 장비로 TCP 연결한 횟수
•
passive/s : TCP 연결이 초당 LISTEN 상태에서 SYN-RCVD 상태로 직접 전환 한 횟수 즉, 서버에 새롭게 접근한 클라이언트 수
•
retrans/s : 초당 재전송 된 총 세그먼트 수
◦
재전송은 통신 품질을 판단할 수 있는 기준입니다. 네트워크 장비 불량이나 설정에 이상이 있는 경우 재전송 현상이 나타나는 경우가 많습니다. 로컬 네트워크인 경우 재전송 비율은 0.01% 이하로 거의 없어야 하고, 원거리 네트워크에서도 0.5% 이하가 일반적입니다. 재전송이 빈번히 발생한다면 네트워크 구간별 응답시간을 조사해봅니다.