Show Table of Contents
4.2. 성능 관련 문제 모니터링 및 진단
Red Hat Enterprise Linux 7에는 시스템 성능을 모니터링하고 시스템 메모리 관련 성능 문제를 진단하는데 유용한 여러 도구가 있습니다. 다음 부분에서는 메모리 관련 성능 문제를 모니터링하고 진단하기 위해 사용 가능한 도구 및 사용 방법에 대해 설명합니다.
4.2.1. vmstat로 메모리 사용량 모니터링
Vmstat는 procps-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에 있는 문서에서 참조하십시오.

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.