[Service, TroubleShooting] 디버깅 Case Study


디버깅 case study

  • 개발 과정에서의 디버깅
    • 소프트웨어 개발 : 특정 작업, 동작을 할 수 있는 컴퓨터 프로그램을 만드는 과정
    • 디버깅 : 오류나 버그를 찾고 수정하는 과정
    • 버그 : 소프트웨어 설계, 개발, 작동 과정에서 생기는 오류
  • 디버깅
    • 시간이 많이 걸리기도 하지만 소프트웨어 개발에서 제일 중요한 부분이다.
    • 바라는 상황과 실제 발생한 상황의 차이가 발생한다면 디버깅이 필요하다.
  • 디버깅 프로세스는 아래의 그림에 잘 나타나 있다.

    Untitled

서버관리 case study

  • AI/ML 엔지니어가 만든 모델은 대부분 서버에서 동작한다. 따라서 서버를 어떻게 관리할 수 있는지를 배울 필요가 있다.
  • 서버 관리의 목적은 서버를 안정적으로 운영해서 장애가 발생하지 않기 위함이다. 또한 서버에서 작업을 원활하게 진행하기 위함이다.
  • 서버관리를 위해 알아야 하는 지식은 아래와 같다.
  • shell command
    • Linux 에서 사용하는 shell command 를 해당 포스트에서 정리했다.
  • 파일 시스템
    • 리눅스 파일 시스템은 아래 그림과 같이 구성되어 있다.

    Untitled

    • 이런 구조를 가지는 이유는 파일, 폴더 구조를 일관된 방식으로 제공하기 위해서다. 자세히 보면 시스템 구성, 로그 등을 별도로 저장하고 있다. 또한 소프트웨어를 설치하는 공간을 제공한다.
    • 각 폴더에 대한 설명은 아래와 같다.

    Untitled

    • /bin 에는 cp, dd, expr, mkdir, pwd, sh 등이 저장되어 있다. 즉 환경 변수에 등록되어서 바로 사용할 수 있는 명령어들이다.

    Untitled

    • 파일시스템과 디스크 : 디스크 용량이 성능에 영향을 미친다.

    Untitled

    • 위 그림에서 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)로 변환해준다.

    Untitled

    • Port 숫자는 PC 에 접속할 수 있는 통로를 의미한다. localhost:8000 에서는 8000 번 포트로 접속한다는 것이다.
      • 포트를 개방(오픈)해야 사용할 수 있다.
    • 방화벽
      • 필수는 아니지만, OS 에 특정 IP, port 만 접속할 수 있도록 설정한다.
      • 보통 이런 IP, Port 를 ACL(Access Control List) 혹은 White List 라고 부른다.
    • ping 은 네트워크 진단 시 사용하는 명령어다.

    Untitled

    • 위 그림처럼 서버가 연결되어 있는지, 얼마나 빠른 속도로 데이터가 전송되는지 테스트한다.
    • 네트워크 상에서 서버에게 작은 패킷을 보내고, 서버가 이를 받았다는 신호를 받는 것으로 동작한다.
    • ping + IP 주소 혹은 ping + 도메인 이름 을 입력하여 실행할 수 있다.
    • packet loss 는 서버에 도달하지 못한 패킷의 비율을 의미한다.
    • nslooknp
      • 특정 도메인(ex. www.google.com) 을 찾을 수 있는지 확인 가능한 명령어다.
      • DNS 서버에 연결 가능한지 확인하거나, 서버에 DNS 서버 설정이 잘 되어 있는지 1 차적으로 확인할 때 사용한다.

    Untitled

    • 포트 개방 확인 (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, 프론트 등 여러 이유가 있을 수 있기 때문에 디버깅을 하며 하나씩 해결해가야 한다.
  • 패키지 관리
    • 패키지 관리에 대해서는 poetry 등을 해당 포스트에서 정리했다. 현재 사용하고 있는 더 자세한 poetry 사용법도 정리해보자.
  • 성능 모니터링
    • GPU, CPU, Memory 의 성능을 확인하고 싶은 경우 모니터링이 필요하다.
    • AI 모델 학습 과정에서 사용하고 있는 리소스를 확인하는 것이 좋다.
    • top
      • CPU, Memory, Process 정보를 확인할 수 있다.
      • 순간의 정보를 확인하려면 -b 옵션을 준다.
      • -n 옵션을 통해 top 실행주기(반복횟수)를 설정할 수 있다.

    Untitled

    • 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] 와 같이 설치한다.

    Untitled

    • nvidia-smi
      • GPU 코어 별로 각 상태, 사용량을 확인할 수 있다.
  • Docker, 컨테이너
    • 해당 개념들은 너무 중요하기 때문에 별도의 카테고리를 두어 정리한다.
맨 위로 이동 ↑

댓글 남기기