정보기술 · 인공지능 · 정보보안 ·
Ghostty 터미널 에뮬레이터, 37GB 메모리 누수 버그 수정...Claude Code 사용 증가로 문제 대규모 노출
비표준 페이지 재사용 시 메모리 해제 누락이 원인, 3월 1.3 버전에 패치 포함
[한국정보기술신문] 오픈소스 터미널 에뮬레이터 Ghostty의 개발자 Mitchell 개발자가 10일 대규모 메모리 누수 문제를 발견하고 수정했다고 밝혔다. 일부 사용자는 10일간 사용 후 최대 37GB의 메모리를 소비하는 현상을 보고했으며, 해당 버그는 최소 Ghostty 1.0 버전부터 존재했던 것으로 확인됐다.
이번 메모리 누수는 Ghostty의 터미널 메모리 관리 구조인 PageList에서 발생했다. PageList는 터미널 콘텐츠를 저장하는 이중 연결 리스트로, 표준 크기의 메모리 페이지를 풀에서 재사용하는 방식으로 작동한다. 이모지나 하이퍼링크가 많은 경우 표준 크기보다 큰 비표준 페이지를 직접 mmap으로 할당하게 된다.
스크롤백 최적화 과정의 설계 결함
문제는 스크롤백 버퍼가 한계에 도달했을 때 가장 오래된 페이지를 재사용하는 최적화 과정에서 발생했다. Ghostty는 성능 향상을 위해 메모리 할당 없이 포인터 조작만으로 오래된 페이지를 새로운 페이지로 전환하는 방식을 사용한다.
그러나 비표준 크기의 페이지를 재사용할 때 메타데이터만 표준 크기로 재설정하고 실제 메모리 할당은 그대로 두는 버그가 있었다. 이후 페이지를 해제할 때 메타데이터가 표준 크기로 표시되어 있어 풀로 반환된 것으로 간주하고 munmap을 호출하지 않아 메모리 누수가 발생했다.
클로드 코드 사용 증가로 문제 가시화
이 버그는 설계상 비표준 페이지가 드물게 사용되기 때문에 오랫동안 발견되지 않았다. 하지만 최근 클로드 코드 CLI 도구의 사용이 증가하면서 상황이 달라졌다. 클로드 코드는 다중 코드포인트 그래픽 출력을 많이 생성해 비표준 페이지를 정기적으로 사용하게 만들고, 대량의 스크롤백 출력을 생성해 버그를 대규모로 촉발시켰다.
개발자는 이 버그가 클로드 코드의 잘못이 아니라 Ghostty의 기존 버그를 드러낸 것일 뿐이라고 명확히 했다. 수정 방안은 스크롤백 정리 중 비표준 페이지를 만나면 재사용하지 않고 적절히 파괴한 후 풀에서 새로운 표준 크기 페이지를 할당하는 것이다.
메모리 태깅으로 누수 추적
수정 과정에서 개발자는 macOS의 Mach 커널이 제공하는 가상 메모리 태그 기능을 추가했다. 이를 통해 PageList 메모리 할당에 특정 식별자를 부여해 디버깅 도구에서 쉽게 추적할 수 있게 됐다. 이 기능 덕분에 누수를 PageList와 연결하고 수정이 제대로 작동하는지 검증할 수 있었다.
Ghostty 프로젝트는 메모리 누수 방지를 위해 디버그 빌드와 단위 테스트에서 누수 탐지 할당자를 사용하고, 모든 커밋마다 Valgrind로 전체 테스트 스위트를 실행한다. 그러나 이번 누수는 매우 특정한 조건에서만 발생해 기존 테스트로 잡아내지 못했다. 수정 패치에는 향후 재발을 방지하기 위한 재현 테스트가 포함됐다.
수정 사항은 현재 nightly 릴리스에서 사용 가능하며, 3월 출시 예정인 Ghostty 1.3 정식 버전에 포함될 예정이다. 개발자는 재현 가능한 테스트를 제공한 사용자 grishy와 상세한 진단 정보를 제공한 커뮤니티에 감사를 표했다.
한국정보기술신문 정보기술분과 김지원 기자 news@kitpa.org