【问题标题】:Zsh Shell taking abnormally long time during initial startupZsh Shell 在初始启动期间花费异常长时间
【发布时间】:2020-10-11 10:04:35
【问题描述】:

我目前正在使用 ubuntu 20 并使用 zsh + oh my zsh shell 。 问题是 zsh shell 启动时间异常长。 客观地说,与使用 time 命令相比,它比原始 bash 慢了近 9 倍

使用原始 bash 进行时间检查

for i in $(seq 1 10); do /usr/bin/time bash -i -c exit; done
exit
0.02user 0.07system 0:00.19elapsed 45%CPU (0avgtext+0avgdata 1816maxresident)k
136inputs+0outputs (3major+1737minor)pagefaults 0swaps
exit
0.05user 0.04system 0:00.17elapsed 52%CPU (0avgtext+0avgdata 1820maxresident)k
0inputs+0outputs (0major+1737minor)pagefaults 0swaps
exit
0.02user 0.06system 0:00.18elapsed 42%CPU (0avgtext+0avgdata 1824maxresident)k
0inputs+0outputs (0major+1745minor)pagefaults 0swaps
exit
0.08user 0.03system 0:00.21elapsed 51%CPU (0avgtext+0avgdata 1828maxresident)k
0inputs+0outputs (0major+1743minor)pagefaults 0swaps
exit
0.00user 0.06system 0:00.14elapsed 40%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1736minor)pagefaults 0swaps
exit
0.02user 0.05system 0:00.14elapsed 50%CPU (0avgtext+0avgdata 1820maxresident)k
0inputs+0outputs (0major+1738minor)pagefaults 0swaps
exit
0.00user 0.06system 0:00.13elapsed 46%CPU (0avgtext+0avgdata 1820maxresident)k
0inputs+0outputs (0major+1741minor)pagefaults 0swaps
exit
0.01user 0.05system 0:00.14elapsed 40%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1738minor)pagefaults 0swaps
exit
0.00user 0.07system 0:00.14elapsed 48%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1738minor)pagefaults 0swaps
exit
0.01user 0.06system 0:00.13elapsed 50%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1737minor)pagefaults 0swaps

使用 zsh + oh my zsh 检查时间

for i in $(seq 1 10); do /usr/bin/time zsh -i -c exit; done
0.67user 0.82system 0:02.54elapsed 58%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8337minor)pagefaults 0swaps
0.66user 1.01system 0:02.88elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8329minor)pagefaults 0swaps
0.51user 1.11system 0:03.17elapsed 50%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8345minor)pagefaults 0swaps
0.74user 0.76system 0:02.78elapsed 53%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8339minor)pagefaults 0swaps
0.59user 0.99system 0:02.74elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8326minor)pagefaults 0swaps
0.80user 0.86system 0:02.88elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8339minor)pagefaults 0swaps
0.63user 1.02system 0:02.78elapsed 59%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8330minor)pagefaults 0swaps
0.87user 0.89system 0:03.08elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8325minor)pagefaults 0swaps
0.68user 0.98system 0:02.89elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8323minor)pagefaults 0swaps
0.71user 0.88system 0:02.81elapsed 56%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8338minor)pagefaults 0swaps

我想再次明确一点,zsh 中的延迟仅发生在 start 时打开终端时,而不是在一般使用期间。 我已禁用所有插件并使用 powerlevel10k 主题,尽管我可以肯定地说它与主题无关。 在我更改为 zsh shell 后,我立即注意到这种减速,在我安装了我的 zsh 之后甚至变得更糟 我还告诉我的一些朋友做这个测试,他们的 zsh 时间比 raw bash 稍微高一点,这是可以接受的,但我的似乎完全不正常。

也欢迎一般性建议,但更具体地说,我想问一下,我是否可以实际检查终端在后台到底做了什么,而它在 zsh 中启动大约需要 3 秒,而在 bash 中启动需要 0.2 秒

Here's我的 .zshrc 文件,如果有帮助的话

编辑 - 我尝试用 Raw zsh 做同样的测试(没有哦我的 zsh) results 很有趣,现在 zsh shell 的启动速度大约慢了 4 倍,平均大约 1.2 秒,而 zsh+oh my zsh 则为 3 秒

