Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

7.2. 성능 문제 모니터링 및 진단

Red Hat Enterprise Linux 7은 시스템 성능을 모니터링하고 시스템 메모리와 관련된 성능 문제를 진단하는 데 유용한 여러 툴을 제공합니다. 이 섹션에서는 사용 가능한 툴을 간략하게 설명하고 메모리 관련 성능 문제를 모니터링하고 진단하는 데 사용하는 방법에 대한 예를 제공합니다.

7.2.1. vmstat를 사용하여 메모리 사용량 모니터링

procps-ng 패키지에서 제공하는 vm stat 는 시스템의 프로세스, 메모리, 페이징, 블록 입력/출력, 인터럽트 및 CPU 활동에 대한 보고서를 출력합니다. 시스템이 마지막으로 부팅된 이후 또는 이전 보고서 이후 이러한 이벤트의 평균에 대한 즉각적인 보고서를 제공합니다.
다음 명령은 다양한 이벤트 카운터 및 메모리 통계 테이블을 표시합니다.
$ vmstat -s
vmstat 사용 방법에 대한 자세한 내용은 A.8절. “vmstat” 또는 도움말 페이지를 참조하십시오.
$ man vmstat

7.2.2. Valgrind를 사용하여 애플리케이션 메모리 사용량 프로파일링

Valgrind 는 사용자 공간 바이너리에 계측을 제공하는 프레임워크입니다. 여기에는 프로그램 성능을 프로파일링하고 분석하는 데 사용할 수 있는 여러 도구가 포함되어 있습니다. 이 섹션에 설명된 valgrind 툴은 초기화되지 않은 메모리 사용 및 부적절한 메모리 할당 또는 거래 위치와 같은 메모리 오류를 감지하는 데 도움이 될 수 있습니다.
valgrind 또는 해당 툴을 사용하려면 valgrind 패키지를 설치합니다.
# yum install valgrind

7.2.2.1. Memcheck를 사용하여 메모리 사용량 프로파일링

memcheck 는 기본 valgrind 툴입니다. 다음과 같이 탐지 및 진단하기 어려울 수 있는 여러 메모리 오류를 감지하고 보고합니다.
  • 발생하지 않아야 하는 메모리 액세스
  • 정의되지 않았거나 초기화되지 않은 값 사용
  • 잘못 해제된 힙 메모리
  • 포인터 중복
  • 메모리 누수
참고
memcheck 는 이러한 오류만 보고할 수 있으며 이를 방지할 수 없습니다. 프로그램이 일반적으로 세그먼트 오류를 유발하는 방식으로 메모리에 액세스하면 세그먼트 오류가 계속 발생합니다. 그러나 memcheck 는 오류 발생 직전에 오류 메시지를 기록합니다.
memcheck 는 계측을 사용하므로 memcheck 로 실행된 애플리케이션은 일반적인 것보다 10~30배 느리게 실행됩니다.
애플리케이션에서 memcheck 를 실행하려면 다음 명령을 실행합니다.
# valgrind --tool=memcheck application
다음 옵션을 사용하여 특정 유형의 문제에 대한 memcheck 출력을 집중할 수도 있습니다.
--leak-check
애플리케이션 실행이 완료되면 memcheck 에서 메모리 누수를 검색합니다. 기본값은 --leak-check=summary 로 발견된 메모리 누수를 출력합니다. --leak-check=yes 또는 --leak-check=full 을 지정하여 각 개별 누출의 세부 정보를 출력할 수 있습니다. 비활성화하려면 --leak-check=no 를 지정합니다.
--undef-value-errors
기본값은 정의되지 않은 값을 사용할 때 오류를 보고하는 --undef-value-errors=yes 입니다. 또한 --undef-value-errors=no 를 지정하여 이 보고서를 비활성화하고 Memcheck 속도를 약간 높일 수 있습니다.
--ignore-ranges
메모리 주소성을 확인할 때 memcheck 가 무시해야 하는 하나 이상의 범위를 지정합니다(예: --ignore-ranges=0xPP-0xQ,0xRR-0xSS ).
전체 memcheck 옵션 목록은 /usr/share/doc/valgrind-version/valgrind_manual.pdf 에 포함된 문서를 참조하십시오.

7.2.2.2. Cachegrind를 사용하여 캐시 사용량 프로파일링

