Recap Series
- 세션 02: Terraform을 활용한 AWS 컴플라이언스
- 세션 03: 초보자에서 빌더로: 멋진 클라우드 여정
- 세션 04: Laravel와 Bref를 활용한 팀 우선 서버리스 엔지니어링
- 세션 05: 행사 개회: AWS Community Day Hong Kong 2025
- 세션 06: Agent-to-Agent: AWS에서 상호 운용 가능한 AI 구축하기
- 세션 07: AI 에이전트와 추가 텔레메트리 데이터를 활용한 신속한 개선
- 세션 08: 바이브 코딩을 넘어서: Kiro를 활용한 사양 주도 개발
- 세션 09: MCP 및 AI 에이전트를 활용한 자동화 테스트
- 세션 10: 통신 보안 현대화: ML 기반 접근 방식
- 세션 11: GenAI 에이전트 재고찰: RAG와 MCP
- 세션 12: TAK와 AWS를 활용한 재난 및 긴급 대응
- 세션 13: 테스트 관점에서 서버리스 애플리케이션 워크플로 재고찰
- 세션 14: 클라우드 성공을 위한 실용적인 AWS FinOps
프로파일링 소개
- 프로파일러의 정의: 프로파일러는 시스템이 얼마나 원활하게 작동하는지, 시스템 리소스를 얼마나 소비하는지에 관한 정보를 제공하는 텔레메트리의 한 유형입니다.
- 프로파일링의 목적: 프로파일링은 프로그램의 리소스 소비를 조사하는 데 도움이 되며, 일정 기간 동안 특정 리소스 사용량에 관한 통계 정보를 제공합니다.
- 추적과의 차이점: 리소스 소비를 시계열 방식으로 추적하는 트레이싱과 달리, 프로파일링은 특정 기간 전체에 대한 통계 정보를 제공합니다.
- 잘 알려진 프로파일링 도구:
- Java: Java Flight Recorder (JFR)
- Python: cProfile(표준 라이브러리) 및 line_profiler(서드 파티 도구)
- Linux: 임의의 실행 파일을 위한 perf 명령
성능 조사에서 프로파일링의 중요성
- 연습 시나리오: 클라이언트 요청에 대한 웹 서버의 응답이 느린 웹 애플리케이션 지연 시간 문제를 가정해 봅니다.
- 목표: 성능 문제의 원인을 파악하고 해결합니다.
- 관찰성: 관찰성은 흔히 로그, 지표 및 추적과 연관되지만, 프로파일링은 성능 문제 해결에 필요할 수 있는 추가 통찰을 제공합니다.
로그, 지표 및 분산 추적의 한계
- [ 1 ] 지표:
- 정의: 지표는 가장 일반적인 텔레메트리 유형으로 CPU 사용량과 메모리 사용량 같은 정보를 제공합니다.
- 한계: 지표는 인스턴스나 서비스(예: 웹 서버를 실행하는 컨테이너)의 전체 리소스 소비를 추적합니다. 애플리케이션 내에서 어떤 특정 함수나 구현이 리소스를 소비하는지는 알려 주지 않습니다. 예를 들어 웹 서버가 많은 CPU를 소비한다는 것은 지표로 알 수 있지만, 어떤 함수가 높은 CPU 사용량을 유발하는지는 파악할 수 없습니다.
- [ 2 ] 분산 추적:
- 정의: 분산 추적은 시스템 내 지연 시간 문제에 관한 중요한 정보를 제공합니다.
- 한계: 일반적인 분산 추적 솔루션을 사용하려면 시스템이나 프로그램을 계측해야 합니다. 계측되지 않은 함수에 대해서는 지연 시간 정보를 얻을 수 없습니다. 모든 함수를 계측하려면 시간이 많이 들고 성능 문제가 발생할 수도 있습니다.
- [ 3 ] 로그:
- 정의: 로그는 특정 함수가 특정 시점에 수행한 특정 작업에 관한 정보를 제공합니다.
- 한계: 로그에는 프로세스의 성공적인 완료나 오류 메시지만 표시됩니다. 함수가 요청을 정상적으로 처리하면 지연 시간 문제가 있더라도 로그에는 성공 메시지만 표시됩니다. 오류가 발생하지 않는 한 로그는 지연 시간 문제의 원인에 관한 정보를 제공하지 않습니다.
결론
- 문제: 로그, 지표 및 분산 추적은 유용하지만 지연 시간 문제의 원인에 관한 완전한 정보를 제공하지 않습니다. 리소스 소비를 더 깊이 이해하고 성능 병목 현상을 파악하려면 프로파일링이 필요합니다.
현재 상태와 이상적인 상태 요약
- [ 1 ] 목표:
- 관찰성을 사용하는 목표는 성능 문제의 원인을 파악하고 해결하는 것입니다.
- [ 2 ] 현재 상태:
- 텔레메트리의 공백: 지연 시간 문제, CPU 또는 메모리 사용량 급증, 분산 추적 전반의 지연 시간 변화가 있고 로그상 함수가 요청을 정상적으로 처리하고 있음에도 지연 시간 문제의 정확한 원인은 파악되지 않은 상태입니다.
- [ 3 ] 이상적인 상태:
- 정확한 식별: 성능 문제를 일으키는 정확한 코드 줄을 찾아 정밀하게 수정할 수 있는 것이 이상적인 상태입니다.
관찰성의 정의
- 제어 이론의 관찰성: 관찰성은 시스템의 외부 출력(텔레메트리)을 통해 내부 상태를 얼마나 잘 추론할 수 있는지를 나타내는 척도로 정의됩니다.
- 이상적인 관찰성: 텔레메트리만으로 문제의 정확한 원인을 파악할 수 있는 것이 관찰성의 이상적인 상태입니다.
프로파일링의 역할
- 공백 메우기: 로그, 지표 및 추적으로 메울 수 없는 공백을 해소하려면 프로파일링이 필요합니다.
- 라스트 마일 정보: 프로파일링은 로그, 지표 및 추적이 제공하는 데이터에서 성능 문제의 정확한 원인에 도달하는 데 필요한 마지막 정보를 제공합니다.
전통적인 프로파일링 활용
- 계측: 프로파일링을 사용하려면 텔레메트리 데이터를 수집하도록 프로그램을 계측해야 합니다.
- 분석: 수집된 텔레메트리 데이터를 분석하여 성능 문제를 파악하고 해결합니다.
프로파일링을 위한 프로그램 계측
Go
- 표준 패키지: Go에 포함된 pprof 패키지를 사용합니다.
- 단계:
- Pprof 패키지를 가져옵니다.
- 프로파일러 인스턴스를 생성합니다.
- 프로파일러를 시작합니다.
- 프로파일러 측정을 중지할 위치를 정의합니다.
Python
- 라인 프로파일러: Line_profiler 패키지를 사용합니다.
- 단계:
- Line_profiler 패키지를 가져옵니다.
- 프로파일러를 활성화합니다.
- 프로파일링할 프로세스의 특정 부분을 작성합니다.
- 프로파일러를 비활성화합니다.
상시 가동 시스템을 위한 지속적 프로파일링
- [ 1 ] 차이점:
- 일회성 프로파일러: 한 번의 실행 시간을 측정합니다(타이머 시작 및 중지).
- 지속적 프로파일러: 설정된 간격(예: 5분 동안 10초마다)으로 프로파일 데이터를 주기적으로 수집하여 외부(예: Amazon S3)에 저장합니다.
- [ 2 ] 사용 사례:
- 데몬이나 웹 서버처럼 상시 가동되는 시스템, 특히 트래픽이 급증하는 상황에 적합합니다.
- [ 3 ] 솔루션:
- AWS: CodeGuru를 사용하거나 Pyroscope를 통해 Grafana를 운영합니다.
- 오픈 소스: 현재 Grafana 솔루션의 일부인 Pyroscope를 사용합니다.
프로파일 데이터 분석
- 스크린샷 예시: Pyroscope 플러그인이 설치된 Amazon Managed Grafana에서 스택별 리소스 사용량 통계를 보여 줍니다.
- 다음 단계: 데이터를 수집한 후 분석 단계로 진행하여 성능 문제를 파악하고 해결합니다.
플레임 그래프로 프로파일 데이터 시각화
- 플레임 그래프: 프로파일 데이터를 시각화하는 잘 알려진 방법입니다.
- 과제: 플레임 그래프를 읽는 방법을 이해하려면 소스 코드, 시각화의 의미 및 컴퓨터 과학의 기본 개념에 관한 지식이 필요합니다.
플레임 그래프 읽기
- [ 1 ] 그래프 예시:
- 전체 프로그램 스택의 CPU 사용량을 시각화합니다.
- [ 2 ] 해석:
- 긴 막대: 높은 리소스 소비를 나타냅니다.
- sys.call.read: 읽기 작업을 수행하며 많은 CPU를 소비하는 시스템 호출입니다.
- os.file.read: 물리적 파일을 읽는 Go 표준 라이브러리 함수로, 잘 구현되어 성능이 우수할 가능성이 높습니다.
- [ 3 ] 결론: 사용자 지정 함수(GNU Cut 명령을 모방한 Cut 함수)가 Os.file.read를 비효율적으로 호출하는 방식에 문제가 있을 수 있습니다.
함수 구현 예시
- cut 함수: GNU Cut 명령의 동작을 모방하는 함수입니다.
- 다음 단계: Cut 함수의 구현을 검토하여 os.file.read 호출 방식에 잠재적인 비효율이 있는지 파악합니다.
데모
파일 읽기의 비효율성
- 파악된 문제: 프로그램이 파일을 한 번에 1바이트씩 읽고 있었으며, 바이트를 읽을 때마다 시스템 호출이 발생하므로 비효율적입니다.
- 필요한 지식: 이것이 비효율적인 이유를 이해하려면 사용자 영역과 커널 영역은 물론 컴퓨터 과학 원리에 관한 지식이 필요합니다.
프로파일링에서 AI 어시스턴트의 역할
- AI 지원: AI 어시스턴트, 특히 대규모 언어 모델(LLM)은 프로파일 데이터를 해석하는 데 도움을 줄 수 있습니다.
- 운영 적합성: IT 운영은 문제 식별처럼 더 작고 결정적인 결과를 다루며 시스템 사양, 텔레메트리 데이터, 로그 등 풍부한 컨텍스트를 갖추고 있으므로 LLMs는 개발보다 운영에 더 적합합니다.
- 개발과 운영의 비교: 개발은 결과가 불확정적인 대량의 소스 코드를 생성해야 하므로 LLMs에 상대적으로 덜 적합합니다.
프로파일 데이터와 AI 어시스턴트 활용
- 데모: AWS 직원이 AI 어시스턴트를 사용해 프로파일 데이터와 소스 코드를 분석하고 성능 문제를 파악합니다.
- 과정:
- [ 1 ] AI 어시스턴트에게 프로파일 데이터와 소스 코드를 분석하도록 요청합니다.
- [ 2 ] 어시스턴트가 프로파일 데이터를 시각화할 도구가 필요하다고 판단합니다.
- [ 3 ] 승인을 받으면 어시스턴트가 함수별 CPU 사용량을 시각화하고 문제를 일으키는 정확한 함수를 찾아냅니다.
- [ 4 ] 어시스턴트가 코드 줄별 CPU 사용량 정보를 제공하고 개선 방안을 제안합니다.
요약
- 프로파일 데이터: 성능 문제를 실제 코드 개선과 연결하는 핵심 요소입니다.
- 전통적인 분석: 시스템과 컴퓨터 과학에 관한 깊은 지식이 필요합니다.
- AI 지원: 프로파일 데이터를 활용해 사용자에게 활용 방법을 안내하고 개발 속도를 높입니다.
