[Service, TroubleShooting] 디버깅 Case Study
디버깅 case study
- 개발 과정에서의 디버깅
- 소프트웨어 개발 : 특정 작업, 동작을 할 수 있는 컴퓨터 프로그램을 만드는 과정
- 디버깅 : 오류나 버그를 찾고 수정하는 과정
- 버그 : 소프트웨어 설계, 개발, 작동 과정에서 생기는 오류
- 디버깅
- 시간이 많이 걸리기도 하지만 소프트웨어 개발에서 제일 중요한 부분이다.
- 바라는 상황과 실제 발생한 상황의 차이가 발생한다면 디버깅이 필요하다.
-
디버깅 프로세스는 아래의 그림에 잘 나타나 있다.
서버관리 case study
- AI/ML 엔지니어가 만든 모델은 대부분 서버에서 동작한다. 따라서 서버를 어떻게 관리할 수 있는지를 배울 필요가 있다.
- 서버 관리의 목적은 서버를 안정적으로 운영해서 장애가 발생하지 않기 위함이다. 또한 서버에서 작업을 원활하게 진행하기 위함이다.
- 서버관리를 위해 알아야 하는 지식은 아래와 같다.
- shell command
- Linux 에서 사용하는 shell command 를 해당 포스트에서 정리했다.
- 파일 시스템
- 리눅스 파일 시스템은 아래 그림과 같이 구성되어 있다.
- 이런 구조를 가지는 이유는 파일, 폴더 구조를 일관된 방식으로 제공하기 위해서다. 자세히 보면 시스템 구성, 로그 등을 별도로 저장하고 있다. 또한 소프트웨어를 설치하는 공간을 제공한다.
- 각 폴더에 대한 설명은 아래와 같다.
/bin
에는cp
,dd
,expr
,mkdir
,pwd
,sh
등이 저장되어 있다. 즉 환경 변수에 등록되어서 바로 사용할 수 있는 명령어들이다.
- 파일시스템과 디스크 : 디스크 용량이 성능에 영향을 미친다.
- 위 그림에서
df -h
명령어는 파티션 단위로 용량을 확인한다.-h
는 human-readable 의 약자로 사람이 보기 좋게 출력하는 옵션이다. du -sh -d2 /* | sort
를 통해 폴더, 파일 단위로 용량을 확인할 수 있다.-d
는 depth 로 현재 디렉토리 기준 출력할 depth 를 정하는 옵션이다.- 서버가 어떤 환경에서 실행 중인지 항상 확인이 필요하다.
- On premise (IDC 와 같은 물리적으로 접근이 가능한 서버) 환경인지 Cloud 환경인지.
- Host 머신에서 직접 실행한 지 여부, Docker/쿠버네티스 같은 Container 환경인지 여부
- 네트워크
- IP 는 네트워크에 연결된 다른 컴퓨터의 주소를 뜻한다.
16.144.223.21
같이 숫자로 구성되어 있다. 이러한 IP 주소는 외우기 어려우니 도메인을 구매해서 설정하게 된다. - DNS 는 사람이 읽을 수 있는 도메인(url) 이름(예:www.amazon.com)을 컴퓨터가 읽을 수 있는 IP주소(예:192.0.2.44)로 변환해준다.
- Port 숫자는 PC 에 접속할 수 있는 통로를 의미한다.
localhost:8000
에서는 8000 번 포트로 접속한다는 것이다.- 포트를 개방(오픈)해야 사용할 수 있다.
- 방화벽
- 필수는 아니지만, OS 에 특정 IP, port 만 접속할 수 있도록 설정한다.
- 보통 이런 IP, Port 를 ACL(Access Control List) 혹은 White List 라고 부른다.
ping
은 네트워크 진단 시 사용하는 명령어다.
- 위 그림처럼 서버가 연결되어 있는지, 얼마나 빠른 속도로 데이터가 전송되는지 테스트한다.
- 네트워크 상에서 서버에게 작은 패킷을 보내고, 서버가 이를 받았다는 신호를 받는 것으로 동작한다.
ping + IP
주소 혹은ping + 도메인 이름
을 입력하여 실행할 수 있다.- packet loss 는 서버에 도달하지 못한 패킷의 비율을 의미한다.
nslooknp
- 특정 도메인(ex. www.google.com) 을 찾을 수 있는지 확인 가능한 명령어다.
- DNS 서버에 연결 가능한지 확인하거나, 서버에 DNS 서버 설정이 잘 되어 있는지 1 차적으로 확인할 때 사용한다.
- 포트 개방 확인 (TCP Connection)
- 현재 연결된 포트 정보들을 확인할 때는
netstat
명령어를 쓴다. - 특정 포트만 확인하고자 할 땐, 보통
grep
명령어를 활용한다. netstat -tlnp | grep 3000
- 현재 연결된 포트 정보들을 확인할 때는
- 네트워크 에러 case study
- 서버에 Jupyter notebook 을 실행했는데 웹에서 접속할 수 없는 경우
- 원인이 웹에서 접근이 되지 않는 것일 때, 아래와 같은 해결 방법을 생각해볼 수 있다.
- 먼저 IP 주소를 잘 작성했는지 확인한다. 내부 IP 와 외부 IP 중 어떤 것을 사용했는지 확인해볼 수 있다.
- 이후
ping
이 정상적으로 가는지,netstat
으로 포트를 확인하여 네트워크 연결을 확인할 수 있다. - Jupyter notebook 실행 시 해당 IP 로 실행됐는지 확인한다.
- 방화벽을 확인한다. 서버의 포트는 기본적으로 많이 차단되어 있기 때문에(많이 열려있으면 해킹 위험), 방화벽 설정에서 특정 포트를 오픈해야 접근할 수 있다.
- Jupyter notebook 을 실행한 터미널에서 접근 Access Log 가 남는지 확인한다. 남지 않으면 잘못된 곳에 접근하고 있을 가능성이 있다.
- 이후 서버 과부하 여부를 확인해야 할 수 있다.
- 또한 디스크 용량이 가득 차서 오류가 발생할 수도 있다. Docker 를 사용하는 경우, Log 파일이 자동으로 생성되어 쌓이곤 한다.
- FastAPI 를 사용해서 웹서버를 만들었다면 인프라 영역, DB, 프론트 등 여러 이유가 있을 수 있기 때문에 디버깅을 하며 하나씩 해결해가야 한다.
- IP 는 네트워크에 연결된 다른 컴퓨터의 주소를 뜻한다.
- 패키지 관리
- 패키지 관리에 대해서는 poetry 등을 해당 포스트에서 정리했다. 현재 사용하고 있는 더 자세한 poetry 사용법도 정리해보자.
- 성능 모니터링
- GPU, CPU, Memory 의 성능을 확인하고 싶은 경우 모니터링이 필요하다.
- AI 모델 학습 과정에서 사용하고 있는 리소스를 확인하는 것이 좋다.
top
- CPU, Memory, Process 정보를 확인할 수 있다.
- 순간의 정보를 확인하려면
-b
옵션을 준다. -n
옵션을 통해 top 실행주기(반복횟수)를 설정할 수 있다.
us
는 유저 레벨의 cpu 사용량을 의미한다.sy
는 시스템 레벨의 cpu 사용량을 의미한다.PID
는 프로세스 id 이며,%CPU
,%MEM
은 프로세스 별 CPU, 메모리 사용량을 의미한다.top
이외에도htop
,gotop
등 다양한 도구가 존재한다.glances
- CPU, Memory, Disk, GPU, Docker Container 상태까지 모니터링할 수 있다. 더 직관적으로 성능을 확인할 수 있다.
- 웹 인터페이스도 존재해서 띄워둘 수 있다. 즉 API 로 상태를 확인할 수 있는 기능이 있다.
- Python 으로
pip install glances[all]
와 같이 설치한다.
nvidia-smi
- GPU 코어 별로 각 상태, 사용량을 확인할 수 있다.
- Docker, 컨테이너
- 해당 개념들은 너무 중요하기 때문에 별도의 카테고리를 두어 정리한다.
댓글 남기기