Menu Close
Settings Close

Language and Page Formatting Options

Red Hat Training

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

4.2. 성능 관련 문제 모니터링 및 진단

Red Hat Enterprise Linux 7에는 시스템 성능을 모니터링하고 시스템 메모리 관련 성능 문제를 진단하는데 유용한 여러 도구가 있습니다. 다음 부분에서는 메모리 관련 성능 문제를 모니터링하고 진단하기 위해 사용 가능한 도구 및 사용 방법에 대해 설명합니다.

4.2.1. vmstat로 메모리 사용량 모니터링

Vmstatprocps-ng 패키지로 제공되며 시스템 프로세스, 메모리, 페이징, 입/출력 차단, 인터럽트, CPU 동작에 대한 보고를 출력합니다. 마지막으로 컴퓨터를 부팅한 시간 또는 마지막 보고 시간에서 이벤트 평균을 바로 보고합니다.
다음 명령은 다양한 이벤트 카운터 및 메모리 통계 테이블을 표시합니다.
$ vmstat -s
vmstat 사용 방법에 대한 보다 자세한 내용은 A.9절. “vmstat” 또는 man 페이지에서 참조하십시오:
$ man vmstat

4.2.2. Valgrind로 애플리케이션 메모리 사용량 프로파일링

Valgrind는 사용자 공간 바이너리에 대한 계측을 제공하는 프레임워크입니다. 이에는 프로그램 성능을 프로파일링하고 분석하는데 사용할 수 있는 여러 도구가 탑재되어 있습니다. 다음 부분에서 설명하고 있는 valgrind 도구는 초기화되지 않은 메모리 사용 및 부적절한 메모리 할장 및 할당 해제와 같은 메모리 관련 오류를 감지하는데 유용합니다.
valgrind 또는 기타 다른 도구를 사용하려면 valgrind 패키지를 설치합니다:
# yum install valgrind

4.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
예를 들어 --ignore-ranges=0xPP-0xQQ,0xRR-0xSS와 같이 메모리 적용 가능성을 검사할 때 memcheck이 무시해야 하는 여러 범위를 지정합니다.
memcheck 옵션의 전체 목록은 /usr/share/doc/valgrind-version/valgrind_manual.pdf에 포함된 문서에서 참조하십시오.

4.2.2.2. Cachegrind로 캐시 사용량 프로파일링

Cachegrind는 시스템의 캐시 계층 및 분기 예측을 사용하여 프로그램의 상호 작용을 시뮬레이션합니다. 시뮬레이션된 첫 번째 레벨의 명령 및 데이터 캐시 사용량을 추적하여 이러한 이러한 레벨 캐시와의 잘못된 코드 상호 작용을 감지합니다. 또한 메모리 액세스를 추적하기 위해 마지막 레벨 캐시 (두 번째 또는 세 번째 레벨)도 추적합니다. 결과적으로 cachegrind와 함께 실행되는 애플리케이션은 일반적인 실행에 비해 20-100배 더 느리게 실행됩니다.
Cachegrind는 애플리케이션 실행 시간에 대한 통계를 수집하고 콘솔에 요약 내용을 출력합니다. 애플리케이션에서 cachegrind를 실행하려면 다음 명령을 실행합니다:
# valgrind --tool=cachegrind application
다음 옵션을 사용하여 특정 문제에서 cachegrind 출력에 중점을 둘 수 있습니다.
--I1
다음과 같이 첫 번째 레벨 명령 캐시의 크기, 연결성, 행 크기를 지정합니다: --I1=size,associativity,line_size.
--D1
다음과 같이 첫 번째 레벨 데이터 캐시의 크기, 연결성, 행 크기를 지정합니다: --D1=size,associativity,line_size.
--LL
다음과 같이 마지막 레벨 명령 캐시의 크기, 연결성, 행 크기를 지정합니다: --LL=size,associativity,line_size
--cache-sim
캐시 액세스 및 미스 카운트 모음을 활성화 또는 비활성화합니다. 이는 기본적으로 활성화(--cache-sim=yes)되어 있습니다. --cache-sim 및 --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 도구를 제공하여 코드 변경 전 후의 프로그램 성능을 더 쉽게 도표화할 수 있습니다. 출력 파일을 비교하려면 다음 명령을 실행합니다. 여기서 first는 초기 프로 파일 출력 파일로 second는 후속 프로파일 출력 파일로 변경합니다.
# cg_diff first second
결과 출력 파일의 상세 정보는 cg_annotate 도구로 표시할 수 있습니다.
cachegrind 옵션의 전체 목록은 /usr/share/doc/valgrind-version/valgrind_manual.pdf에 있는 문서에서 참조하십시오.

4.2.2.3. Massif를 사용하여 힙 및 스택 영역 프로파일링

Massif는 지정된 애플리케이션이 사용하는 힙 영역을 측정합니다. 이는 유용한 공간 및 회계 관리 및 조정을 위해 할당된 추가 공간 모두를 측정합니다. massif는 실행 속도를 향상시키기 위해 애플리케이션의 메모리 사용을 감소시킬 수 있는 방법 및 애플리케이션이 시스템 스왑 공간을 고갈할 가능성을 감소시킬 수 있는 방법을 이해하는데 도움이 됩니다. massif로 애플리케이션을 실행하면 정상 적인 실행 속도 보다 20 배 정도 느려집니다.
애플리케이션에서 massif를 실행하려면 다음 명령을 수행합니다:
# valgrind --tool=massif application
다음 옵션을 사용하여 특정 문제에서 massif 출력에 중점을 두도록 할 수 있습니다.
--heap
massif가 힙 프로파일링을 수행할 지에 대한 여부를 지정합니다. 기본값은 --heap=yes입니다. 힙 프로파일링은 --heap=no로 설정하여 비활성화할 수 있습니다.
--heap-admin
힙 프로파일링을 활성화할 때 관리에 사용할 블록 당 바이트 수를 지정합니다. 기본값은 8 바이트입니다.
--stacks
massif가 스택 프로파일링을 수행할 지에 대한 여부를 지정합니다. 스택 프로파일링을 통해 massif 동작이 현저하게 느려질 수 있으므로 기본값은 --stack=no입니다. 스택 프로파일링을 활성화하려면 이 옵션을 --stack=yes로 설정합니다. 프로파일링할 애플리케이션 관련 스택 크기 변경을 보다 쉽게 표시하기 위해 massif는 메인 스택 시작 크기가 0이라고 가정하고 있다는 점에 유의합니다.
--time-unit
massif가 프로파일링 데이터를 수집하는 간격을 지정합니다. 기본값은 i (명령 실행)입니다. ms (밀리초 단위 또는 실시간) 및 B (힙 및 스택에서 할당 또는 할당 해제된 바이트 수)를 지정할 수 있습니다. 다른 하드웨어에서 재현 가능하므로 단시간 실행 애플리케이션 및 테스트 목적의 경우 할당된 바이트 수를 확인하는 것이 유용합니다.
Massif는 프로파일링 데이터를 massif.out.pid 파일에 출력합니다. 여기서 pid는 지정된 애플리케이션의 프로세스 식별자입니다. ms_print 도구는 이러한 프로파일링 데이터를 그래프화하여 애플리케이션 실행에서 메모리 사용량을 표시하고 메모리 할당 절정에 할당할 사이트에 대한 상세 정보를 표시합니다. massif.out.pid 파일에서 데이터를 그래프화하려면 다음 명령을 실행합니다:
# ms_print massif.out.pid
Massif 옵션의 전체 목록은 /usr/share/doc/valgrind-version/valgrind_manual.pdf에 있는 문서에서 참조하십시오.