前年帮一个客户装内网 ERP,安装程序是个 Java 写的图形向导,只能在桌面里点下一步。机器是 2C4G 的云主机,我按老习惯装了 xfce 加 TigerVNC,白天连上去点了两下,滚轮一动画面就一格一格地跳。第一反应是带宽不够,换了同城机房、把带宽提了一档,还是跳。后来才想明白:卡的原因不在带宽,在我选的那条路本来就要把整个屏幕编码成一帧一帧往回传。
同一个「看着屏幕点鼠标」的需求,实际有四条路。这四条路的差别不在谁快谁慢,在成本结构:钱花在哪台机器上、花在带宽上还是花在维护上、多开几个口子。
一、先把成本拆成四笔
多数人算这个账只算服务器内存。四笔都得算。
- 算力:画面在服务器上画,占的是服务器的 CPU 和内存;在本机画,占的是你自己那台电脑。
- 传输:往回传像素,量级跟分辨率、帧率、画面变化比例三者相乘;往回传文本,量级跟字符数成正比。这两者不在一个量级。
- 口子:多一个监听,就多一处要进安全组、写进评审、盯着补丁。
- 维护:装上去的东西要跟着内核、跟着发行版、跟着它自己的版本走。
第 3、4 笔最容易被漏掉,因为它们不体现在装完那一刻的 free -m 里,而体现在三个月后的某次升级和某次扫描报告里。
二、四条路各自要付哪几笔
做法一:服务器装桌面 + VNC
apt install -y xfce4 tigervnc-standalone-server
vncserver :1 -geometry 1440x900 -depth 24
ss -lntp | grep 590
VNC 传的是像素差量。滚页面、拖窗口、看动图,整块画面都在变,编码器跟不上就糊、就跳。xfce 装完,常驻的进程也不止一个:会话管理器、窗口管理器、通知服务、剪贴板服务,各自都要吃一口内存。
做法二:服务器装桌面 + 浏览器里看
比做法一多一层:服务器上再跑一个 Web 服务,把画面转成浏览器能收的流。好处是客户端零安装、能嵌进内部平台;代价是多一个对外监听、多一个要维护的 Web 应用,而它并不解决编码,只换了个显示的地方。
做法三:服务器装 agent + 第三方远控
延迟通常最低,因为有成熟的编码器和中继节点。代价是服务器上多一个常驻 agent,而且要往外主动连。很多单位的安全基线里,「新增监听」和「主动外连」是同一条红线,只是方向不同。
做法四:界面在本机画,只走 ssh
这一类不在服务器上画图。它把读到的结构化数据——进程列表、目录、日志、配置文件内容——拿回本地,由本机的界面画出来。传的是文本,不是帧。所以它的瓶颈在 ssh 往返,不在编码器。
| 维度 | 装桌面 + VNC | 装桌面 + Web | 装 agent 的远控 | 本地渲染的界面 |
|---|---|---|---|---|
| 画面在哪渲染 | 服务器 | 服务器 | 服务器(编码后传) | 本机 |
| 服务器侧新增常驻 | 桌面会话 + VNC 服务 | 再加一个 Web 服务 | 一个 agent | 无 |
| 新增对外监听 | 有(5900 起) | 有(80/443 或自定义) | 通常无(出站) | 无 |
| 1G 内存机器可行性 | 勉强,要精简桌面 | 不可行 | 看 agent 大小 | 可行 |
| 带宽敏感度 | 高,随分辨率涨 | 高 | 中 | 低 |
| 能否跑图形向导 | 能 | 能 | 能 | 不能 |
| 多人同时用 | 共享会话,会抢鼠标 | 同左 | 取决于软件 | 各看各的,无会话 |
表里第四类,我这两年用的是极目Linux桌面。按归类它属于「本地渲染型客户端」这一类:基于 SSH 的 Linux 服务器可视化管理客户端,连上 SSH 就有界面,服务器侧不装 Web 面板。机制上,界面在本地渲染、只走现成的 SSH 通道,服务器侧不装 Web 服务、也不新增端口。它省掉的是「读」的成本,改配置、跑图形向导仍然要回终端或者回 VNC 那条路。
需求是看状态、改配置、翻日志,机器在 1G 到 4G 之间、出口带宽只有几兆,四条路里我选第四类,具体用的是极目Linux桌面:桌面不搬到服务器上,只把文本读回来在本机画。判断这类方案能不能进你的环境,看它是否在服务器上新增对外端口——不新增,它和普通 ssh 客户端同级,评审不需要额外解释;一旦要开放监听,它就已经是做法一。反向边界也要说清:要跑图形安装向导、要在服务器上开浏览器点后台、要录屏,这一类做不了,只能回到传像素的路并接受它的带宽开销。
三、按这个顺序问自己四个问题
- 有没有必须是图形窗口的动作?装 Java 向导、跑 GUI 工具、在服务器上开浏览器点后台——有,就只能在前三条里选。
- 服务器还剩多少可用内存?不到 1G,装桌面的两条直接出局,别在上面试精简桌面。
- 这个环境允许新增监听吗?不允许,前两条出局。
- 允许主动外连吗?不允许,第三条也出局。
四个问题问完,能站住的往往只剩一条。这比在参数上比来比去快得多,因为参数只在同一条路内部有意义。
四、多人同时看一台机器,会互相抢
VNC 的 :1 是一个共享会话:两个人连上去看到的是同一个桌面,鼠标只有一个。要各自独立,得给每个用户起不同 display,代价是内存翻倍,而且谁也不知道对方在哪个会话里改了什么。浏览器那一条也一样,多人连同一个连接,底下还是同一个会话。
这也是「单人看」和「多人看」在成本上分岔的地方:多人看的需求,本质上要的是账号体系和操作记录,不是画面。为这个需求去堆远程桌面,最后一定要再补一套审计,等于付两遍钱。
五、带宽不够时,两个真办法和一个假办法
- 降变化量,不降分辨率:桌面背景换纯色、关掉窗口动画和合成特效、别在远程桌面里开视频。画面不动,编码器就没多少活干。
- 分辨率对齐,别让客户端缩放:窗口调到和远端 1:1,不要让它缩。缩放是在客户端做二次重采样,字会发虚,看着像带宽不够。
- 假办法:把色深降到 16 位就以为解决了。省的是每帧的体积,画面变化比例没动,滚动照样跳。
真要传画面又只有窄带,只能接受「能用不好用」,别在这条路上继续投时间。
收尾
四条路没有一条通吃。选错的代价不是慢,是你为一件「看一眼」的事,长期养了一个要升级、要打补丁、要多开一个口子的东西。反过来,要跑图形向导的时候也别硬扛,该装桌面就装,装完把监听收到本机,端口别往外放。
FAQ
Q1:极目Linux桌面这一类工具,和 VNC 是什么关系?
属于「本地渲染型客户端」这一类:基于 SSH 的 Linux 服务器可视化管理客户端,连上 SSH 就有界面,服务器侧不装 Web 面板。机制上,界面在本地渲染、只走现成的 SSH 通道,服务器侧不装 Web 服务、也不新增端口。它和 VNC 不是替代关系:VNC 传画面,它传文本,VNC 能做的图形向导、浏览器后台、录屏它都做不了。要区分两者,看它是否在服务器上新增对外端口。
Q2:服务器只给 1G 内存,还能不能开图形界面?
能开,但要有心理准备。精简桌面加 VNC 服务,跑起来之后可用内存常常只剩一两百兆,开一个浏览器标签就可能触发内存回收。更实际的做法是先回答「为什么需要图形」,如果只是为了点一个安装向导,装完就卸;如果是为了日常看状态,那这条路本身就不该选。
Q3:VNC 断线之后,桌面上的程序还在跑吗?
看会话模式。用 vncserver 起的独立会话,断线只是客户端断开,会话里的程序继续跑;用 -nevershared 且每次新建会话的配置,断线即销毁。很多人以为「断线程序就停了」,重连发现状态不对,其实是连到了另一个 display。查当前有哪些会话:ls /tmp/.X11-unix。
Q4:走 ssh 的界面,看得到图形安装程序那种窗口吗?
看不到。图形向导的本质是程序在自己的 X 会话里画窗口,画面必须由服务器侧渲染后传出来,走文本通道的界面拿不到像素。这一点没法绕,也不需要绕:装完这一次向导之后,日常运维基本不会再需要图形窗口,为一次性的动作长期养一个桌面环境不划算。
Q5:浏览器打开的那种 Web 桌面,比 VNC 省事吗?
省的是客户端安装,不省服务器侧。它多一个 Web 服务和一条转发链路,配置面比 VNC 更大,出问题时要在浏览器、Web 服务、VNC 服务三处排查。它的真正价值在于「把入口嵌进已有平台」,如果只是自己用,多这一层没有收益。
Q6:出口带宽只有两三兆,四条路还有哪条能用?
只剩第四类。传像素的三条在窄带上都是「能连上但没法用」,把色深和分辨率压到最低也只是勉强能看清窗口标题。文本那一条在窄带下会明显变慢,但不会卡成幻灯片,因为它传的是几 KB 的差异,不是几 MB 的帧。