[운영체제] Chapter 2.10 Operating-System Debugging

강현주·2025년 1월 26일

대강 말해서, 디버깅은 하드웨어와 소프트웨어에서 시스템의 에러를 찾고 고치는 활동이다. 성능 문제도 버그로 여거져서, 디버깅은 또한 프로세싱의 병목현상을 제거하여 성능을 개선하는 성능 튜닝도 포함된다.

2.10.1 Failure Analysis

만약 프로세스가 실패하면, 대부분의 운영체제는 에러 정보를 로그파일에 작성하여 문제가 발생했다고 시스템 관리자 또는 사용자에게 알린다. 운영체제는 또한 프로세스의 메모리를 포착하는 코어 덤프를 수행하여 이후 분석을 위해 파일에 저장한다.(메모리는 초기 컴퓨팅 시절에 "코어"로 불렸다.) 실행 중인 프로그램과 코어 덤프는 디버거로 조사할 수 있고, 이것은 프로그래머가 프로세스 실패 시점에 코드와 메모리를 탐색하는 것을 허용했다.

사용자 레벨 프로세스 코드를 디버깅하는 것은 어려운 일이다. 운영체제 커널 디버깅은 커널의 사이즈와 복잡성, 하드웨어 제어 그리고 사용자 레벨 디버깅 툴 부족 때문에 더 복잡하다. 커널에서 실패는 크래시(crash)라고 한다. 크래시가 발생하면, 에러 정보는 로그 파일에 저장되고, 메모리 상태는 크래시 덤프에 저장된다.

운영체제 디버깅과 프로세스 디버깅은 두 가지 작업의 성질이 매우 다르기 때문에, 다른 툴과 기술을 자주 사용한다. 커널이 파일 시스템 코드에서 실패하면 커널이 재부팅 전에 이것의 상태를 파일 시스템의 파일에 저장하려고 시도하는 것이 위험해질 수 있다. 일반적인 기술은 커널의 메모리 상태를 파일 시스템을 포함하지 않는 별도의 디스트 섹션에 저장하는 것이다. 커널이 회복할 수 없는 에러를 발견하면, 메모리의 전체 내용 또는 최소한 시스템 메모리의 커널 소유 부분을 디스크 공간에 작성한다. 시스탬이 재부팅될 때, 해당 영역에서 데이터를 모으고 분석을 위해 시스템 파일 내에 크래시 덤프 파일을 작성하는 프로세스가 실행된다. 물론, 이런 전략은 보통의 사용자 레벨 프로세스에서 필요하지 않을 수 있다.

2.10.2 Performance Monitoring and Tuning

병목현상을 식별하기 위해, 우리는 시스템 성능 모니터링을 할 수 있어야 한다. 따라서, 운영체제는 시스템 동작의 측정값을 계산하고 표시하는 방법을 반드시 가지고 있어야 한다. 툴은 프로세스별 또는 시스템 전체 관찰을 제공하는 것으로 특징지어질 수 있다. 관찰하기 위해, 툴은 counter와 tracing 두 접근방식 중 하나를 사용할 수 있다.

2.10.2.1 Counters

운영체제는 시스템 콜의 수 또는 네트워크 장치나 디스크에 수행된 작업 수와 같은 일련의 카운터를 통해 시스템 활동을 추적한다. 다음은 카운터를 사용하는 Linux 툴의 예시이다.

Per-Process

  • ps - 단일 프로세스 또는 프로세스 선택에 대한 정보 보고
  • top - 현재 프로세스의 실시간 통계 보고

System-Wide

  • vmstat - 메모리 사용 통계 보고
  • netstat - 네트워트 인터페이스 통계 보고
  • iostat - 디스크의 I/O 사용 보고

대부분의 리눅스 시스템의 카운터 기반 툴은 /proc 파일 시스템에서 통계를 읽는다. /proc는 커널 메모리에만 존재하는 "가상" 파일 시스템이고, 주로 다양한 프로세스 별뿐만 아니라 커널 통계 쿼리에 사용된다. /proc 파일 시스템은 디렉토리 계층으로 구성되고, 프로세스는 /proc 아래의 서브디렉토리로 나타난다. 예를 들어, 디렉토리 항목 /proc/2155에는 ID가 2155인 프로세스의 프로세스별 통계를 포함한다. 다양한 커널 통계에 대한 /proc 항목도 있다.

윈도우 시스템은 윈도우 작업 관리자를 제공하며, 그 도구는 현재 애플리케이션, 프로세스, CPU와 메모리 사용, 네트워킹 통계 정보를 포함한다.

2.10.3 Tracing

카운터 기반 도구는 커널이 유지하는 어떤 통계의 현재의 값을 알아보는 반면에, 트래이싱 도구는 시스템 콜 호출과 관련된 단계 같은 특정 이벤트의 데이터를 수집한다. 이벤트를 추적하는 Linux 툴의 예는 다음과 같다.

Per-Process

  • strace - 프로세스의 시스템 콜 호출 추적
  • gdb - 소스 레벨 디버거

System-Wide

  • perf - Linux 성능 도구 모음
  • tcpdump - 네트워크 패킷 수집

