본문 바로가기

소프트웨어

맥북 터미널(zsh) 느림 문제

반응형

어느새부턴가 터미널을 열 때마다 상당히 긴 로딩 시간을 거쳐야 했는데요.

이를 해결하기 위해 이것저것 해본 경험을 공유하려고 합니다.

⚡️ 문제 상황

 

위 영상처럼 상당히 긴 시간을 기다려야만 터미널을 사용할 수 있고, 심지어 명령어 실행이 끝날 때마다 또 기다려야했습니다 😅

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

 

반응형