어느새부턴가 터미널을 열 때마다 상당히 긴 로딩 시간을 거쳐야 했는데요.
이를 해결하기 위해 이것저것 해본 경험을 공유하려고 합니다.
⚡️ 문제 상황
위 영상처럼 상당히 긴 시간을 기다려야만 터미널을 사용할 수 있고, 심지어 명령어 실행이 끝날 때마다 또 기다려야했습니다 😅
zsh/zprof 로 프로파일링
먼저, ~/.zprofile
맨 위에 아래 내용을 추가합니다.
zmodload zsh/zprof
터미널을 재시작한 뒤 $ zprof
명령어를 실행하니, 아래와 같은 결과가 나왔습니다.
$ zprof
num calls time self name
-----------------------------------------------------------------------------------
1) 1 32358.54 32358.54 74.85% 13845.87 13845.87 32.03% nvm_auto
2) 2 10802.07 5401.03 24.99% 10802.07 5401.03 24.99% _jenv_export_hook
3) 2 18512.66 9256.33 42.82% 10586.37 5293.18 24.49% nvm
4) 1 7350.17 7350.17 17.00% 6495.28 6495.28 15.02% nvm_ensure_version_installed
분석을 해보니 nvm
, jenv
관련 로딩에 대부분의 시간이 소모되고 있음을 확인했습니다.
🔧 ~/.zprofile 설정
기존 설정 내용은 다음과 같았습니다.
# zsh 로드될때 작동하는 것들의 시간 측정
zmodload zsh/zprof
eval "$(/opt/homebrew/bin/brew shellenv)"
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion
# jenv
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
jenv Lazy Loading 시도
느림의 주요 원인이 jenv
초기화였기에, Lazy Loading을 시도했습니다.
# === 기존 jenv 설정 (주석처리) ===
# export PATH="$HOME/.jenv/bin:$PATH"
# eval "$(jenv init -)"
# === jenv lazy loading - 실제 사용할 때만 로드 ===
jenv() {
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
unset -f jenv
jenv "$@"
}
Lazy Loading 후 프로파일링 결과
$ zprof
num calls time self name
-----------------------------------------------------------------------------------
1) 1 892.69 892.69 95.36% 451.19 451.19 48.20% nvm_auto
2) 2 441.50 220.75 47.16% 268.10 134.05 28.64% nvm
3) 1 158.77 158.77 16.96% 138.84 138.84 14.83% nvm_ensure_version_installed
4) 1 19.93 19.93 2.13% 19.93 19.93 2.13% nvm_is_version_installed
🚀 체감 속도: jenv
를 lazy loading하자 터미널 실행 속도가 매우 빨라졌습니다.
⚠️ Lazy Loading 문제: maximum nested function level reached
그러나 jenv
명령어 실행 시 다음과 같은 오류가 발생했습니다.
$ jenv help
jenv:2: maximum nested function level reached; increase FUNCNEST?
함수 내에서 다시 jenv
를 호출하며 무한 재귀가 발생하고 있었는데요
최종적으로 lazy loading은 포기하고, 기존 설정으로 원복했습니다.
(📌 찾아보니 lazy loading 으로 해결할 수도 있어보이는데요. 저는 시간이 없어서 그냥 다른 방법을 시도했습니다.)
jenv 업그레이드 시도
대신 jenv 자체를 업그레이드해보기로 했습니다.
$ brew update; brew upgrade jenv; brew cleanup
터미널을 재시작한 뒤 프로파일링을 다시 확인했습니다.
업그레이드 후 프로파일링 결과
$ zprof
num calls time self name
-----------------------------------------------------------------------------------
1) 1 734.39 734.39 80.43% 324.43 324.43 35.53% nvm_auto
2) 2 409.96 204.98 44.90% 238.16 119.08 26.08% nvm
3) 2 145.36 72.68 15.92% 145.36 72.68 15.92% _jenv_export_hook
4) 1 155.65 155.65 17.05% 135.41 135.41 14.83% nvm_ensure_version_installed
jenv
의 로딩 속도가 크게 개선된 것을 확인했습니다.
최종 확인: 재부팅 후
마지막으로 재부팅 후에도 문제가 없는지 테스트했습니다.
$ zprof
num calls time self name
-----------------------------------------------------------------------------------
1) 1 784.40 784.40 79.15% 372.83 372.83 37.62% nvm_auto
2) 2 411.57 205.78 41.53% 241.28 120.64 24.35% nvm
3) 2 157.90 78.95 15.93% 157.90 78.95 15.93% _jenv_export_hook
4) 1 154.66 154.66 15.61% 135.80 135.80 13.70% nvm_ensure_version_installed
문제 없습니다~!
📝 마무리
역시 뭔가 잘 안되면 최신 버전으로 업데이트해보는 것도 좋은 방안이 될 수 있을 것 같습니다.
마지막으로 프로파일링을 위해 추가했던 아래 코드도 제거해주었습니다!
# zmodload zsh/zprof
'소프트웨어' 카테고리의 다른 글
Spring Bean 중복 에러 (0) | 2025.03.25 |
---|---|
오픈소스 컨트리뷰션 후기 (0) | 2024.01.14 |
코딩 없이 Next.js 기반 블로그 만들기 (0) | 2023.12.20 |
java.lang.NoClassDefFoundError: com/querydsl/apt/AbstractQuerydslProcessor 에러 해결 (0) | 2023.12.16 |
ChatGPT 장애 (Oops! Our systems are ...) (2) | 2023.11.23 |