Z shell搭配oh-my-zsh自定义配置已成为众多Linux/Macosx用户的标准terminal配置。

最近遇到在zsh中执行任意命令都变得特别慢(哪怕简单执行ls也要花费肉眼可见的1,2秒钟),这里记录下如何排查Z shell下启用oh-my-zsh的性能问题。

性能问题症状 

突然某天起在终端中执行任意命令,都至少要花费1,2秒(肉眼计数),该命令才会完成执行并退出到终端开始接受新的输入。

我当前主要使用的终端是iTerm2,执行命令后,在终端Tab的title bar上能显式的看到git命令也被执行了。

尝试了其他的shell,比如bash,是没有这个问题。基本断定问题同zsh相关。更多问题描述乃至动画截屏,可以参见这个issue

zsh + oh-my-zsh 性能问题分析 

oh-my-zsh其实就是提供zsh的定制化配置,主要包括Theme主题和各种软件的插件。

oh-my-zsh 插件 

通常oh-my-zsh中内置或三方社区提供的插件是导致性能降低甚至互相冲突的主要原因。排查思路也很简单,通过逐个禁用已加载的插件来测试是否可以解决问题。

用文本编辑器打开当前用户的~/.zshrc配置,找到plugins开头的配置行,例如,

plugins=(
        git
        osx
##      gradle
        brew
##      command-not-found
        github
#       gnu-utils
##      mvn
        python
        pip
#       screen
        vi-mode
        docker
##      docker-compose
        node
##      spring
        mosh
#       httpie
##      sudo
        tmux
##      kubectl
##      helm
        golang
        history
        history-substring-search
        zsh-autosuggestions
        zsh-syntax-highlighting
)

通过行首添加#来禁用oh-my-zsh插件,启动新的终端窗口或tab来验证是否该插件是引起问题的根源。

在我的配置中,出现过因为启用过多插件,导致新建终端需要10来秒钟。但因为创建终端不是一个高频的需求,这个性能通常来说还是可以忍受。

oh-my-zsh 主题 

在我的这个问题中,即使将所有插件都禁用了,命令执行后退出速度还是没有改善,git命令仍然有被执行。这时我尝试更换不同oh-my-zsh内置主题来排查问题。但是使用了包括默认主题robbyrussell,极简主题ys在内的多个主题都无法解决该问题。

最后直接禁止oh-my-zsh使用主题,问题没有了!

然而oh-my-zsh主题是对zsh的极大增强,改善了默认的用户体验,没有主题扩展使用起来会非常不习惯。

小结 

最终试用了另一个社区维护的知名zsh主题Pure,性能问题得到了解决✌️ 同时也满足了主题对zsh输入输出用户体验的增强 😊

希望这里分享的oh-my-zsh性能的调优思路,可以帮助到有类似需要的各位。

将来社区对这个问题如有进一步的反馈,将会做更新。