Doom Emacs를 새로 설치했더니 엄청 버벅거린다아아
오랜만에 Homebrew로 뭔가를 하다가 emacs-plus가 30.2 버전까지 올라온 것을 발견했다. '새 안정 버전이 나오면 설치하지 않고는 못 참는 병'이 있는 만큼 못참고 업그레이드를 저질렀다. 이 짓거리에서 이런 글이 나오게 되리라고는 당시에는 생각도 못 했었다.
문제의 원흉(?)
어쨌든, 늘 Emacs를 업그레이드 할 때마다 해야 하는 고통스러운 일이 있다면 바로 Doom Emacs를 다시 설치하는 일이다. Doom은 Emacs 버전과 일치하는 디렉터리 아래에 각종 확장 스크립트를 설치하고 빌드하는 구조를 가지고 있어서 Emacs 버전을 바꿀 때는 이전 것을 지우고 다시 설치해 줘야 한다.
그래서 Emacs를 새로 설치하고 구버전에 맞게 설치된 Doom Emacs를 지우고 다시 설치했다. 그리고 하는 김에 Doom Emacs의 가장 최근 업데이트까지 적용해 봤다. 그리고 갑자기 눈 앞에 똥이 떨어졌다.
왜 안 좋은 기억은 늘 현실이 되나 모르겠다
Doom Emacs를 새로 설치할 때마다 떠오르는 안 좋은 기억이 있다. 늘상 뭔가(?)가 고장 났었다는 기억이다. 그리고 그 기억은 이번에도 현실이 되었다.
Doom Emacs를 새로 설치한 후 두 가지 문제를 겪었다. 하나는 doom-modeline의 hook을 찾지 못 하는 문제였다. 이건 아마도 뭔가 바뀐 게 아닐까 추측하지만 꼭 필요한 건 아니었기에 그냥 설정을 주석으로 막아두고 넘어갔다. 나중에 시간이 되면 해결해 봐야겠다.
다른 하나가 좀 큰 문제였는데 바로 퍼포먼스 문제였다. 이게 본론인데 좀 심각했다.
- 전반적으로 Emacs의 성능이 저하되어 있었다.
- 파일을 열 때마다 4~5초 가량 먹통이 되었다.
- 커서를 움직이다 멈추면 1~2초 가량 먹통이 되었다.
- 무작위로 잠깐씩 먹통이 되었다.
이 정도면 모든 작업을 방해할 정도로 심각한 문제였다. 오죽하면 Emacs가 신경을 제대로 긁는 그런 물질(?)이 되어있었다.
이거 해결은 가능한 걸까? 당장 어떻게 시작해야 할지 감이 안 온다. 일단 profiler-start 및 profiler-report를 이용해 추적은 해 볼 수 있겠지만 여기서 원인을 찾기란 쉽지 않기도 해서 답을 검색해 보는 것부터 시작해야 할 것 같다.
그런데 문제의 원인은 다른 사람들의 현명함에서 출발했었다니
답이 없어 한참을 퍼포먼스 문제에 관해 정보를 찾던 와중에 새로운 힌트를 하나 얻었다. 최근 Doom Emacs가 설치될 때 완전히 빌드가 되지 않는다는 이야기다. 아아 뭔가 냄새가...?
'혹시 Emacs가 떠 있을 때 뭔가 빌드가 되고 있는 것일까?'
이 추측은 얼마 안 되어 사실로 판명 되었는데 그 증거를 생각보다 쉽게 찾을 수 있었다. Emacs가 동작 중에 스크립트를 빌드하고 있다면 아래 커맨드를 이용해 쉽게 확인할 수 있었다.
M-x list-processes
실제로 버벅엄이 발생하는 상황에서 위의 함수를 실행하니 컴파일링 프로세스가 다수 떠 있는 상황을 확인할 수 있었다.
list-processes 함수를 이용해 컴파일링 프로세스를 확인할 수 있었다.
아마도 Doom Emacs 설치나 업그레이드 도중에 빌드를 처음부터 끝까지 한 번에 다 해버리는 게 시간을 너무 잡아먹으니 차라리 꼭 필요한 것만 빌드해 두고 나머지는 필요할 때 빌드 하는 하는 식으로 시스템을 바꾼 모양이다. 역시나 단점을 적극적으로 해결하는 현명한 컨트리뷰터들이었다.
하지만 그 변화를 모르는 일개 필멸자(?) 입장에선 그저 '퍼포먼스 왜 이따구야?!' 하는 그런 일화였을 뿐이다.
그래서 어떻게 해결할 수 있을까?
결국 답은 이거다.
그냥 빌드가 끝날 때까지 기다리면 된다.
Emacs는 elisp 코드를 빌드하는 게 꽤나 오래 걸린다. 그래서 끈기를 가지고 기다려야만 했다. 뭐하다면 잠깐 커피 타임을 가지거나 유튜브에서 영상 한두편을 보고 오는 것도 좋을 지도 모르겠다. 맥북이 이륙한다 아니 터진다 아아.
어쨌든 Doom Emacs의 빌드 시스템은 증분형이기 때문에 컴파일 되지 않은 코드를 로드하려 할 때마다 빌드를 한다. 따라서 새로 설치한지 얼마 되지 않았다면 버벅임이 자주 느껴지겠지만 조금은 참고 기다려야 할 것 같다.
확신은 없지만 빌드가 조금은 더 빨리 끝나길 원한다면 아래 커맨드를 한번 시험해 보자.
$ doom sync --rebuild
개인적으론 이 빌드를 한 후 다시 Emacs가 느려졌... 응? 뭐지? 왜 또 빌드를 하지? 이상하네? 사실 -u 옵션을 넣어서 싱크를 한번 했더니 패키지들이 온통 업데이트되면서 다시 빌드를 하는 촌극이 또 벌어졌었다는 건 비밀이다.
어쨌거나 이걸로 해결이 더 빨리 되면 좋겠지만 개인적으론 그냥 기다리는 게 더 나은 것 같다. 이 오래된 맥북으론 빌드가 너무 오래 걸리니 차라리 느려도 뭔가 하면서 기다리는 게 나으니 말이다.
마무리
지금은 자주 하던 작업에서 버벅이던 현상들이 완전히 사라졌다. 아무래도 필요한 왠만한 모듈의 빌드는 다 끝난 모양이다.
어쨌든 덕분에 퍼포먼스 문제를 겪을 때 문제를 확인할 중요한 커맨드를 또하나 알게 되었다. profiler와 함께 list-processes는 잘 기억해 둬야 할 것 같다.
결과적으로 참 어이없을 정도로 무의미한 글이 나온 것 같다. 하지만 '기다려라'는 것도 어찌보면 중요한 지침일 수도 있으니 완전 무의미한 것은 아니...길 빌 뿐이다.