【问题讨论】:

  • 不使用 oh-my-zsh 会怎样?
  • @Shawn 好建议,这是原始 zsh 的结果(没有哦我的 zsh)-del.dog/raw/zoocolowun

标签: terminal zsh prompt oh-my-zsh zshrc


【解决方案1】:

如果您关心的是在启动 Zsh 时快速获得可用的 shell,您可以这样做:

  1. 键入p10k configure。此命令来自您已经在使用的 Powerlevel10k。
  2. 当向导询问是否启用即时提示时,选择安静详细,但 关闭

现在,出于所有实际目的,Zsh 将立即启动。您可以启用任意数量的插件,并且它仍然是即时的。您可以找到详细信息herehere

请注意,您仍然会从 time /usr/bin/time zsh -i -c exit 获得相同的结果。此基准测试不测量 Zsh 启动时间。它既没有给出 Zsh 启动时间的下限也没有给出上限。其结果可以任意高于或低于实际 Zsh 启动时间。

【讨论】:

  • 感谢您的回复,首先我使用的 .p10k.zsh 文件不是由 p10k configure 直接生成的,我从一个朋友那里得到了那个文件,他根据我们的喜好稍微改变了外观- 这是我当前的 p10k 配置文件 -del.dog/aphusyqigr.go,就时间命令的准确性而言,我发现它相当准确,因为我什至尽我所能使用秒表测试了 zsh+ohmyzsh 上的终端启动时间,而且它似乎总是像时间命令所指示的那样几乎触及 3 秒标记
  • 如果您不想运行p10k configure,您可以通过在~/.zshrc 顶部手动添加几行来启用即时提示。见docs。至于time zsh -ic exit 的用处,可以很容易地证明你通过改变你的zshrc 可以让这个命令报告任意大或任意小的数字。优化此命令的结果是一个非常糟糕的主意。
  • 感谢这确实改善了初始加载时间,参考下面的答案,我了解了 zsh 分析,我发现函数花费的时间最长
  • 我从您的主题的即时提示中获得了一些优势,尽管我会尝试通过减少这些功能消耗的时间来进一步改进它
  • 您将白白浪费大量时间。从您使用的配置文件中减少任何功能花费的时间不会对 Zsh 启动时间产生任何影响。试试下面的。首先,启用我上面描述的即时提示。输入zsh。如果提示没有出现立即,请提交针对 powerlevel10k 的错误。现在在 zshrc 的底部添加foo() { sleep 1 }; foo。输入zsh。它仍然会立即启动,但您的基准和配置文件显示 foo 需要很多时间。
【解决方案2】:

您可以通过将zmodload zsh/zprof 放在zshrc 的顶部和zprof 放在底部来检查zsh 启动期间哪些函数花费的时间最长。下次打开新会话时,您会得到很好的细分。

希望这可以帮助您深入了解需要很长时间才能加载的内容。

老实说,oh-my-zsh 有点笨拙,并没有优化函数的加载,只是获取所有内容 - 如果其中一个源运行了一个程序,你的 shell 将不得不等到它执行直到提示加载。

我手动编写了自己的 zsh 配置并使用 Zinit https://github.com/zdharma/zinit 加载插件。我的 shell 在几毫秒内启动。

【讨论】:

  • 感谢这个方法来检查启动期间正在运行哪些功能,我一定会检查你的 git
  • 虽然看不懂,但是你有没有注意到这里有什么异常-del.dog/cytahuving.txt
  • 最慢的两个函数是handle_completion_insecurities 和anon。 handle_completion_insecurities 来自 oh-my-zsh github.com/NobbZ/oh-my-zsh/commit/… 它似乎阻止了 compinit 抱怨不安全的文件。将其关闭 - ZSH_DISABLE_COMPFIX=true 对我来说,这只发生在 root 中。我的 zshrc 中有这个:[[ $UID = 0 || -n $SUDO_USER ]] && compinit -u || compinit Option -u 接受不安全的文件。匿名函数可以是任何东西。它们被写成 () { code } 并且无需调用即可自动运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2022-11-30
  • 2021-12-25
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多