第1章:故障报告:星空投影仪

凌晨一点半的后厂村,唯有我司大楼几层灯火通明。
作为技术总监,我本该关心线上服务的稳定性——如果它们此刻能产生哪怕一丝流量的话。
但真正让我从椅子上坐直的,是一份来自资源监控系统的自动周报。
报告显示,一台本该在“归档区”躺尸的测试服务器,过去三个月,每周三和周五的凌晨一点到一点半,GPU使用率都会规律地跳到15%。
这很不正常,就像棺材板有节奏地敲响。

时间:周三,凌晨01:47
地点:技术总监办公室
人物:凯哥(技术总监)、姜芷(产品经理)


【系统监控周报摘要 - 内部页面】

服务器ID:TESTSVR-07
主机名:legacy-gpu-test-07
状态:归档 | 测试环境
异常检测:资源使用模式异常
详细情况

  • CPU使用率:平均 < 2%,正常。
  • GPU使用率:出现周期性峰值。每周三、周五,01:00:00 - 01:30:00,利用率从0%上升至14.8%-15.2%,持续30分钟后归零。模式极其规律。
  • 网络活动:在上述时间段内,检测到对外网IP(归属:冰岛某大学天文数据中心)的HTTPS请求,每次会话约传输80MB数据。
  • 进程信息:关联进程 gpu_stress_test_legacy(显卡压力测试-旧版)。
    风险评估:低。但消耗计算资源,且外网流量目的不明。建议调查。

凯哥揉了揉发酸的眼睛,把周报页面截图,拖进了名为“待办/诡异”的文件夹。他给自己冲了第三杯速溶咖啡,深褐色的液体在马克杯里晃荡,倒映着屏幕的冷光。

这不是他第一次注意到TESTSVR-07的异常。一个月前,某个深夜部署脚本跑失败时,他就瞥见过监控图上那个规律的小鼓包。当时他以为是某个没清理干净的测试任务,打算“有空再看”。

技术总监的“有空”,通常意味着“永远不会”。

但今晚,线上太平静了,静得让他心里发毛。那股属于老程序员的、对任何“规律性异常”的偏执好奇心,被咖啡因勾了起来。

他连上服务器,动作熟练得像回家掏钥匙。

ssh legacy-gpu-test-07

黑色的终端窗口弹出。他先看了眼进程列表。那个 gpu_stress_test_legacy 赫然在目,运行用户是 jiangz

“姜芷?”凯哥挑了挑眉。一个产品经理,深更半夜在归档服务器上跑古董显卡测试?这比服务器自己成精了还离谱。

他检查了进程启动命令,看起来就是个标准的压力测试工具。但启动时间分秒不差,每次都是凌晨一点整。谁家测试卡时间卡得比秒杀还准?

接着,他调出了服务器过去24小时的外网访问日志。过滤掉各种软件源更新、爬虫探测的噪音后,几条规律得刺眼的记录跳了出来:

01:00:05 OUT HTTPS 203.15.XX.XX (冰岛) GET /api/celestial/coordinates?lat=40.2&lng=116.3&time=...
01:00:10 OUT HTTPS 同IP GET /api/nebulae/rawdata?region=ORION
...
01:29:55 OUT HTTPS 同IP GET /api/rendering/complete?session=...

每一条请求的间隔、数据包大小,都像用游标卡尺量过。凯哥盯着屏幕上的“celestial(天体)”、“nebulae(星云)”和那个熟悉的经纬度(后厂村路),沉默了几秒。

然后他点开了网络监控的详细数据包分析。在一条HTTPS请求的原始信息里,他看到了这样一行:

User-Agent: Celestia-Render/1.0 (Python-urllib)

凯哥差点把咖啡喷在屏幕上。

“Celestia-Render?”他对着屏幕喃喃自语,“压力测试工具改行搞天文了?这伪装还能更敷衍一点吗?”

一个完美的隐藏——放在被遗忘的服务器、伪装成系统工具、只在夜深人静时启动——却败在了一个随手写上的、没有精心伪造的HTTP头。

这太有程序员特色了:解决了最难的技术问题,却在最简单的细节上漏了底裤。