Kernighan's Law (커니건의 법칙)
"디버깅은 코드를 작성하는 것보다 두 배 더 어렵다. 따라서, 코드를 가능한 영리하게 작성한다면, 당신은, 정의에 의해, 그것을 디버깅할 만큼 충분히 똑똑하지 못하다."

운영체제를 실행하면서 더 쉽게 이해하고, 디버깅하고, 튜닝하게 만드는 것은 활발한 연구와 실무 분야이다. 새로운 시대의 커널 임베디드 성능 분석 툴은 이 목표를 달성하는 것에 중요한 개선을 만들었다.

2.10.3 BBC

사용자 레벨 그리고 커널 코드 사이의 상호작용을 디버깅하는 것은 두 코드 세트를 이해하고 상호작용을 계측할 수 있는 툴셋 없이는 불가능에 가깝다. 그 툴셋이 정말 유용하려면, 디버그를 염두에 두고 작성되지 않은 영역을 포함하여 시스템의 어느 영역에서도 디버그할 수 있어야하며, 시스템의 신뢰성에 영향을 미치지 않아야 한다. 툴셋은 또한 성능에 최소한의 영향을 미쳐야한다. 이상적으로 사용하지 않을 때는 영향을 미치지 않고, 사용하는 동안에는 비례적으로 영향을 미쳐야 한다. BCC 툴킷은 이러한 요구사항을 충족하고 동적이고, 안전하고, 영향이 적은 디버깅 환경을 제공한다.

BCC(BPF COmpiler Collection)은 Linux 시스템에 추적 기능을 제공하는 풍족한 툴킷이다. BCC는 eBPF(Berkely Packet Filter 확장) 툴의 프론트엔드 인터페이스다. BPF 기술은 컴퓨터 네트워크 트래픽을 필터링하기 위해 1990년대 초에 개발되었다. "확장된" BPF(eBPF)는 BPF에 다양한 기능들을 추가했다. eBPF 프로그램은 C의 하위집합으로 작성되었고 eBPF 명령어로 컴파일되며, 이는 실행 중인 Linux 시스템에 동적으로 삽입할 수 있다. eBPF 명령어는 특정 이벤트(특정 시스템 콜이 호출 됨)를 캡처하거나 시스템 성능(디스크 I/O 수행 필요 시간)을 모니터하는데 사용될 수 있다. eBPF 명령어가 확실하게 동작하는지 확인하기 위해, 실행 중인 Linux 커널에 삽입하기 전에 검증기을 거친다. 검증기는 명령어가 시스템 성능 또는 보안에 영향을 미치지 않는지 확인한다.

eBPF는 Linux 커널 내에서 추적하는 풍부한 기능을 제공하지만, 전통적으로 C 인터페이스를 사용하여 프로그램을 개발하는 것은 매우 어려웠다. BCC는 파이썬의 프론트엔드 인터페이스가 제공하는 eBPF를 사용하여 툴을 작성기 더 쉽게 만들기 위해 개발되었다. BCC 툴은 파이썬으로 작성되고, eBPF 수단과 상호작용하는 C 코드를 내장하고, 다시 커널과 상호작용한다. BCC 툴은 또한 C 프로그램을 eBPF 명령로 컴파일한다. 그리고 probe또는 tracepoint를 사용하여 커널에 삽입한다. 두 기술은 Linux 커널에서 이벤트를 추적할 수 있게 해준다.

커스텀 BCC 툴 작성하는 것의 사양은 이 텍스트 범위를 넘어서지만, BCC 패키지는 실행 중인 Linux 커널의 활동 여러 영역을 모니터하는 기존의 여러 도구를 제공한다. 예를 들어, BCC disksnoop 툴은 디스크 I/O 활동을 추적한다. 명령을 입력하면
./disksnoop.py
다음 예시 출력을 생성한다.

이 출력은 I/O작업이 발생됐을 때의 타임스탬프, I/O가 Read 또는 Write 작업인지, 그리고 몇 바이트가 I/O에 포함되었는지 말해준다. 마지막 열은 I/O의 지속시간(지연시간 또는 LAT로 표현)을 밀리초로 반영한다.

BCC가 제공하는 많은 툴은 MySQL 데이터베이스, 자바, 파이썬 프로그램같은 특정 애플리케이션에서 사용될 수 있다. 프로브는 또한 특정 프로세스의 활동을 모니터하기 위해 배치될 수 있다. 예를 들어, 명령어
./opensnoop -p 1255
는 식별자 1225가 있는 프로세스에서만 수행되는 open() 시스템 콜을 추적할 것이다.

BCC를 특히 강력하게 만드는 것은 그 툴이 시스템 해를 끼치지 않고 중요한 애플리케이션을 실행하는 라이브 프로덕션 시스템에서 사용될 수 있다는 것이다. 이는 특히 시스템 성능을 모니터하여 병목현상이나 보안 악용을 식별해야하는 시스템 관리자에 유용하다. 그림 2.20은 현재 BCC와 eBPF가 제공하는 광범위한 툴과 Linux 운영 체제의 모든 영역을 본질적으로 추적할 수 있는 기능을 보여준다. BCC는 새 기능이 끊임없이 추가되는 빠르게 변화하는 기술이다.

0개의 댓글