我有一台使用 Arch Linux 和 Ubuntu (16.04) 双重启动的机器。
我最近开始使用卡库恩文本编辑器,并注意到它的启动时间根据我使用的操作系统而有很大不同。但我相信根本问题是不是直接归因于kakoune。
启动时,kakoune 运行一堆 shell 脚本,以启用与 x11 和 tmux、git、语法突出显示/颜色方案等的集成。可以禁用此功能,以便仅使用标志加载“vanilla”编辑器-n
。
命令:kak -e q
将启动 kakoune,运行所有启动脚本并立即退出。
在 Arch 上:
time kak -e q
需要1秒
time kak -n -e q
(无 shell 脚本)在下面完成20 毫厘。
在 Ubuntu 上:
time kak -e q
需要大约450 毫厘
time kak -n -e q
再次处于20 毫厘
在削减脂肪并删除一些启动脚本之后,我确实看到两个操作系统的改进与删除的数量成比例。
我运行了一些基准测试UnixBench并发现两个系统之间的主要差异体现在“进程创建”和“shell 脚本”测试中。
shell 脚本测试测量进程每分钟可以启动并获取 shell 脚本的一组(一个、两个、四个和八个并发副本)的次数,其中 shell 脚本对数据文件应用一系列转换。
这是相关的输出。 “每秒循环次数”的单位越多越好:
Process creation (1 parallel copy of tests)
Arch: 3,822
Ubuntu: 5,297
Process creation (4 parallel copies of tests)
Arch: 18,935
Ubuntu: 30,341
Shell Scripts (1 concurrent) (1 parallel copy of tests)
Arch: 972
Ubuntu: 5,141
Shell Scripts (1 concurrent) (4 parallel copies of tests)
Arch: 7,697
Ubuntu: 24,942
Shell Scripts (8 concurrent) (1 parallel copy of tests)
Arch: 807
Ubuntu: 2,257
Shell Scripts (8 concurrent) (4 parallel copies of tests)
Arch: 1,289
Ubuntu: 3,001
可以看到Ubuntu系统的性能要好得多。
我已经使用不同的登录 shell、终端模拟器、重新编译 kakoune、删除不需要的软件来清理磁盘等进行了测试。我确信这是瓶颈。
我的问题是:我该如何进一步研究这个问题并提高 Arch Linux 系统的性能以匹配 Ubuntu?我应该考虑调整内核吗?
补充笔记:
- 两个系统都使用相同类型的文件系统 (ext4)
- 我更倾向于使用 Archlinux 系统,并且注意到性能随着时间的推移而下降
- Arch 位于 /dev/sda1 上,大小约为 200GB。 Ubuntu 位于 /dev/sda2,~500GB。 1TB 硬盘。
- 拱门
uname -a
:Linux ark 4.14.13-1-ARCH #1 SMP PREEMPT Wed Jan 10 11:14:50 UTC 2018 x86_64 GNU/Linux
- 乌班图
uname -a
:Linux sierra 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
谢谢
答案1
Debian 和 Ubuntu 使用 dash as /bin/sh
,它比 Bash 更快一些:
$ time for x in {1..1000} ; do /bin/bash -c 'true' ; done
real 0m1.894s
$ time for x in {1..1000} ; do /bin/sh -c 'true' ; done
real 0m1.057s
这与您的数字大致相同的面积(按比例)。
在 Debian 和 Ubuntu 中更改/bin/sh
为 dash 而不是 Bash 很大程度上是因为性能:
切换默认 shell 的主要原因是效率。 bash 是一个优秀的全功能 shell...但是,与 dash 相比,它相当大且启动和运行速度慢。
答案2
正如 ilkkachu 所解释的,Arch 使用 bash /bin/sh
,而 Ubuntu 默认使用 dash。
为了进一步调查这一点,并确定这是否解释了差异,您可以将 Ubuntu 系统配置为使用 bash,然后查看基准测试是否报告与 Arch 上获得的结果类似的结果。为此,请运行
sudo dpkg-reconfigure dash
并选择“否”。然后您可以验证/bin/sh
指向bash
,并运行测试。
要恢复默认值,请再次运行相同的命令并选择“是”。
如果这是性能差异的原因,那么改进 Arch 来匹配 Ubuntu 将会很困难。你可以安装 dash 并使用它,但你可能会遇到很多脚本,这些脚本假设/bin/sh
是 bash 并因 dash 失败 - Debian 和 Ubuntu 花了相当长的时间来识别和修复所有问题。
答案3
添加我自己的答案,以防其他人遇到同样的问题:
for
当在 @ilkkachu 的答案中运行循环时交互式 bash shell使用 zsh 或 Fish 作为我的登录外壳,/bin/bash
循环大约需要13秒。如果我从 root 登录 shell 运行循环,或者更改我的登录外壳到/bin/bash
,我取得了与@ilkkachu 的答案类似的结果。
我认为这是因为/bin/bash
从登录 shell 继承了它的环境(或者/bin/zsh
)/bin/fish
,但我不太确定。
无论如何,我通过改变解决了这个问题我的登录外壳并将/bin/bash
我的终端设置为运行/bin/fish
或/bin/zsh
作为交互式 shell。