iTerm2 在升级系统之后,冷启动(开机后第一次启动)的速度异常的慢,需要几十秒才能进入可用状态。之后无论是开新窗口还是退出重进的速度都还挺正常的。
虽然升级系统之前冷启动速度也不快,但并没有慢到这么令人难以忍受。
经过几轮较量,最终恢复了秒级冷启动。将过程和尝试的办法记录如下。
效果最明显的改动:将系统自带的 Apple Git
替换为 Homebrew[1] 中的 Git
:
参考资料:
要解决慢的问题,首先得知道慢在什么地方了。
系统使用的默认 shell 是 zsh[4]。zsh
中有一个性能监控模块 22.35 The zsh/zprof Module[5],可以输出所有函数的调用时间。
在 ~/.zshrc
文件的最前面加上:
最后面加上:
之后每次打开 iTerm2 时,就会看到一个类似下面的统计信息:
统计信息分为两部分:
self
下的第一列。time
和 self
分别有三列)降序排序,单位是毫秒可以看到,耗时排名前几位的:nvm
、conda
、oh my zsh
。
参考资料:
因为只是偶尔需要使用 nvm
切换 node 版本,故在 .zshrc
中添加懒加载脚本,将 nvm
的初始化从每次打开终端延迟到首次使用相关命令时。
.zshrc
中注掉如下内容:
.zshrc
中添加如下内容:
一顿操作之后,除了 zprof
中看不到 nvm 相关函数了,冷启动速度并无太大起色。
参考资料:
之前安装 miniconda[9] 之后,每次进入终端会激活 base
环境,当时只是简单粗暴的在 .zshrc
中添加了一条 conda deactivate
命令,所以在 zprof
中可以看到 __conda_activate
还是执行并且消耗了不少时间。
在 ~/.condarc
中添加如下行取消 conda 的自动激活,并去掉 conda deactive
命令:
再次打开 iTerm2,zprof
中已经没有了 conda 相关的函数,但冷启动速度依然很慢。
参考资料:
一直以为 iTerm2 在使用了 oh my zsh 之后冷启动慢是因为启动的时候会去进行 omz 的自动更新导致的,根据使用的版本,在 .zshrc
中关闭自动更新:
老版本:
新版本:
事实证明,冷启动慢跟这个也没有关系。
参考资料:
过了三招,此时 zprof
的结果中已经没有了什么耗时大户,然而冷启动时间依然慢的令人发指。
iTerm2 冷启动时,标题栏确有出现过 xcode 相关的字样,参照 每个终端命令后触发xcodebuild[12] 中提到的方式接受了 xcodebuild 的许可:
依旧没有什么改变。不过二楼的回复内容,最终引导我走向 Final Round 彻底解决了 iTerm2 冷启动速度慢的问题。
参考资料
[1]
Homebrew: https://brew.sh/
[2]
macOS开机iterm2 + oh my zsh会显示xcodebuild: https://blog.csdn.net/lxyoucan/article/details/116259842
[3]
vi-mode plugin makes zsh painfully slow in OSX Mavericks: https://github.com/ohmyzsh/ohmyzsh/issues/2189
[4]
zsh: https://alphahinex.github.io/2020/12/13/zsh/
[5]
22.35 The zsh/zprof Module: https://zsh.sourceforge.io/Doc/Release/Zsh-Modules.html#The-zsh_002fzprof-Module
[6]
解决zsh启动速度慢的优化方法: https://zhuanlan.zhihu.com/p/68303393
[7]
我就感觉到快 —— zsh 和 oh my zsh 冷启动速度优化: https://blog.skk.moe/post/make-oh-my-zsh-fly/
[8]
How to fix nvm slowing down terminal initialisation: https://www.growingwiththeweb.com/2018/01/slow-nvm-init.html
[9]
miniconda: https://alphahinex.github.io/2024/01/14/jupyter-lab-in-action/
[10]
一打开终端就默认进入conda的base环境,取消方法: https://blog.csdn.net/weixin_43698781/article/details/124154268
[11]
关闭Oh my zsh自动更新: https://juejin.cn/post/6923448225571700750
[12]
每个终端命令后触发xcodebuild: https://qastack.cn/apple/119864/xcodebuild-firing-after-every-terminal-command