MAC 四月 06, 2024

iTerm2 冷启动提速

文章字数 20k 阅读约需 18 mins. 阅读次数

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 是 zshzsh 中有一个性能监控模块 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

统计信息分为两部分:

  1. 概述:按每个函数自身的总耗时(self 下的第一列。timeself 分别有三列)降序排序,单位是毫秒
  2. 详情:列出了每个被调用的函数的详细信息

可以看到,耗时排名前几位的:nvmcondaoh 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 冷启动速度慢的问题。

0%