220 likes | 696 Vues
2003 Fall. GPROF 으로 프로파일링 하기. 주 홍 택 컴퓨터공학과 계명대학교. 도입 . 프로그램 실행 시간이 적정한가 ? 프로그램 실행 시간을 측정하는 방법 ? 수행 시간 단축을 위해서 어느 곳을 개선 해야 하는가 ? 프로파일링 프로그램의 동작를 기록하여 분석하여 보여 주는 도구. 단순 프로그램 성능 측정. 총 수행 시간 CPU 시간 입출력 수행 시간 루틴 또는 코드 세그먼트 호출 횟수 및 시간 시간 측정 명령어 사용 프로파일링에 걸리는 프로그램 성능 영향 없음
E N D
2003 Fall GPROF으로 프로파일링 하기 주 홍 택 컴퓨터공학과 계명대학교
도입 • 프로그램 실행 시간이 적정한가? • 프로그램 실행 시간을 측정하는 방법? • 수행 시간 단축을 위해서 어느 곳을 개선 해야 하는가? 프로파일링 • 프로그램의 동작를 기록하여 분석하여 보여 주는 도구
단순 프로그램 성능 측정 • 총 수행 시간 • CPU 시간 • 입출력 수행 시간 • 루틴 또는 코드 세그먼트 호출 횟수 및 시간 • 시간 측정 명령어 사용 • 프로파일링에 걸리는 프로그램 성능 영향 없음 • 모든 실행 가능한 프로그램에 적용 가능 • 간간한 분석 결과만 제공
시간 측정 명령어 • 쉘 명령어 $time analyzer inputdata outputdata 22.3 real 7.1 user 4.5 sys • Bash 쉘 명령어인 time 이용 • Time 명령어는 anlayzer 프로그램을 수행하고 시간측정 결과를 출력 • 전체 수행 시간(CPU) 22.3초이고 사용자 공간에서 수행 시간은 7.1초 그리고 시스템 콜을 수행(시스템 시간)하는데 4.5초임을 표시 • 시스템 시간에는 입출력 및 프로세스 대기 시간 포함 • Unix 명령어 $ /bin/time analyzer inputdata outputdata 9.0u 6.7s 0:30 18% 23+24k 285+148io 625pf+0w • 사용자 시간, 시스템 시간, 총 수행 시간, CPU 사용 시간 비욜, 공유 메모리 사용량, 입출력 시간 그리고 page fault와 swap 횟수 수행시간이 만족스럽지 못하다면…
gprof 소개 • 함수 단위(줄 단위)로 수행 시간을 분석하여 보고서를 만들어 줌 • 어떤 함수가 전체 수행 시간의 대부분을 사용하는지 알 수 있음 • 많은 수행 시간을 갖는 함수의 실행시간을 단축함 • 불필요한 함수 호출을 줄일 수 있음 • 다음 3단계를 거처서 성능 측정 • 프로파일링을 위한 프로그램 컴파일 • 프로파일 데이터 생성을 위한 프로그램 실행 • 프로파일 데이터 분석을 위한 gprof 실행 • 두 가지 데이터 분석 유형 • 평면 프로파일 • 호출 그래프 프로파일
프로파일링 프로그램 컴파일 • gcc 옵션으로 –pg 사용 • 컴파일시에는 프로파일링에 필요한 코드를 오브젝트 코드에 삽입 $ gcc –g –c myprog.c -pg • 링크시에는 프로파일링에 필요한 라이브러리와 링크 $ ld –o myprog /usr/lib/gcrt0.o myprog.o -lc_p • 링크와 컴파일 동시에하려면 $ gcc –o myprog myprog.c –g –pg • 줄 단위로 프로파일링시 –g 옵션 사용 • gcc 옵션 중 –a 을 같이 사용하면 블록 수행횟수 측정 가능
프로파일링 데이터 생성 • 프로파일링 데이터 생성을 위하여 프로그램을 수행함 • 다소 수행 시간이 늦어짐 • 프로그램이 프로파일 데이터를 수집하고 기록하는 시간 • 프로그램의 입력 및 출력에 프로그램의 수행에 많은 영향을 미침 • 프로파일링 데이터는 gmon.out 이라는 파일에 기록함 • 데이터 기록은 반드시 main 함수가 정상적으로 종료되거나 exit 함수에 의하여 종료되어야 함
프로파일링 데이터 분석 • gprof 명령어 사용으로 분석함 • 명령어 형식 • $ gprof optins [exe-file] [prof-files] [> outfile] • 옵션은 출력의 형식 지정, 분석 형태, 심볼 규정을 위한 옵션이 있음 • 실행 파일이 없으면 a.out 사용 • 프로파일링 데이터 파일이 없으면 gmon.out 사용 • 여러 개 프로파일링 데이터 파일이 주어지면 총합을 계산 함
gprof 중요 옵션(1) • 출력 형식 관련 옵션 • 옵션 –A • 소스 코드에 분석 결과를 삽입하여 보여 줌 • 옵션 –C symspec • 지정된 심볼만 함수 분석에 사용함 • 옵션 –J symspec • 지정된 심볼만 소스 코드에 분석 결과를 삽입함 • 옵션 –p symspec • 평면 프로파일 생성, symspec 지정시 지정된 심볼만 생성 • 옵션 –q symspec • 호출 그래프 프로파일 생성, symspec 지정시 지정된 심볼만 생성 * 책의 내용은 오래된 옵션으로 사용 안 함
gprof 중요 옵션(2) • 분석 옵션들 • 옵션 –a • static으로 선언된 함수에 대하여 분석을 하지 않음 • 옵션 –c • 프로파일링 옵션으로 컴파일 되지 않은 함수에 대하여 짐작하여 호출관계를 추정하여 분석함 • 옵션 –l • 줄 단위 프로파일링을 실시 함 • 옵션 –s • 프로파일링 데이터 파일들을 읽어서 gnom.sum에 합산하여 기록함
심볼 규격( symspec ) • 심볼 규격을 사용하여 특정 함수나 파일을 분석에서 제외하거나 포함시킬 수 있음 • 일반적인 심볼은 함수 이름으로 간주함 • 점(.)을 포함한 모든 이름은 파일로 간주함 • 만약 파일이름에 점이 포함되어 있지 않으면 마지막에 콜론(:)을 삽입함 • 특정 파일의 특정 함수는 콜론으로 분리하여 지정함 • 숫자는 파일의 줄을 의미함
프로파일링 데이터 분석 • 두가지 분석 유형 • 평면 프로파일 (flat profile) • 호출 그래프 프로파일 (call graph profile) • 평면 프로파일 • 함수마다 총 수행 시간, 평균 수행 시간 등을 분석함 • 함수 사이의 호출 관계는 없음 • 옵션 –z와 -c를 사용하면 호출되지 않은 함수를 찾는데 도움을 줌(프로그램 코드 사이즈 줄이기) • 호출 그래프 프로파일 • 각 함수의 호출 관계에 따라서 수행 시간을 분석함 • 평면 프로파일링 보다 자세한 분석이 가능함 • 일반적으로 평면 프로파일링을 먼저하고 호출 그래프 프로파일링을 수행함
평면 프로파일링 출력 분석 • 함수 수행 시간(self seconds), 호출된 횟 수(calls), 함수 이름(name) 순으로 정렬되어 있음 • 함수 mcount와 profil은 프로파일링을 위함 함수 임 • 분석 테이블 위에 프로파일링 데이터 수집을 위한 데이터 수집 주기를 보여 줌 • 수집 주기 보다 작은 시간 단위는 모두 0으로 표시됨 ( 짧은 수행 시간에 대하여 부 정확성을 인정 해야 함) • 총 수행시간은 합산 수행 시간 열의 마지막에 표시됨
평면 프로파일링 출력 분석 • % time • 함수에서 사용한 시간의 백분율 • Self second • 함수의 총 수행 시간 • Calls • 함수가 호출된 총 횟수 • Self ms/call • 호출 당 사용한 시간 • 다른 함수 호출에 의하여 사용된 시간 포함하지 않음 • Total ms/call • 호출 당 사용한 시간 • 다른 함수 호출에서 사용한 시간 포함 • Name • 함수의 이름
성능 개선을 위한 조언 • 가장 많은 시간을 사용하는 함수를 개선 • 함수에 쓰인 알고리즘을 개선 • 함수 호출 횟수를 줄임 • 함수 호출을 inline 함수로 대치
호출 그래프 프로파일링 분석 • 각 함수를 호출한 함수와 함수가 호출한 함수 관점에서 각 함수의 수행 시간을 분석함 • 어떤 함수가 특정 함수를 호출하였는지 알 수 있으며 수행 시간도 알 수 있음 • 특정 함수가 어떤 함수를 호출하여 사용하였는지 알 수 있으며 수행 시간도 알 수 있음
호출 그래프 프로파일링 분석 • 각 함수에 대하여 한 줄을 대쉬(-)로 채워서 분석된 결과를 제시 함 • 함수의 순서는 각 함수에서 사용한 시간(호출한 함수의 실행 시간 포함)에 대하여 정렬되어 있음 • 각 항목에는 분석 대상 함수의 위에는 분석 대상 함수를 호출한 함수 그리고 아래에는 호출된 함수가 나타남
호출 그래프 프로파일링 분석 • 분석 대상 함수 • Index: 각 함수 마다 유일하게 지정된 번호 • % time: 함수 수행 시간 중 차지하는 비율 • Self: 대상 함수의 순수 수행 시간 • Children: 다른 함수를 호출하는데 사용한 시간 • Called: 총 함수 호출 횟수와 분석 함수에 의한 호출 횟 수 표시순환 함수 호출은 + 표시 • Name: 함수의 이름과 인덱스
호출 그래프 해석하는 팁 • Self가 children 보다 큰 것이 프로그램 개선의 대상이 되는 경우가 많이 있음 • Children이 크다면 호출 횟수를 줄이는 방법을 알아 봄 • 이 때 called 값을 활용하여 주로 호출하는 함수를 알아냄 • 호출 그래프는 성능측정 뿐만 아니라 프로그램을 이해하는데 도움을 줌 • 좀더 세밀한 성능 분석을 위해서는 줄 단위 프로파일링 이나 소스 파일에 분석 정보를 추가하는 방법도 사용함