cache grind는 시스템의 캐시 계층 구조 및 분기 예측자와 애플리케이션 상호 작용을 시뮬레이션합니다. 시뮬레이션된 첫 번째 수준 명령 및 데이터 캐시의 사용을 추적하여 이 캐시 수준과 잘못된 코드 상호 작용을 감지합니다. 또한 메모리 액세스를 추적하기 위해 마지막 수준의 캐시(초 또는 세 번째 수준)를 추적합니다. 따라서 cachegrind 로 실행된 애플리케이션은 일반적인 것보다 20~10배 느리게 실행됩니다.
cachegrind 는 애플리케이션 실행 기간에 대한 통계를 수집하고 콘솔에 요약을 출력합니다. 애플리케이션에서 cachegrind 를 실행하려면 다음 명령을 실행합니다.
# valgrind --tool=cachegrind application
다음 옵션을 사용하여 특정 문제에 대한 cachegrind 출력을 집중할 수도 있습니다.
--I1
다음과 같이 첫 번째 수준 명령 캐시의 크기, 연관성 및 행 크기를 지정합니다(예: --I1=size,associativity ).
--D1
첫 번째 수준 데이터 캐시의 크기, 연결성 및 행 크기를 지정합니다(예: --D1=size,associativity ).
--LL
다음과 같이 마지막 수준 캐시의 크기, 연결성 및 행 크기를 지정합니다. --LL=size,associativity,line_size.
--cache-sim
캐시 액세스 및 누락 개수를 활성화하거나 비활성화합니다. 이는 기본적으로 활성화되어 있습니다(--cache-sim=yes). 이 및 --branch-sim 을 비활성화하면 수집할 정보 없이 cachegrind 가 남습니다.
--branch-sim
분기 명령 및 잘못된 예측 횟수를 활성화하거나 비활성화합니다. 이는 기본적으로 활성화되어 있습니다(--branch-sim=yes). 이 및 --cache-sim 을 비활성화하면 수집할 정보 없이 cachegrind 가 남게 됩니다.
cachegrind 는 프로세스별 cachegrind.out.pid파일에 자세한 프로파일링 정보를 작성합니다. 여기서 pid 는 프로세스 식별자입니다. 이러한 자세한 정보는 다음과 같이 cg_annotate 툴에서 추가로 처리할 수 있습니다.
# cg_annotate cachegrind.out.pid
cachegrind 는 cg_diff 툴을 제공하므로 코드 변경 전후에 프로그램 성능을 더 쉽게 차트할 수 있습니다. 출력 파일을 비교하려면 다음 명령을 실행하고, 먼저 초기 프로필 출력 파일로 교체하고, 두 번째는 후속 프로필 출력 파일로 교체합니다.
# cg_diff first second
결과 출력 파일은 cg_annotate 툴을 사용하여 더 자세히 볼 수 있습니다.
전체 cachegrind 옵션 목록은 /usr/share/doc/valgrind-version/valgrind_manual.pdf 에 포함된 문서를 참조하십시오.

7.2.2.3. if를 사용하여 힙 및 스택 공간 프로파일링

ImageChangeif 는 지정된 애플리케이션에서 사용하는 힙 공간을 측정합니다. 이는 유용한 공간과 예약 유지 및 정렬을 위해 할당된 추가 공간을 모두 측정합니다. Cryostatif 는 애플리케이션 메모리 사용을 줄이는 방법을 이해하여 실행 속도를 높이고 애플리케이션이 시스템 스왑 공간을 소모할 가능성을 줄이는 데 도움이 됩니다. 알렉사와 함께 실행되는 애플리케이션은 일반보다 약 20배 느리게 실행됩니다.
애플리케이션에서 ianif 를 실행하려면 다음 명령을 실행합니다.
# valgrind --tool=massif application
또한 다음 옵션을 사용하여 특정 문제에 대한 알칼리 프트 리스 출력을 집중할 수도 있습니다.
--heap
heap을 위한피 규모 프로필의 값을 지정합니다. 기본값은 --heap=yes 입니다. 힙 프로파일링을 --heap=no 로 설정하여 비활성화할 수 있습니다.
--heap-admin
힙 프로파일링을 사용할 때 블록당 바이트 수를 지정합니다. 기본값은 8 바이트입니다.
--stacks
topology if 가 스택을 프로파일링하는지 여부를 지정합니다. 스택 프로파일링이 훨씬 느려질 수 있으므로 기본값은 --stack=no 입니다. 스택 프로파일링을 활성화하려면 이 옵션을 --stack=yes 로 설정합니다. 루트 스택이 프로파일된 애플리케이션과 관련된 스택 크기 변경 사항을 더 잘 나타내기 위해 주 스택이 0으로 시작한다고 가정합니다.
--time-unit
chunk if 가 프로파일링 데이터를 수집하는 간격을 지정합니다. 기본값은 i (실행됨)입니다. ms (밀리초 또는 realtime) 및 B ( heap 및 스택에 할당되거나 할당됨)를 지정할 수도 있습니다. 할당된 바이트를 검사하는 것은 짧은 실행 애플리케이션 및 테스트용으로 여러 하드웨어에서 가장 재현 가능하므로 유용합니다.
servingif 는 데이터 프로파일링 데이터를 volume if.out.pid 파일로 출력합니다. 여기서 pid 는 지정된 애플리케이션의 프로세스 식별자입니다. ms_print 툴은 이 프로파일링 데이터를 그래프로 표시하여 애플리케이션 실행에 대한 메모리 소비를 표시하고 최대 메모리 할당 지점에서 할당을 담당하는 사이트에 대한 자세한 정보를 표시합니다. volume if.out.pid 파일의 데이터를 그래프로 표시하려면 다음 명령을 실행합니다.
# ms_print massif.out.pid
전체 목록의 경우 /usr/share/doc/valgrind-version/valgrind_manual.pdf 에 포함된 문서를 참조하십시오.