iTerm2 在升级系统之后,冷启动(开机后第一次启动)的速度异常的慢,需要几十秒才能进入可用状态。之后无论是开新窗口还是退出重进的速度都还挺正常的。
虽然升级系统之前冷启动速度也不快,但并没有慢到这么令人难以忍受。
经过几轮较量,最终恢复了秒级冷启动。将过程和尝试的办法记录如下。
TL;DR: Final Round —— git
效果最明显的改动:将系统自带的 Apple Git
替换为 Homebrew 中的 Git
:
# 系统自带 Git 版本
$ git --version
git version 2.24.3 (Apple Git-128)
# 使用 Homebrew 安装 git
$ brew install git
$ git --version
git version 2.33.0
参考资料:
Round 0:zprof
要解决慢的问题,首先得知道慢在什么地方了。
系统使用的默认 shell 是 zsh。 zsh
中有一个性能监控模块 22.35 The zsh/zprof Module,可以输出所有函数的调用时间。
在 ~/.zshrc
文件的最前面加上:
zmodload zsh/zprof
最后面加上:
zprof
之后每次打开 iTerm2 时,就会看到一个类似下面的统计信息:
Last login: Sun Mar 17 22:12:06 on console
num calls time self name
-----------------------------------------------------------------------------------
1) 1 752.28 752.28 59.80% 376.78 376.78 29.95% nvm_auto
2) 2 258.53 129.26 20.55% 258.47 129.24 20.55% __conda_activate
3) 2 375.49 187.75 29.85% 228.86 114.43 18.19% nvm
4) 23 114.59 4.98 9.11% 98.89 4.30 7.86% _omz_source
5) 1 105.03 105.03 8.35% 90.79 90.79 7.22% nvm_ensure_version_installed
6) 4 72.13 18.03 5.73% 72.13 18.03 5.73% compaudit
7) 2 110.83 55.41 8.81% 38.70 19.35 3.08% compinit
8) 1 41.04 41.04 3.26% 33.11 33.11 2.63% nvm_die_on_prefix
9) 1 14.23 14.23 1.13% 14.23 14.23 1.13% nvm_is_version_installed
10) 1 11.00 11.00 0.87% 11.00 11.00 0.87% (anon)
11) 1 7.25 7.25 0.58% 7.25 7.25 0.58% nvm_grep
12) 1 16.39 16.39 1.30% 5.39 5.39 0.43% handle_update
13) 1 4.58 4.58 0.36% 4.58 4.58 0.36% test-ls-args
14) 1 3.76 3.76 0.30% 3.76 3.76 0.30% regexp-replace
15) 1 2.95 2.95 0.23% 2.95 2.95 0.23% grep-flags-available
16) 6 2.44 0.41 0.19% 2.44 0.41 0.19% is_plugin
17) 1 1.80 1.80 0.14% 1.80 1.80 0.14% zrecompile
18) 16 1.32 0.08 0.10% 1.32 0.08 0.10% compdef
19) 5 1.28 0.26 0.10% 1.28 0.26 0.10% is-at-least
20) 1 1.14 1.14 0.09% 1.14 1.14 0.09% colors
21) 3 0.71 0.24 0.06% 0.71 0.24 0.06% add-zsh-hook
22) 3 0.68 0.23 0.05% 0.68 0.23 0.05% is_theme
23) 4 7.93 1.98 0.63% 0.68 0.17 0.05% nvm_npmrc_bad_news_bears
24) 1 0.56 0.56 0.04% 0.56 0.56 0.04% nvm_has
25) 1 0.24 0.24 0.02% 0.12 0.12 0.01% complete
26) 2 258.61 129.30 20.56% 0.08 0.04 0.01% conda
27) 2 0.07 0.04 0.01% 0.07 0.04 0.01% env_default
28) 2 0.07 0.03 0.01% 0.07 0.03 0.01% bashcompinit
29) 2 0.06 0.03 0.00% 0.06 0.03 0.00% __conda_hashr
30) 1 752.31 752.31 59.80% 0.04 0.04 0.00% nvm_process_parameters
31) 1 0.01 0.01 0.00% 0.01 0.01 0.00% nvm_is_zsh
-----------------------------------------------------------------------------------
30) 1 752.31 752.31 59.80% 0.04 0.04 0.00% nvm_process_parameters
1/1 752.28 752.28 59.80% 376.78 376.78 nvm_auto [1]
-----------------------------------------------------------------------------------
1/1 752.28 752.28 59.80% 376.78 376.78 nvm_process_parameters [30]
1) 1 752.28 752.28 59.80% 376.78 376.78 29.95% nvm_auto
1/2 375.49 375.49 29.85% 10.23 10.23 nvm [3]
-----------------------------------------------------------------------------------
1/2 375.49 375.49 29.85% 10.23 10.23 nvm_auto [1]
1/2 365.26 365.26 29.04% 218.63 218.63 nvm [3]
3) 2 375.49 187.75 29.85% 228.86 114.43 18.19% nvm
1/1 0.56 0.56 0.04% 0.56 0.56 nvm_has [24]
1/1 41.04 41.04 3.26% 33.11 33.11 nvm_die_on_prefix [8]
1/1 105.03 105.03 8.35% 90.79 90.79 nvm_ensure_version_installed [5]
1/2 365.26 365.26 29.04% 218.63 218.63 nvm [3]
-----------------------------------------------------------------------------------
26) 2 258.61 129.30 20.56% 0.08 0.04 0.01% conda
2/2 258.53 129.26 20.55% 258.47 129.24 __conda_activate [2]
-----------------------------------------------------------------------------------
2/2 258.53 129.26 20.55% 258.47 129.24 conda [26]
2) 2 258.53 129.26 20.55% 258.47 129.24 20.55% __conda_activate
2/2 0.06 0.03 0.00% 0.06 0.03 __conda_hashr [29]
-----------------------------------------------------------------------------------
4) 23 114.59 4.98 9.11% 98.89 4.30 7.86% _omz_source
1/2 0.03 0.03 0.00% 0.03 0.03 bashcompinit [28]
2/2 0.07 0.04 0.01% 0.07 0.04 env_default [27]
3/3 0.71 0.24 0.06% 0.71 0.24 add-zsh-hook [21]
1/1 1.14 1.14 0.09% 1.14 1.14 colors [20]
15/16 1.19 0.08 0.09% 1.19 0.08 compdef [18]
5/5 1.28 0.26 0.10% 1.28 0.26 is-at-least [19]
1/1 2.95 2.95 0.23% 2.95 2.95 grep-flags-available [15]
1/1 3.76 3.76 0.30% 3.76 3.76 regexp-replace [14]
1/1 4.58 4.58 0.36% 4.58 4.58 test-ls-args [13]
-----------------------------------------------------------------------------------
7) 2 110.83 55.41 8.81% 38.70 19.35 3.08% compinit
2/4 72.13 36.06 5.73% 1.23 0.61 compaudit [6]
-----------------------------------------------------------------------------------
1/1 105.03 105.03 8.35% 90.79 90.79 nvm [3]
5) 1 105.03 105.03 8.35% 90.79 90.79 7.22% nvm_ensure_version_installed
1/1 14.23 14.23 1.13% 14.23 14.23 nvm_is_version_installed [9]
-----------------------------------------------------------------------------------
2/4 72.13 36.06 5.73% 1.23 0.61 compinit [7]
2/4 70.90 35.45 5.64% 70.90 35.45 compaudit [6]
6) 4 72.13 18.03 5.73% 72.13 18.03 5.73% compaudit
2/4 70.90 35.45 5.64% 70.90 35.45 compaudit [6]
-----------------------------------------------------------------------------------
1/1 41.04 41.04 3.26% 33.11 33.11 nvm [3]
8) 1 41.04 41.04 3.26% 33.11 33.11 2.63% nvm_die_on_prefix
4/4 7.93 1.98 0.63% 0.68 0.17 nvm_npmrc_bad_news_bears [23]
-----------------------------------------------------------------------------------
12) 1 16.39 16.39 1.30% 5.39 5.39 0.43% handle_update
1/1 11.00 11.00 0.87% 11.00 11.00 (anon) [10]
-----------------------------------------------------------------------------------
1/1 14.23 14.23 1.13% 14.23 14.23 nvm_ensure_version_installed [5]
9) 1 14.23 14.23 1.13% 14.23 14.23 1.13% nvm_is_version_installed
-----------------------------------------------------------------------------------
1/1 11.00 11.00 0.87% 11.00 11.00 handle_update [12]
10) 1 11.00 11.00 0.87% 11.00 11.00 0.87% (anon)
-----------------------------------------------------------------------------------
4/4 7.93 1.98 0.63% 0.68 0.17 nvm_die_on_prefix [8]
23) 4 7.93 1.98 0.63% 0.68 0.17 0.05% nvm_npmrc_bad_news_bears
1/1 7.25 7.25 0.58% 7.25 7.25 nvm_grep [11]
-----------------------------------------------------------------------------------
1/1 7.25 7.25 0.58% 7.25 7.25 nvm_npmrc_bad_news_bears [23]
11) 1 7.25 7.25 0.58% 7.25 7.25 0.58% nvm_grep
-----------------------------------------------------------------------------------
1/1 4.58 4.58 0.36% 4.58 4.58 _omz_source [4]
13) 1 4.58 4.58 0.36% 4.58 4.58 0.36% test-ls-args
-----------------------------------------------------------------------------------
1/1 3.76 3.76 0.30% 3.76 3.76 _omz_source [4]
14) 1 3.76 3.76 0.30% 3.76 3.76 0.30% regexp-replace
-----------------------------------------------------------------------------------
1/1 2.95 2.95 0.23% 2.95 2.95 _omz_source [4]
15) 1 2.95 2.95 0.23% 2.95 2.95 0.23% grep-flags-available
-----------------------------------------------------------------------------------
16) 6 2.44 0.41 0.19% 2.44 0.41 0.19% is_plugin
-----------------------------------------------------------------------------------
17) 1 1.80 1.80 0.14% 1.80 1.80 0.14% zrecompile
-----------------------------------------------------------------------------------
15/16 1.19 0.08 0.09% 1.19 0.08 _omz_source [4]
1/16 0.13 0.13 0.01% 0.13 0.13 complete [25]
18) 16 1.32 0.08 0.10% 1.32 0.08 0.10% compdef
-----------------------------------------------------------------------------------
5/5 1.28 0.26 0.10% 1.28 0.26 _omz_source [4]
19) 5 1.28 0.26 0.10% 1.28 0.26 0.10% is-at-least
-----------------------------------------------------------------------------------
1/1 1.14 1.14 0.09% 1.14 1.14 _omz_source [4]
20) 1 1.14 1.14 0.09% 1.14 1.14 0.09% colors
-----------------------------------------------------------------------------------
3/3 0.71 0.24 0.06% 0.71 0.24 _omz_source [4]
21) 3 0.71 0.24 0.06% 0.71 0.24 0.06% add-zsh-hook
-----------------------------------------------------------------------------------
22) 3 0.68 0.23 0.05% 0.68 0.23 0.05% is_theme
-----------------------------------------------------------------------------------
1/1 0.56 0.56 0.04% 0.56 0.56 nvm [3]
24) 1 0.56 0.56 0.04% 0.56 0.56 0.04% nvm_has
-----------------------------------------------------------------------------------
25) 1 0.24 0.24 0.02% 0.12 0.12 0.01% complete
1/16 0.13 0.13 0.01% 0.13 0.13 compdef [18]
-----------------------------------------------------------------------------------
2/2 0.07 0.04 0.01% 0.07 0.04 _omz_source [4]
27) 2 0.07 0.04 0.01% 0.07 0.04 0.01% env_default
-----------------------------------------------------------------------------------
1/2 0.03 0.03 0.00% 0.03 0.03 _omz_source [4]
28) 2 0.07 0.03 0.01% 0.07 0.03 0.01% bashcompinit
-----------------------------------------------------------------------------------
2/2 0.06 0.03 0.00% 0.06 0.03 __conda_activate [2]
29) 2 0.06 0.03 0.00% 0.06 0.03 0.00% __conda_hashr
-----------------------------------------------------------------------------------
31) 1 0.01 0.01 0.00% 0.01 0.01 0.00% nvm_is_zsh
统计信息分为两部分:
- 概述:按每个函数自身的总耗时(
self
下的第一列。time
和self
分别有三列)降序排序,单位是毫秒 - 详情:列出了每个被调用的函数的详细信息
可以看到,耗时排名前几位的:nvm
、conda
、oh my zsh
。
参考资料:
Round 1:nvm
因为只是偶尔需要使用 nvm
切换 node 版本,故在 .zshrc
中添加懒加载脚本,将 nvm
的初始化从每次打开终端延迟到首次使用相关命令时。
.zshrc
中注掉如下内容:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
.zshrc
中添加如下内容:
# Defer initialization of nvm until nvm, node or a node-dependent command is
# run. Ensure this block is only run once if .zshrc gets sourced multiple times
# by checking whether __init_nvm is a function.
if [ -s "$HOME/.nvm/nvm.sh" ] && [ ! "$(whence -w __init_nvm)" = function ]; then
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
local -a __node_commands=('nvm' 'node' 'npm' 'yarn' 'gulp' 'grunt' 'webpack')
function __init_nvm() {
for i in "${__node_commands[@]}"; do unalias $i; done
\. "$NVM_DIR"/nvm.sh
unset __node_commands
unset -f __init_nvm
}
for i in "${__node_commands[@]}"; do alias $i='__init_nvm && '$i; done
fi
一顿操作之后,除了 zprof
中看不到 nvm 相关函数了,冷启动速度并无太大起色。
参考资料:
Round 2:conda
之前安装 miniconda 之后,每次进入终端会激活 base
环境,当时只是简单粗暴的在 .zshrc
中添加了一条 conda deactivate
命令,所以在 zprof
中可以看到 __conda_activate
还是执行并且消耗了不少时间。
在 ~/.condarc
中添加如下行取消 conda 的自动激活,并去掉 conda deactive
命令:
auto_activate_base: false
再次打开 iTerm2,zprof
中已经没有了 conda 相关的函数,但冷启动速度依然很慢。
参考资料:
Round 3:oh my zsh
一直以为 iTerm2 在使用了 oh my zsh 之后冷启动慢是因为启动的时候会去进行 omz 的自动更新导致的,根据使用的版本,在 .zshrc
中关闭自动更新:
老版本:
# Uncomment the following line to disable bi-weekly auto-update checks.
DISABLE_AUTO_UPDATE="true"
新版本:
zstyle ':omz:update' mode disabled
事实证明,冷启动慢跟这个也没有关系。
参考资料:
Round 4:xcodebuild
过了三招,此时 zprof
的结果中已经没有了什么耗时大户,然而冷启动时间依然慢的令人发指。
num calls time self name
-----------------------------------------------------------------------------------
1) 24 151.95 6.33 49.82% 133.18 5.55 43.67% _omz_source
2) 4 74.80 18.70 24.53% 74.80 18.70 24.53% compaudit
3) 2 145.87 72.94 47.83% 71.07 35.53 23.30% compinit
4) 1 6.59 6.59 2.16% 6.59 6.59 2.16% test-ls-args
5) 1 4.94 4.94 1.62% 4.94 4.94 1.62% regexp-replace
6) 1 3.37 3.37 1.10% 3.37 3.37 1.10% zrecompile
7) 6 2.95 0.49 0.97% 2.95 0.49 0.97% is_plugin
8) 5 1.90 0.38 0.62% 1.90 0.38 0.62% is-at-least
9) 1 1.85 1.85 0.61% 1.85 1.85 0.61% colors
10) 4 1.74 0.44 0.57% 1.74 0.44 0.57% add-zsh-hook
11) 15 1.59 0.11 0.52% 1.59 0.11 0.52% compdef
12) 3 0.87 0.29 0.29% 0.87 0.29 0.29% is_theme
13) 2 0.11 0.06 0.04% 0.11 0.06 0.04% env_default
14) 1 0.03 0.03 0.01% 0.03 0.03 0.01% bashcompinit
iTerm2 冷启动时,标题栏确有出现过 xcode 相关的字样,参照 每个终端命令后触发xcodebuild 中提到的方式接受了 xcodebuild 的许可:
$ sudo xcodebuild -license accept
依旧没有什么改变。不过二楼的回复内容,最终引导我走向 Final Round 彻底解决了 iTerm2 冷启动速度慢的问题。