perf map 인터페이스의 핵심 원리
-
파일 경로 및 형식: 프로파일러는
/tmp/perf-{PID}.map경로에 위치한 파일을 참조합니다. 여기서 PID는 프로세스 ID를 의미합니다. -
데이터 레코드: 각 줄은
START SIZE symbolname형식을 따릅니다.START: 함수의 시작 메모리 주소 (0x 접두사 없는 16진수)SIZE: 코드의 크기 (16진수)symbolname: 해당 코드 영역에 부여할 함수 또는 심볼의 이름
ZJIT의 구현 사례
ZJIT은 Rust 언어를 사용하여 다음과 같이 구현되었습니다:
-
파일 오픈:
std::fs::OpenOptions를 통해 파일을 생성하거나 기존 파일에 내용을 추가(append)할 수 있도록 설정합니다. -
정보 기록: 함수가 생성될 때마다 해당 함수의 메모리 범위와 이름을
writeln!을 통해 파일에 기록합니다. -
성능 고려: 매번 발생하는 파일 I/O는 성능에 영향을 줄 수 있으므로,
--zjit-perf와 같은 명령행 인자를 사용해 프로파일링이 필요할 때만 기능을 켜도록 설계합니다.
활용 가능한 도구 및 대안
-
samply: macOS와 Linux 모두에서 사용 가능한 강력한 프로파일러로, perf map 인터페이스를 완벽히 지원합니다.
-
perf record: Linux 시스템의 표준 도구로, JIT된 프레임의 이름을 결과물에 포함할 수 있게 됩니다.
-
JIT dump: perf map보다 나중에 등장한 방식으로, 더 복잡한 정보를 담을 수 있는
jitdump파일을 생성한 후perf inject를 사용하는 대안적 인터페이스도 존재합니다.