凯哥关掉日志,直接调出了实时的服务器资源监控界面。GPU使用率的曲线,正在那个熟悉的15%高原上平稳地画着横线。他截了张图,打开企业微信,找到那个备注为“姜芷-难搞但靠谱”的对话窗。

凯哥[图片]
凯哥@姜芷 姜老师,方便现在过来一下吗?关于服务器使用规范。

三分钟后,办公室的门被轻轻敲响。

姜芷穿着件宽松的卫衣,头发随意扎着,脸上看不出熬夜的疲惫,只有一种“果然还是被发现了”的平静。她手里还端着个保温杯。

“凯哥,还没走?”她语气自然得像在茶水间偶遇。

“托某个神秘天文爱好者的福,走不了。”凯哥把屏幕转向她,指了指那条醒目的User-Agent记录,“解释解释?用公司服务器,挖矿我都能理解,挖星星是什么新型商业模式?”

姜芷走到屏幕前,仔细看了看那些日志,嘴角居然微微弯了一下。“被发现啦。我还以为至少能跑到年底。”

“跑?”凯哥气笑了,“你这叫跑?你这简直是在服务器坟头开星空演唱会,还每周两场,准时准点。行政部要是知道电费里有15%是用来给冰岛数据中心上供的,咱俩都得去写检讨。”

姜芷没接茬,她放下保温杯,在凯哥旁边的空椅子上坐下,手指在键盘上敲了几下。屏幕切换到了一个简洁的命令行界面。她输入一行命令,调出了一个正在运行的程序的实时输出窗口。

黑色的背景上,不再是枯燥的日志,而是一行行滚动的、散发着极客美感的调试信息:

[01:22:34] 正在渲染区域:ORION (猎户座)
[01:22:35] 加载星表数据... 完成 (1428颗恒星)
[01:22:36] 计算大气消光 (北纬40.2°, 东经116.3°)...
[01:22:37] 模拟光污染 (等级: 9/10, 可见星等: < 4.5)...
[01:22:38] 开始理论补偿渲染...
[01:22:45] 帧 1245 渲染完成。理论可见恒星数:2847
[01:22:46] 状态:同步路灯控制器 LAMP-12 亮度至 65% (模拟月光影响)

凯哥盯着那一行行滚动的字,尤其是“理论可见恒星数:2847”和“模拟光污染 (等级: 9/10)”,半天没说话。办公室里只有主机风扇的低鸣和姜芷保温杯里枸杞泡水微微晃动的声音。

“所以,”凯哥终于开口,声音有点干,“你每个星期花公司电费,就为了在半夜,用自己的工作电脑……不对,用我的归档服务器,算出一堆根本看不见的星星,然后把楼下的路灯调暗一点,假装有月光?”

“不是假装有月光。”姜芷纠正他,语气很认真,像在评审会上解释一个产品逻辑,“是理论上,如果这个地方没有光污染,这个时候应该能看到这些星星。路灯太亮了,把它们最后一点可能存在的痕迹都淹没了。我只是……在数据上,把它们‘修复’出来,然后让环境光稍微配合一下这个‘理论现实’。”

“修复……星星?”凯哥重复了一遍这个词,感觉自己的技术管理思维受到了挑战,“你这属于……数字环保?赛博公益?”

“属于个人爱好。”姜芷笑了笑,有点不好意思,“我以前学画画的时候,最喜欢画星空。后来转行写代码,发现能用另一种方式‘画’。就是挺耗算力的,我自己的笔记本带不动,正好发现这台服务器闲着。”

“闲着也不是给你这么造的。”凯哥习惯性地想板起脸,但目光扫过屏幕上那一行“理论可见恒星数:2847”,语气又缓了下来,“你就没想过,万一这服务器哪天要用了,或者被安全扫描扫出来……”

“我想过。”姜芷打断他,从兜里掏出一个小U盘,“代码和所有数据都在这里。如果你说不行,我现在就停掉进程,清理所有痕迹。服务器我也会恢复到原样。”她的眼神很坦然,没有祈求,只是陈述。

凯哥看着她,又看了看屏幕上那个执着地计算着“不存在星光”的程序。他想起自己年轻的时候,也干过类似的事——写过没什么用但自己觉得酷极了的脚本,在宿舍路由器上跑过稀奇古怪的服务,为了一个纯粹技术上的美感折腾通宵。

