← Electerm 博客

监控条与信息面板:不用敲 top 也能盯住服务器

2026-09-22
监控ssh服务器性能磁盘信息面板提效

监控条与信息面板:不用敲 top 也能盯住服务器

你正盯着一场部署。日志已经四十秒没动了,你想知道为什么:是内存不够了,磁盘满了,网络成了瓶颈,还是它本来就慢?要得到诚实的答案,得付出一次上下文切换的代价。htop——看一眼——q。然后 df -h。然后 uptime。三条命令,其中一条还是全屏 TUI,会直接占掉你正在读的那个窗格。

electerm 把这个答案放进了界面框架里,而不是你的回滚缓冲里。页脚上方 28 像素高的一条监控条,会复用你已经打开的那条 SSH 连接每隔几秒采样一次机器状态;而当这一条不够用时,右侧的信息面板会把同一台机器完整地铺开给你。

两个入口,同一台机器

这两个界面读的是同一份数据、由同一个监控器产出、挂在同一个会话上。区别只在于它们显示多少,以及把它放在哪里。

监控条 信息面板
位置 页脚上方 28px,横跨终端区 右侧栏,500px(可停靠)
打开方式 设置 → 终端 → 监控条 页脚上的图表图标
适用会话 仅 SSH 任意会话,包括本地终端
形态 九项扫一眼就懂的数据 完整表格,分区可自选
打开时 —— 监控条隐藏,避免同一份数据出现两次

开启监控条

设置 → 终端 → 监控条。它默认是关闭的,而且是刻意的:这条监控条会每隔几秒在远端主机上执行命令,electerm 不会去轮询一台你还没让它轮询的服务器。

打开之后,SSH 标签页就会多出一条像"关于这台主机的一句话"的横条:

web-01   CPU 37%  ⣀⣠⣠⣀   Mem 3.2 GiB / 15.6 GiB   ↑ 1.2 MiB/s   ↓ 4.6 MiB/s   Up 12d 06h   zxd +2   /:43% /home:18% /var:91%

依次是主机名、当前 CPU 负载、五分钟 CPU 历史画成的迷你折线、已用内存与总内存、主网卡的上传与下载速率、运行时间、登录用户,以及前三个文件系统的使用率。全部都不用离开当前窗格。

每一项的代价

监控条是一组小的 POSIX shell 探测命令,而不是需要你安装的 agent。可能会被执行的命令,完整清单如下:

