크로미움과 V8 프로파일링
V8의 CPU & 힙 프로파일러는 V8 셸에서 사용하기 간단하지만, 크로미움에서는 이를 사용하는 방법이 다소 혼란스러울 수 있습니다. 이 페이지는 이에 대한 도움을 제공합니다.
왜 V8의 프로파일러를 크로미움에서 사용하는 것이 V8 셸에서 사용하는 것과 다른가요?
크로미움은 V8 셸과 달리 복잡한 애플리케이션입니다. 다음은 프로파일러 사용에 영향을 미치는 크로미움의 특징입니다:
- 각 렌더러는 별도의 프로세스입니다(실제로는 모든 렌더러가 그런 것은 아니지만 여기서는 이 세부사항을 생략합니다), 따라서 동일한 로그 파일을 공유할 수 없습니다;
- 렌더러 프로세스를 둘러싼 샌드박스는 디스크에 쓰는 것을 방지합니다;
- 개발자 도구는 자체 용도로 프로파일러를 구성합니다;
- V8의 로깅 코드는 로깅 상태 확인을 단순화하기 위해 일부 최적화를 포함합니다.
CPU 프로파일을 얻기 위해 크로미움을 실행하는 방법은?
프로세스 시작 시점부터 CPU 프로파일을 얻기 위해 크로미움을 실행하는 방법은 다음과 같습니다:
./Chromium --no-sandbox --user-data-dir=`mktemp -d` --incognito --js-flags='--prof'
이로 인해 개발자 도구에서 프로파일을 확인할 수 없음을 유의하세요. 모든 데이터는 개발자 도구가 아니라 파일에 기록됩니다.
플래그 설명
--no-sandbox
는 렌더러 샌드박스를 비활성화하여 크롬이 로그 파일에 쓸 수 있도록 합니다.
--user-data-dir
은 새로운 프로파일을 생성하는 데 사용됩니다. 이는 캐시 및 설치된 확장 프로그램으로 인한 잠재적인 부작용을 방지하는 데 유용합니다(선택 사항).
--incognito
는 결과의 오염을 더 줄이기 위해 사용됩니다(선택 사항).
--js-flags
는 V8에 전달되는 플래그를 포함합니다:
--logfile=%t.log
는 로그 파일의 이름 패턴을 지정합니다.%t
는 밀리초 단위의 현재 시간으로 확장되며, 각 프로세스마다 고유한 로그 파일을 받습니다. 원한다면 접두사 및 접미사를 사용할 수 있습니다. 예:prefix-%t-suffix.log
. 기본적으로 각 아이솔레이트는 별도의 로그 파일을 갖습니다.--prof
는 V8이 통계적 프로파일링 정보를 로그 파일에 기록하도록 지시합니다.
안드로이드
안드로이드의 크롬은 프로파일링을 약간 더 복잡하게 만드는 고유한 특성을 가지고 있습니다.
- 명령줄은 크롬을 디바이스에서 시작하기 전에
adb
를 통해 작성해야 합니다. 그 결과, 명령줄의 따옴표가 손실되기도 하며, 공백과 따옴표를 사용하기보다는--js-flags
내의 인수를 쉼표로 구분하는 것이 좋습니다. - 로그 파일 경로는 안드로이드 파일 시스템에서 기록 가능한 절대 경로로 지정해야 합니다.
- 안드로이드에서 렌더러 프로세스에 사용되는 샌드박스화는
--no-sandbox
를 사용하더라도 렌더러 프로세스가 파일 시스템에 기록할 수 없게 하므로, 렌더러를 브라우저 프로세스와 동일한 프로세스에서 실행하기 위해--single-process
를 전달해야 합니다. .so
파일은 크롬 APK에 포함되어 있어 심볼 변환에서 APK 메모리 주소를 빌드되지 않은.so
파일로 변환해야 합니다.
다음 명령은 안드로이드에서 프로파일링을 활성화합니다:
./build/android/adb_chrome_public_command_line --no-sandbox --single-process --js-flags='--logfile=/storage/emulated/0/Download/%t.log,--prof'
<안드로이드 디바이스에서 크롬 종료 후 다시 실행>
adb pull /storage/emulated/0/Download/<logfile>
./src/v8/tools/linux-tick-processor --apk-embedded-library=out/Release/lib.unstripped/libchrome.so --preprocess <logfile>
메모
윈도우에서, chrome.dll
에 대한 .MAP
파일 생성을 활성화하고, chrome.exe
에 대해서는 활성화하지 마십시오.