Oh My Zsh는 불필요한 부하를 추가함

4 weeks ago 9

  • Oh My Zsh(OMZ) 는 여전히 널리 추천되지만, 셸 시작 시간을 느리게 만드는 불필요한 스크립트 부하를 초래함
  • OMZ는 셸 스크립트로 작성되어 새 터미널 탭을 열 때마다 모든 스크립트를 해석해야 하며, 기본 설정만으로도 약 0.38초의 지연이 발생
  • 단순한 Zsh 최소 설정Starship 프롬프트, fzf 기반 히스토리 검색을 사용하면 시작 시간을 0.07초로 단축 가능
  • Starship은 하나의 바이너리로 프롬프트를 구성해, 기존 OMZ의 git·가상환경·언어별 플러그인을 대체함
  • 복잡한 플러그인보다 필요한 기능만 직접 추가하는 경량화된 셸 구성이 효율적임

Oh My Zsh의 성능 문제

  • Oh My Zsh(OMZ) 는 여전히 많이 사용되지만, 불필요한 부하(bloat) 로 인해 셸 시작 속도를 저하시킴
    • OMZ는 셸 스크립트로 구성되어 새 터미널 탭을 열 때마다 모든 스크립트를 해석해야 함
    • 기본 플러그인(git, zsh-autosuggestions, zsh-autocomplete)을 포함한 설정에서 /usr/bin/time -f "%e seconds" zsh -i -c exit 실행 결과 0.38초 소요
  • git 리포지토리 폴더에서 새 탭을 열면 체감상 약 1초의 지연이 발생
  • OMZ는 주기적으로 업데이트를 확인하며, 이 과정이 몇 초의 추가 지연을 유발
  • 셸 설정의 잦은 업데이트는 불필요하며, 필요한 기능만 직접 추가하는 단순한 구성이 권장됨

최소 Zsh 설정

  • 제안된 최소 Zsh 설정은 다음과 같음 export HISTSIZE=1000000000 export SAVEHIST=$HISTSIZE setopt EXTENDED_HISTORY setopt autocd autoload -U compinit; compinit
    • HISTSIZE와 SAVEHIST는 명령어 히스토리 크기 지정
    • EXTENDED_HISTORY는 히스토리에 타임스탬프 추가
    • autocd는 cd 명령 없이 디렉터리 이동 가능
    • compinit은 자동 완성 시스템 초기화
  • 이 설정만으로도 완성 기능이 포함된 기본적인 셸 환경 제공

프롬프트 커스터마이징

  • 프롬프트는 Starship을 사용
    • Starship은 하나의 바이너리로 구성된 빠르고 최소한의 프롬프트
    • 기존 OMZ의 플러그인 및 테마를 대체하며, git·가상환경·언어별 상태를 표시
  • Starship 설정 예시에서는 AWS, GCP, Azure, NodeJS 등 클라우드 관련 표시를 비활성화해 시각적 잡음을 줄임
  • Python과 Rust 프로젝트에서 각각의 언어가 프롬프트에 강조 표시되며, 명령 실행 시간도 표시
  • .zshrc에 다음 한 줄을 추가해 활성화 eval "$(starship init zsh)"

히스토리 검색

  • 일반적으로 사용되는 zsh-autosuggestions 플러그인은 입력 중 제안이 표시되어 주의를 분산시킬 수 있음
  • 대신 fzf를 Ctrl+R에 바인딩해 대화형 퍼지 검색(fuzzy search) 으로 히스토리를 탐색 source <(fzf --zsh)

성능 개선 결과

  • 위 설정 적용 후 셸 시작 시간은 다음과 같음 ❯ /usr/bin/time -f "%e seconds" zsh -i -c exit 0.07 seconds
  • OMZ 대비 약 5배 이상 빠른 시작 속도 확보

추가 팁

  • Vim 사용자는 Zsh에서 Vim 모드를 활성화해 명령 편집 속도를 향상 가능 set -o vi bindkey -v '^?' backward-delete-char
    • zle은 기본적으로 Emacs 키 바인딩을 사용하므로, 이 설정으로 Vim 방식 입력 지원

결론 및 사용 사례

  • OMZ에서 전환한 후 며칠 만에 새로운 워크플로에 적응
  • 필요한 플러그인은 직접 수동 로드 가능
  • 다수의 탭을 여는 이유는 tmux와 터미널 기반 편집기(helix) 를 함께 사용하기 때문
    • tmux에서 lazygit과 yazi 파일 관리자를 팝업 형태로 실행
    • 코드 실행 및 테스트 출력을 위한 임시 분할 창을 사용, 각각이 별도 셸 세션으로 동작

댓글 요약

  • 일부 사용자는 OMZ의 시작 시간이 0.03초 수준으로 충분히 빠르다고 주장
  • 작성자는 zsh-autocomplete 플러그인이 속도를 저하시킨다고 지적
  • zsh-bench 결과에서 OMZ의 첫 프롬프트 지연 603ms, 단순 Zsh 설정은 103ms로 측정됨
  • Starship은 OMZ의 프롬프트 관련 기능을 단일 도구로 대체
  • 다른 사용자들은 Zimfw, Atuin, 직접 작성한 bash 프롬프트 등 대안을 언급

Read Entire Article