ssh 접속이 오래 걸린다? 문제는 zsh/exa 에 있었다.

언젠가부터 ssh 접속을 하면, 접속 자체는 빨리 이뤄지지만 정작 프롬프트가 떨어지기까지 꽤 오랜 시간이 걸리기 시작했다. 대략 수초 정도 걸리는 듯 한데, 그냥 그렇게 내버려두고 쓰고 있다가 오늘 날을 잡고 원인을 분석해보기 시작했다.

먼저, ssh 접속 자체에 문제가 있을 수도 있다. 우회책은 크게 두가지(GSSAPIAuthentication, UseDNS)인 모양인데.. 난 이것들과는 별 관계가 없었다.
이런 저런 삽질을 하다가, 문제 원인이 exa 에 있음을 찾을 수 있었다. 그래, 그 때부터였구나…
사실, exa 자체에 문제가 있다기 보다는, exa 가 제공하는 자동완성(completion) 기능을 내가 잘 적용하지 못했던 데 원인이 있다고 봐야겠다.

단지 exa 만이 아니고, zsh, oh-my-zsh 등을 쓸 때 이렇게 반응이 느려지는 문제가 사람들을 많이 괴롭게 하는 모양이다. 이 문제를 해결하려고 노력한, 이런 저런 글들을 많이 찾을 수 있었다. 그러다가, 결국 내 문제의 원흉(?)이 된 compinit 을 발견하게 되었는데.. 연결된 글에 있는 해법은, 내 상황에선 제대로 적용되지 않았다. (이유는 모르겠다.)

zsh 작업 시간 측정

일련의 삽질 끝에 알아낸 방법인데, zmodload zsh/zprofzprof 를 사용하면 zsh 시작 시 작업 시간을 자세히 볼 수 있다. 이 결과가 compinit 이었다.

exa?

이전에 쓴 글에서, exa 가 제공하는 autocompletion 을 이용하려면, 디렉토리를 만들어 fpath 에 추가하고, 다음 명령을 .zshrc 에 넣는 방법을 택했었다.

fpath+=("$HOME/.zfunc")
autoload -Uz compinit
compinit

compinit 은 .zcompdump 를 만드는 명령인데, 이게 매번 실행되다 보니 그 시간만큼 기다려야만 했다.
이를 해결하기 위해서 .zcompdump 가 생성된 시간을 확인한 뒤 작업하는 방식을 택했지만, 그도 제대로 작동하질 않았다.
oh my zsh 문서를 보니, compinit 은 자동으로 실행된다고 하므로, 저 명령을 굳이 .zshrc 에 넣어줄 필요는 없을 듯 하다.

어찌됐든, 이 난관을 헤쳐나갈 방법은 두가지.
하나는 전역에 넣는 방법, 또 하나는 정말 코끼리 뒷걸음질 치다 쥐잡은 격이지만, ~/.oh-my-zsh/completions 에 넣 는 법. 이건 oh-my-zsh 를 쓸 때에만 유효하다.
다만, 이 디렉토리는 기본 생성돼 있지 않다. fpath (echo $fpath 로 확인)엔 설정돼 있는데, 디렉토리는 없다. 따라서 만들어줘야만 한다.

# 전역
sudo cp _exa /usr/local/share/zsh/site-functions

# 사용자
mkdir ~/.oh-my-zsh/completions
cp _exa ~/.oh-my-zsh/completions

zsh 재시작

보통, Shell 을 재시작하려면 source ~/.zshrc 를 사용하라곤 한다.
그런데, oh my zsh 문서에선 이건 좋은 선택이 아니라고 한다. 터미널을 다시 열거나, 아니면 exec zsh 로 재시작하는게 좋다고 한다.


글을 마치고 보니 ssh 문제가 아니라 exa 해법이 되고 말았으나..

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.