linux
[linux] 성능 분석 명령어 - 2
kkalgo
2023. 11. 28. 17:09
top 명령어
- 프로세스들의 상태와 CPU, 메모리 사용률을 확인한다.
- top 명령어를 모든 정보를 볼 시 조금 느릴 수 있다?
- hot key : 숫자 키패드 1을 누르면 Cpu(s)에서 각각의 Cpu 정보를 보여주는 것으로 변환
- hot key 키패드 1을 사용해서 변환해서 보는 이유는 무엇일까?
- 평균적으로 CPU가 50%를 사용하고 있다고 해도, 각각의 CPU가 균형 있게 사용하고 있는가를 확인
- CPU의 사용량이 불균형이 있을 수 있기 때문에 구체적 파악 가능
- 평균적으로 CPU가 50%를 사용하고 있다고 해도, 각각의 CPU가 균형 있게 사용하고 있는가를 확인
- hot key : 영어 d → CPU의 초당 사용률을 바꿀 수 있다.
- delay를 3초에서 원하는 시간으로 바꿀 수 있다.
- delay를 3초에서 원하는 시간으로 바꿀 수 있다.
top 명령어를 통해 알 수 있는 정보는 무엇인가
- CPU Usage를 확인
- us, wa를 확인해보자
- us : user를 의미, 프로세스의 일반적인 CPU 사용량
- wa : waiting을 의미, I/O 작업을 대기할 때의 CPU 사용량
- us가 높다 == CPU를 많이 쓰고 있다. CPU 변경이 필요할 수 있다.
- wa가 높다 == I/O가 많다. 더 좋은 블록 디바이스로 변경이 필요할 수 있다.
- us, wa를 확인해보자
- CPU가 고르게 사용되고 있는가를 확인
- 프로세스의 상태를 확인
- D : uninterruptible sleep (I/O)
- 이 상태는 I/O 대기 상태를 의미, vmstat으로 b 상태와 같다고 볼 수 있음
- R : running (CPU)
- S : sleeping
- 작업을 하고 있지 않음 (Load average 미포함)
- Z : zombie
- 해를 끼치지 않으나 이슈를 일으킬 가능성 존재
- D : uninterruptible sleep (I/O)
프로세스의 실행 과정 설명
- 프로세스는 fork() 시스템 콜로 만들어진다.
- 최초에는 waiting = cpu를 대기하는 상태
- cpu를 할당받으면 running
- I/O를 기다려야 한다면 D상태로
- 다 기다리고 나면 waiting, running으로
- running에서 할당된 CPU를 다 사용했다면 다시 waiting
- running에서 특정한 조건에 의해 sleep 상태로 갈 수 있으며,
- sleep에서 다시 작업을 해야하는 경우 waiting으로 갔다가..
- 위 과정의 반복, 시스템 콜 명령어를 통해 프로세스가 종료.
좀비 프로세스
- 부모 프로세스가 죽어있어도 살아있는 자식 프로세스
- 부모가 fork를 통해서 자식 프로세스를 만들었는데, 자식의 종료를 기다리지 않고 부모가 종료되는 경우가 있다.
- 일반적으로 커널에서 부모 프로세스를 죽이면 자식은 다 죽는다.
- 근데 특정한 상황이 있다는 것.(버그 등)
- 자식 프로세스는 부모에게 종료했음을 알려주는데, 부모 프로세스가 없다.
- 이들은 시스템 리소스를 사용하지는 않음, PID 고갈을 일으킬 수는 있다.
- 위 pid_max의 값은 동시에 존재 가능한 프로세스의 개수인데
- 저 값을 넘는 경우는 문제가 발생할 수 있다.
top 명령어 정리
- top 명령어를 통해서 프로세스, CPU, 메모리 사용량을 알 수 있다.
- 해당 명령어를 통해 us가 높다면 CPU가 많이 사용되는 것
- wa가 높다면 I/O가 많이 사용되는 것
- 모든 CPU 상태를 확인해야 한다. (불균형을 파악)
netstat 명령어
- 네트워크 연결 정보를 확인한다.
- 아래 사진의 의미를 파악해보자.
- 172.25.9.166의 2번 포트와 211.192.252.107의 58812포트가 연결되어 있다.
- 여기에는 PID/Program name이 없으나
- PID가 있다면, PID 몇이 사용 중이며 Program name에 해당하는 프로세스가 사용중이라는 의미
- PID가 있다면, PID 몇이 사용 중이며 Program name에 해당하는 프로세스가 사용중이라는 의미
LISTEN, ESTABLISHED, TIME_WAIT
- 통신이 일어나려면 누군가 소켓으로 듣고 있어야 한다
- Nginx로 80포트를 개방하고 netstat -napo | grep -i nginx 명령어로 확인해보면
- LISTEN 소켓이 형성되어 있음.
- 해당 호스트로 텔넷 접속을 시도하면 3-way handshake가 이루어지며
- 이 LISTEN이 ESTABLISHED로 변경된다.
- 이후 HTTP 요청을 하면 아래와 같은 요청을 받음.
- 근데 일정 시간 동안 요청이 오지 않으면 자동으로 TIME_WAIT 상태로 돌입
- 바로 끊기지 않는 이유는 HTTP/1.1의 keep alive 특성 때문
keepalive_timeout
- HTTP/1.1의 스펙 중 하나이며 연결을 유지하는 설정
- TIME_WAIT는 왜 생기며, 어떤 상황이 곤란한 상황인가?
- CLOSE_WAIT
CLOSE_WAIT
- ESATBLISHED 상태에서 FIN 사인을 받아 CLOSE_WAIT 상태로 돌입한다.
- 그런데 CLOSE_WAIT → LAST_WAIT는 별도의 신호를 받지 않는다.
- 저 상태는 자연스럽게 바뀌는 건데
- CLOSE_WAIT가 계속해서 작동한다? 문제가 발생했다는 것.
- 애플리케이션이 이상 동작을 하고 있다고 봐야 한다.
- 정상적으로 소켓을 정리하지 못한다.
- 서버 행업, 포트 고갈 등의 영향을 미치는 문제이기 때문에 반드시 해결해야함
- 이 부분은 따로 정리해보겠습니다.아래는 해당 문제에 대해 deep dive한 블로그 결과물입니다.
CLOSE_WAIT & TIME_WAIT 최종 분석
트래픽이 많은 웹 서비스를 운영하다보면 CPU는 여유가 있지만 웹서버가 응답을 제대로 처리하지 못하고 먹통이 되는 경우를 종종 보게 됩니다. 여러가지 이유가 있겠지만, 이 글에서는 가장 대
tech.kakao.com
netstat 정리
- 네트워크 연결 정보를 확인한다.
- 커넥션 상태와 IP 정보를 확인할 수 있다
- LISTEN, ESTABLISHED, TIME_WAIT는 흔히 만나는 소켓 연결 상태
- CLOSE_WAIT가 발생하면 원인을 확인하고 조치해야 한다.
네트워크 트러블 슈팅 도구
tcpdump
- 네트워크 패킷 수집 및 분석 = 네트워크 패킷의 흐름을 볼 수 있다.
- tcpdump 명령어 자체로는 해석이 어렵다. 옵션을 붙여서 사용하자
-nn
- 프로토콜과 포트 번호를 숫자 그대로 표현한다.
-vvv
- 출력 결과를 더 많이 담는다.
-A
- 패킷의 내용을 함께 출력한다.
트러블 슈팅은 목적지와 포트가 존재한다.
- tcpdump -vvv -nn -A port 80
좀 더 편하게 분석하기
- tcpdump → pcap → wireshark
tcpdump 명령 정리
- 네트워크 패킷을 수집하고 분석할 수 있다.
- -vvv -nn -A 옵션을 이용해서 효율적 사용
- host, port 문구를 이용해서 특정 목적지, 특정 포트로 필터링 할 수 있다.
- sudo tcpdump -vvv -nn -A host 목적지 IP and port 포트번호 -w dump파일이름.pcap
- tcpdump로 pcap 파일을 생성하고 wireshark로 분석할 수 있다.
하단의 강의를 참고하였습니다.
리눅스 성능 분석 시작하기 - 인프런 | 강의
리눅스 서버의 성능 분석을 위해 필요한 기본 명령어들에 대한 이해, 네트워크 문제 해결을 위한 tcpdump 명령어의 사용 방법, 사례를 기반으로 한 트러블 슈팅 방법을 알려주는 강의 입니다. 이
www.inflearn.com