JDK 성능 400배 향상 비결은?

by DD
3개월 전
조회수 0

JDK 8210452 버그 수정으로 스레드 사용자 시간 측정 성능 400배 향상

기존 `read proc` 방식의 비효율성을 제거하고 `clock gettime`으로 교체하여 성능 개선

40줄 미만의 코드로 수백 배의 성능 향상을 달성한 사례를 분석함

기존 스레드 시간 측정 방식의 비효율성

영상에 따르면, 기존 JDK 코드에서는 스레드 사용자 시간을 측정하기 위해 `/proc` 파일 시스템을 읽고 파싱하는 복잡한 과정을 거쳤다. 이 방식은 파일 열기, 데이터 버퍼링, 역 문자열 검색, 숫자 변환 등 여러 단계의 오버헤드를 포함하여, 실제 시간 측정보다 90% 이상의 시간을 비효율적인 작업에 소모했다. 특히, `scan F` 함수 호출이 전체 시간의 3.9%에 불과했던 점은 이러한 비효율성을 명확히 보여준다.

성능 개선을 위한 `clock gettime` 도입

이번 변경은 기존의 복잡한 파일 I/O 및 문자열 처리 방식을 제거하고, `clock gettime` 함수를 직접 호출하는 방식으로 전환했다. 이 새로운 구현은 단 40줄 미만의 코드로 스레드 시간 측정을 가능하게 하며, 불필요한 오버헤드를 제거하여 성능을 400배 이상 향상시켰다. 이는 시스템 콜(System Call) 최적화의 중요성을 보여주는 사례다.

성능 병목 분석: 플레임 그래프 활용

발표자는 성능 병목 현상을 시각적으로 분석하기 위해 플레임 그래프(Flame Graph)를 활용했다. 기존 코드에서는 파일 관련 작업이 전체 실행 시간의 상당 부분을 차지했으나, 개선 후에는 대부분의 시간이 거의 발생하지 않는 것으로 나타났다. 플레임 그래프는 함수 호출 비율을 직관적으로 보여주어, 어느 부분이 성능 저하의 원인인지 명확히 파악하는 데 도움을 준다.

2018년 버그 수정의 의의

이번 성능 개선은 2018년에 발견된 JDK 버그(JDK-8210452)를 해결한 결과다. 해당 버그는 스레드 사용자 시간 측정 방식이 CPU 시간 측정 방식보다 최대 400배 느린 문제를 야기했다. 이처럼 오래된 버그가 최근에야 수정되었다는 점은, 자발적인 코드 감사 및 최적화 노력이 시스템 전반의 성능 향상에 얼마나 중요한지를 시사한다.

Just 40 lines of code