分析 Linux 终端内存使用情况:从 xterm 到 kitty
对于许多高级用户来说,终端是与 Linux 系统交互的主要界面。虽然我们通常关注运行在终端内部的 shell 或工具的性能,但终端模拟器本身的内存占用经常被忽视。当在多个虚拟桌面上运行十几个甚至更多实例时,这些开销会不断累积,可能导致系统运行缓慢或过度的 swap 使用。
本文通过在不同显示服务器(X11 和 Wayland)上进行的实证测试,研究了几款流行 Linux 终端模拟器的内存使用情况,以确定哪些工具在效率和功能之间提供了最佳平衡。
内存危机:为什么它很重要
内存使用情况并不总是显而易见的。像 top 或 htop 这样的标准工具可能会产生误导,因为它们通常报告驻留集大小 (Resident Set Size, RSS),其中包含了共享库。为了更准确地了解一个进程对内存的独特贡献,像 smem 这样的工具是非常宝贵的。smem 报告比例集大小 (Proportional Set Size, PSS),它将共享内存分配给使用它的进程,从而提供了一个更现实的视图,即如果终止一个进程,会释放多少内存。
在一段记录在案的案例中,一名用户发现,在一部只有 16GB RAM 的旧机器上,十个 kitty 终端实例消耗了 50GB 的 swap。虽然这是一种极端情况,但它突显了功能丰富的终端在规模化运行时如何会出乎意料地耗尽系统资源。
实证基准测试:X11 vs. Wayland
为了比较内存占用,我们在 Openbox (X11) 和 KDE (Wayland) 上测试了几款终端。测量重点是运行一组命令前后 USS (Unique Set Size) 和 PSS (Proportional Set Size) 的变化。
X11 内存使用情况 (Openbox)
| Terminal | USS (Before) | PSS (Before) | USS (After) | PSS (After) |
|---|---|---|---|---|
| st | 2,592 | 3,008 | 3,396 | 3,834 |
| xterm | 6,808 | 7,414 | 11,640 | 12,266 |
| lxterminal | 6,528 | 9,891 | 7,800 | 11,159 |
| gnome-terminal | 10,252 | 14,984 | 10,692 | 15,416 |
| alacritty | 34,224 | 43,478 | 40,188 | 49,444 |
| konsole | 35,108 | 50,308 | 38,528 | 54,193 |
| kitty | 56,376 | 66,584 | 70,716 | 80,917 |
| ptyxis | 54,760 | 67,603 | 58,252 | 71,107 |
Wayland 内存使用情况 (KDE)
| Terminal | USS (Before) | PSS (Before) | USS (After) | PSS (After) | | :--- | :--- | :--- | :--- | :--- | | | st | 2,924 | 3,374 | 3,204 | 3,820 | | xterm | 6,460 | 6,691 | 9,888 | 10,119 | | foot | 5,096 | 7,110 | 8,764 | 11,114 | | rxvt | 8,936 | 9,440 | 12,872 | 13,736 | | lxterminal | 9,200 | 14,622 | 9,824 | 15,343 | | gnome-terminal | 12,168 | 19,005 | 12,660 | 19,313 | | alacritty | 25,468 | 28,837 | 34,188 | 37,470 | | konsole | 27,348 | 39,068 | 33,244 | 48,094 | | kitty | 46,468 | 51,520 | 53,048 | 58,032 | | ptyxis | 73,220 | 79,204 | 75,060 | 81,130 |
关键洞察与权衡
极简主义者:st 和 xterm
st (simple terminal) 的表现始终优于其他所有选项,其内存占用通常不到最重型终端的十分之一。然而,极简主义是有代价的:默认情况下,st 没有回滚缓冲区。对于需要此功能的用户,需要使用社区补丁(例如 st-flexipatch)来添加回滚和 sixel 支持等必要功能。
xterm 仍然是一个令人惊讶地可行的、低内存占用选项。虽然它被描述为“巴洛克式”且缺乏现代的可配置性或标签页,但其稳定性和低开销使其成为资源受限或 GPU 支持较差的环境中的可靠备选方案。
功能丰富型:kitty 和 Alacritty
现代 GPU 加速终端如 kitty 和 alacritty 提供卓越的渲染效果和高级功能。kitty 因其能够通过 timg 渲染像素级完美的图像而备受赞誉。然而,这种强大的功能伴随着显著更高的内存占用。
中间地带:gnome-terminal 和 foot
gnome-terminal 的表现非常出色,尽管它是一个功能齐全的桌面环境终端,但依然保持了轻量级。同样,foot (Wayland 原生) 也提供了一个很好的平衡,在支持 timg 图像渲染的同时,保持了非常低的内存占用。
优化策略
如果你正在使用内存占用较高的终端,但又想减少运行多个实例时的开销,可以考虑以下架构优化方案:
- 单实例模式:
kitty提供了一个--single-instance标志,用于在打开多个窗口时减少内存使用。 - 客户端/服务器架构:
foot利用了客户端/服务器模型。通过启动一个foot服务器(例如,通过 systemd),你可以使用footclient来启动新窗口,从而显著减轻每个新实例的内存压力。
结论
选择终端模拟器很少只取决于单一指标。虽然 st 是最快且最精简的,但对某些人来说可能过于简陋。对于寻求性能和图像支持之间平衡的 Wayland 用户,foot 似乎是一个强有力的竞争者。对于 X11 用户,lxterminal 或 gnome-terminal 在 st 的极端极简主义与现代 GPU 加速终端的高资源消耗之间提供了一个稳固的中间地带。