显示 刷新 在服务器上跑什么
hostname web-01 一次 uname -s -n -r -m + 从 /etc/os-releasePRETTY_NAME=
cpu CPU 37% 5 秒 两次 grep '^cpu ' /proc/stat,间隔 100ms
cpuHistory 迷你折线 5 秒 同一次采样,留存为历史
memory Mem 3.2 GiB / 15.6 GiB 5 秒 cat /proc/meminfo
upload ↑ 1.2 MiB/s 5 秒 /sys/class/net/*tx_bytes
download ↓ 4.6 MiB/s 5 秒 同一组探测里的 rx_bytes
uptime Up 12d 06h 5 秒 cat /proc/uptime
users zxd +2 30 秒 who
disks /:43% /home:18% 10 秒 df -Pk

注意这些间隔:CPU、内存、网络和运行时间一直在变,所以每五秒读一次;磁盘表每十秒;登录用户每三十秒;而内核与系统字符串每个会话只读一次——因为在同一个会话运行期间它们根本不会变。这也正是它便宜的原因:它的全部意义就在于它不是一套监控守护进程。

不需要它们的时候,它们不在

把鼠标扫到监控条上,右侧会淡入两个控件:一个筛选(挑出你需要的那几项),一个关闭按钮——效果和设置里的开关完全一样。鼠标移开,它们就消失了,这样这条横条才像一条横条。

触屏设备没有 hover,所以那两个控件就直接常驻。同一个思路,不同的输入方式。

绿、黄、红——带一个死区

数值会按级别配色,而且每个磁盘挂载点各有自己的级别:

级别现在是 回到正常 警告 危险
正常 ≥ 80% ≥ 90%
警告 < 75% 75–89% ≥ 90%
危险 < 80% 80–84% ≥ 85%

这个不对称才是真正有意思的地方。用最直白的阈值,负载在 80% 附近抖动时颜色就会来回翻转——一条在你阅读时不停在白色和琥珀色之间闪的横条,比没有横条更糟。所以回落时会留出五个点的余量:一旦进入 warning,只有低于 75% 才会回到正常;一旦进入 critical,要等负载真的降下来(低于 85%)才会解除。

警告或危险的项目,数值前面还会多出一个小三角,所以当你的目光并不在角落里时,一个红色的 /:91% 依然能抓住你。

点开任意一项,看真正的答案

鼠标悬停会打开弹层;点一下则把弹层钉住,这样读的时候不必保持鼠标不动。按 Escape 关闭。弹层里面的内容,才是监控条从"扫一眼"变成"工具"的地方。

cpu —— 最近五分钟的当前值、平均值、最小值和最大值,画成 360×88 的折线图,后面跟着占用 CPU 最高的十个进程:PID、用户、CPU、内存,以及被截断的命令行。每一行都有终止按钮,于是"是哪个失控进程在吃机器,停掉它"就只是一次弹层操作,不需要 htop

memory —— 已用及其占比、可用、总量,以及 swap 的已用与总量。如果内核老于 MemAvailable(3.14),数字会退回 MemFree,同时弹层会明确标出 compatibility memory,而不是悄悄给你一个更差的数字。

upload / download —— 一张按网卡展开的表:名称、IPv4 地址、当前速率,以及开机以来的累计计数。持有默认路由的那张网卡会带一个 * 标记,因为监控条汇总的正是它。窗口够宽时还能看到发送/接收总量;窗口窄了,表格就只保留放得下的列。

uptime —— 开机了多久,以及换算成墙上时钟的开机时刻。后者往往才是你真正想知道的("它昨晚重启过吗?")。

users —— 每个登录会话一行:用户、TTY、登录时间,以及你从哪个地址登进来的。

disks —— 每个挂载点一行:百分比、已用、可用、总量和文件系统,百分比按上面的级别配色。

hostname —— 主机名、地址、系统、内核、架构,以及 shell 及其版本。

还有两个细节,让它在赶时间时特别好用:点击数值单元格即可复制(而已经完成的文本选区优先级高于点击,所以在单元格里拖选不会误伤你的剪贴板);每个弹层底部都有一个 info 按钮,把你交给信息面板。

信息面板:同一台机器,完整铺开

信息面板从终端页脚上的图表图标打开,而且是按会话的——切换标签页,它显示的就是那个标签页对应的机器,而不是一个全局看板。

默认形态是浮层:宽 500px,从窗口顶部栏下方开始,在页脚之上结束——因为页脚上放着的,正是用来开关它自己的那个图标。一个通高的浮层会把它自己的开关埋掉。把它钉住,它就变成停靠面板:终端被挤到一边,右侧整列从上到下都归它。

面板顶部是终端自身的信息,不是服务器的:

ID: 4f1c2a7e-...
[ ] save terminal log to file
    [ ] addTimeStampToTermLog
    terminal log path: ~/electerm-logs/web-01.log   [reveal]
[分区筛选 ▾]

会话 ID、日志落盘开关、时间戳开关(只有在你开始写日志之后才会出现——给一份并不存在的日志加时间戳只是噪音)、解析好的日志路径和一个在文件管理器中定位它的按钮,以及分区筛选。

再往下,就是你选中的分区。无论你用什么样的顺序勾选它们,展示顺序永远一致——hostname 在最前,其余按固定顺序排开:

分区 内容
hostname 主机名、地址、系统、内核、架构、shell
uptime 运行时间、开机时刻
cpu 当前 / 平均 / 最小 / 最大、折线图、进程排行
mem 已用、可用、总量、swap
activities 完整进程表,可按 CPU 或内存排序
network 全部网卡、速率与累计量
disks 全部挂载点,而不只是前三个
users 全部登录会话

默认勾选的是 uptime、cpu、mem、activities、network、disks;users 需要你自己打开。如果你保存的配置里还留着旧版的 swap,它会被并入 mem,所以你永远不会看到同一组数字出现两次。

本地终端是另一套分区

本地 shell 也有操作系统,但在 macOS 和 Windows 上并没有 /proc 可读。所以对本地标签页来说,hostname 分区是在本地由应用自身解析的,不向任何地方发送 shell 命令:macOS 15.1Windows 11 (10.0.22631)Linux 6.8.0-45-generic,再加上主机名、内核、架构,以及所用 shell 及其版本(通过 <shell> --version 探测,Windows PowerShell 上则用 $PSVersionTable.PSVersion)。

本地拿不到的是那些指标——CPU、内存、磁盘。它们来自 Linux 主机上的 /proc/sys,而那正是这个面板的用途。这也是监控条只支持 SSH 的原因:本机并没有一台机器可以被这样监控。

信息面板打开时,监控条会让位

在 SSH 标签页里打开信息面板,监控条就消失了。这不是 bug,也不是空间不够:这两个界面读的是同一个监控器,同时显示就是重复——而且面板的下边缘正好落在监控条那 28px 上,它会透出来。弹出对话框时监控条同样隐藏,免得去和对话框抢同一个角落。

关掉面板,横条就回来了,而且历史还在——CPU 迷你折线不会从头开始。

线上实际发生了什么

以上这一切都不会另开连接,也不会碰你的 shell:

  • 每条探测都是在你已经建立的那条 SSH 连接上的一次独立 exec 请求。不会往交互式 shell 里输入任何东西,不会出现在回滚缓冲里,也不会进你的 shell 历史。
  • 每条命令都有 5 秒超时。一个因 NFS 挂死而卡住的 df 不可能把监控条拖住。
  • 退出码 126/127,或者报 not found 的命令,会把该分区标记为不可用并停止轮询——这就是精简容器或老旧 busybox 的样子,而每五秒再去问一次是很不礼貌的。
  • 其它错误会保留最后一次正确的值,并标上 stale 和读取时刻,而不是冲你闪
  • 连续失败会指数退避,最长到一分钟一次。
  • 窗口不可见时轮询停止。 后台里挂着的 electerm 不是监控 agent;切走,命令就停。
  • 每个会话只有一个监控器,监控条和信息面板共用它;最后一个观察者离开后五分钟,它才会被销毁。
  • CPU 历史是最近 60 个采样——5 秒一次即五分钟——而迷你折线在采样缺失处会断开,所以一段 stale 期间永远不会被画成一条平滑的直线。

哪些数字可以放心信,哪些需要理解

CPU 是差值,不是读数。 /proc/stat 里只有开机以来的累计计数,所以 electerm 取间隔 100ms 的两次采样、算出变化量,并排除 idle 与 I/O wait。这就是为什么你连上去之后读到的第一个值是空的,而不是零。

内存用的是 MemAvailable,不是 MemFree MemFree 是"此刻没东西在用",而在一台健康的 Linux 上这个数字小得令人沮丧——page cache 也算已用。MemAvailable 是"内核认为这些内存要得回来",也就是你在判断机器是否有压力时真正想要的那个数。

网络速率同样是差值,而且复位的情况都被处理了。 第一次采样没有速率;默认网卡变化后的第一次采样也没有(VPN 起来了、容器网桥出现了);计数倒退之后的第一次同样没有——当你读的是字节计数时,重启就长这样。这三种情况下,监控条显示 ,而不是一个壮观且完全虚构的尖峰。

上传和下载只跟着一张网卡。 默认路由所在的那张网卡(ip route show default),而不是机器上所有网卡的总和。否则 docker 网桥和 VPN 隧道会在真实流量之上再被叠加一次。

磁盘会跳过伪文件系统。 tmpfsdevtmpfsproccgroupsquashfs 之类都被过滤掉,而 overlay 只在挂载到 / 时保留——这正是你在容器里想要的。监控条按优先级排序(先 /,再 /home/var/data)后展示前三个挂载点,还有更多时显示 +N;面板则把它们全部列出。

一个为截图准备的开关

如果你要共享屏幕、直播,或者把面板粘进工单,打开 hide IP。它会一次性从 hostname 分区、网卡表和用户表里拿掉地址——这也是用户表里那列来源地址是被条件渲染、而非永久存在的原因。监控条本身从一开始就不显示任何地址。

找台忙碌的主机试试

监控条在一台真正干着活的机器上最有说服力。随便连一台,打开面板,然后在你跑一次构建或者一批 rsync 的时候把它放在那儿——你会看到这项工作的形状:CPU 往上爬,内存被填满,网络安静的时候磁盘在涨,然后一切放松下来。五分钟的历史,足以让你分辨"慢"和"在换页"。

同一个功能还有一个 65 秒的实录:electerm: 查看 SSH 服务器信息——内存、CPU、运行时间、进程、磁盘和网络,一次看完。