那些东西后来都没了。有的是被现实淘汰了,更多的是被他亲手删掉了,因为“没用”、“耽误正事”、“不成熟”。

他沉默的时间有点长。姜芷似乎理解成了默认的拒绝,伸手准备去关掉程序窗口。

“等等。”凯哥叫住她。

他拖过键盘,打开服务器管理界面,噼里啪啦敲了一阵。几分钟后,他把屏幕转向姜芷。

“这台测试服务器太老了,而且挂在关键网络里,不合适。”凯哥说,语气恢复了技术决策时的干脆,“我给你开一台新的,放在边缘资源池,算力比这个强,功耗还低点。地址和权限发你企业微信了。”

姜芷愣住了。

“别高兴太早。”凯哥瞪了她一眼,“第一,程序迁移过去,进程名给我改得像样点,别再用那种三脚猫的伪装。第二,所有外网请求,走我给你的代理通道,别再在访问日志里留那么明显的把柄。第三,也是最重要的——”

他指着屏幕上那句“光污染等级: 9/10, 可见星等: < 4.5”。

“把这个输出结果里的描述改改。”凯哥说,手指在桌上敲了敲,“太丧了,不符合……呃,不符合咱们技术团队的乐观主义精神。”

姜芷眨眨眼:“那改成什么?”

凯哥想了想,拿过键盘,在旁边的编辑器里飞快地敲下一行字,然后复制替换掉了原来那行输出。

姜芷凑过去看。

新的输出是:
[01:22:37] 模拟观测条件:极具挑战性。但根据模型,本地天区潜在可见恒星数量:无限。——至少在本程序的内存中如此。

她看着那行字,看了很久,然后抬起头,很轻地说了句:“谢谢凯哥。”

“谢什么谢。”凯哥挥挥手,开始关自己的电脑,“赶紧把你那摊子搬过去,别留痕迹。明天……不对,是今天白天,我还要用那台服务器呢。”

“好。”姜芷也站起身,手指在键盘上开始敲打迁移命令。

走到办公室门口,凯哥又回头,像是随口一提:“对了,你那个程序……渲染出来的星图,能看吗?我的意思是,图片。”

姜芷头也没抬:“能啊,实时渲染的,还挺漂亮。主要是精度高,我用了好几个公开星表交叉验证……”

“发我一份。”凯哥打断她的技术阐述,“截图就行。我看看你这电费烧得值不值。”

门关上了。

办公室里,姜芷一个人站在服务器屏幕前。黑色的终端窗口里,调试信息还在滚动。窗外,后厂村路的灯光依旧璀璨,将夜空染成一片模糊的橙红。

她看了看凯哥最后修改的那行输出,又看了看窗外。

然后她坐下来,继续敲打命令。这一次,她的嘴角一直微微上扬着。

几分钟后,凯哥在回家的出租车上,收到了姜芷发来的一张图片。

漆黑的背景上,缀满了密密麻麻、大小不一的白色光点,有些还带着淡淡的星云状晕染。图片角落有一行小字水印:“北纬40.2°,东经116.3°,理论星空。渲染于:一个服务器还没被关掉的深夜。”

凯哥放大图片,仔细看了会儿那片根本不存在于北京夜空的稠密星辰。

然后他点了保存,把手机收回口袋。

司机师傅从后视镜看了他一眼,搭话:“这么晚下班啊?你们搞IT的真辛苦。”

“是啊。”凯哥看着窗外飞速掠过的、千篇一律的路灯光芒,随口应道,“不过有时候,也挺有意思的。”

出租车驶入浓浓的夜色。远处,他们公司大楼的某一层,灯光悄无声息地熄灭了。

但某一台不起眼的服务器里,一场关于星光的计算,刚刚在新家安顿下来,继续它沉默而规律的运行。

仿佛某种秘密的、无用的、却异常坚韧的浪漫,终于在庞大的系统里,找到了一个漏洞,扎下了根。

最后修改:2026 年 01 月 29 日
游客大老爷,赏杯咖啡看看石粒,请随意赞赏!