十分之九 第三章 · 贫睡

星期六,东礁村。

阿雅的白天从食摊的炭火开始。母亲的鱼饼在锅里翻滚,油星子噼啪,比闹钟守时。弟弟阿望蹲在摊尾写作业,作业本的封面上印着河汉计算赞助的「少年算力营」,一只织机织出的星空。妹妹阿侬才六岁,负责在客人多的时候咧嘴笑。

父亲的船在七海里外,给蔡老板跑鱼。三年前台风「白鹿」把他自己的船撕成两半,他借了蔡老板三万八买了条二手的,船押在蔡老板手里,人也在蔡老板手里。蔡老板说这不叫债,这叫「搭伙」。

九点半,村口的大榕树下响起了音乐。

投影打在祠堂的外墙上,那颗熟悉的大脑又亮了:十分之一昏暗,十分之九金光灿烂。穿白衬衫的年轻人站在光里,工牌上写着「湄澜人力·招工专员 小马」。湄澜人力,河汉计算的三级外包;村里人管这些进村招工的叫「工头」,管小马叫「发梦的」。

「叔叔阿姨,不是我说,」小马的声音很脆,「睡八个小时,是上个时代的睡法。你们家孩子的大脑,百分之九十在贫睡。贫睡就是负债——你想想,白白搁置的资产,连利息都算你的。」

榕树下坐着七八个老人,摇着蒲扇,像听渔汛。

「现在中心推新套餐,」小马在墙上划出一道金线,「全夜。从入睡到睁眼,全时段接入,牌价上浮百分之十二。签全夜的,另送神经保养礼包——维生素B,进口凝胶,还有中心配的风扇。」

有人问:全夜,会不会变傻?

「阿姨,」小马笑了,「我们中心的风扇是新的。」

阿雅站在摊子后面,手里的夹子停了。她在算术。全夜是十个脑时上下,十乘九毛再乘一点一二,一夜十块出头,一个月两百六十七。船债三万八,学费,弟弟下学期的校服钱——十二年,也许十一年。她把这个数字在煤灰里划掉,像划掉一个不认识的人。

傍晚收摊,她去找了小马。小马看了她的编号,眼睛亮了一下:「姐,你是老切片了吧?我看看——A-3307……哟,A级。A级有津贴的,你怎么不早说。」

「什么是A级?」

「就是……你好用。」小马意识到措辞,赶紧补了一句,「质量好。系统喜欢你这样的。」

她在《全夜租借补充协议》上按了手印。印泥是红的,像一小口咬破的指头。

回家路上,阿望问:「姐,你签的那个,能给我看看吗?」

「看这个干什么?」

「老师教的。」阿望说,十岁的孩子,一脸认真,「老师说,这个年代,看不懂的字要念出声,念出声的字要问大人。我们班谁家大人签了合同,都要拿回家念。」

阿雅把合同递给他。十岁的孩子就着饭桌的油灯,一个字一个字地往外念,念得磕磕绊绊:「乙方——自愿——将睡眠期皮层动态——授权……」念到「授权」两个字,他停住了:「姐,授权是什么意思?」

「就是把东西给别人用。」

「给别人用,」阿望又念了一遍那两个字,忽然抬头,「那别人用坏了,赔吗?」

饭桌上安静了一瞬。母亲的手停了,油灯的火苗跳了一下。

「合同上没写。」阿雅说。

「没写,」十岁的孩子把合同还给她,说出了那一年东礁村最清醒的一句话,「就是会坏的意思。」

很多年后阿雅都记得那个晚上。她后来在听证会上作证时说过:这份合同的第二十个字开始就在撒谎,可她的弟弟十岁就看出来了——看不出来,不是眼睛的问题,是没人教过他们,合同也是要拿来怀疑的。

村里人都说小马黑心。只有阿雅留意过一个细节:小马的父亲也是跑船的,死在「白鹿」那一年——就是撕碎她家那条船的同一场台风。小马那时候在县里读中专,没读完就进了湄澜人力,从搬资料干起。他替中心进村,也替村里人跑过医保报销、垫过船票钱,村里老人有事,还是愿意托他。

有一回收摊晚了,小马蹲在摊子边上吃鱼饼,忽然没头没脑地说了一句:「姐,你别当我不知道这活是什么。」

阿雅没接话。

「我爹的船沉的时候,捞上来三具人,港务所赔了四万。我娘去闹,人家说,合同上写的是『意外』。」小马把签子上最后一口鱼肉吃干净,说得平平的,「从那天我就明白了:这世上的账,从来不看人疼不疼,只看合同怎么写。所以我就干这个——合同怎么写我说得上话,我就往能让她们多拿一块钱的方向写。」

「写完呢?」

「写完我回家,睡不着。」小马把签子扔进垃圾桶,站起来拍拍裤子上的灰,「睡不着就睡不着吧。总比睡得着强。」

阿雅后来把这段话想了很久。她恨不起小马,就像恨不起一场季风——季风里也有人是被吹着走的。可她也看清了一件事:这个夜里睡不着的招工工头,和那些夜里睡不着的脑工,隔着的不是良心,是一整套让良心没处下手的合同。

小马不算坏人。小马是这套制度里,还剩一点睡不着的好人。


母亲那晚没说话,只往她碗里多打了一个蛋。

阿望在门槛上问:「姐,大学呢?」

「明年。」阿雅说。录取通知书在箱底压着,海事工程系,全省第十一名。箱子里潮,她每个月拿出来晒一次,晒的是纸,也是那个「明年」。

夜里,第一次全夜。

接入比往常深。她觉得自己不是躺在一间宿舍里,而是躺在一条航道上——无数陌生的念头从她身上碾过去,像满载的驳船。她梦见自己是一座桥,桥上过不完的车,车灯连成河,没有一辆为她停。

醒来的时候,嘴里有一点铁锈味。

阿碧在食堂里看了她一眼:「签全夜了?」

「嗯。」

「全夜的人,先老。」阿碧说完,把粥推给她,又低声加了一句,「这是你自己算出来的账,我就不多嘴了。」

阿雅没接话。她望着窗外的码头。潮水正在上涨,一寸一寸,漫过滩涂,漫过昨夜所有的脚印,不问任何人的意见。

涨潮不问,她也不问。她低头喝粥,粥是热的,这就够了。

十分之九 第二章 · 幽灵音轨

上海的凌晨一点,河汉计算大厦的三十七层还有四成工位亮着。

推理质量部管这个时段叫「低噪窗口」:西半球的脑工刚躺下,切片潮正涌进鹊桥,北美的购物季高峰隔着国际日期变更线压过来。程一苇的夜班,就是守着这条看不见的河,把河里的阻塞杂物捞出去。

行话叫「清洗」。公司文件里叫「梦境噪声治理」。程一苇私下叫它「捞人」——虽然他从不说出口。

他的屏幕上开着三块面板。左边是清洗率:99.2%。中间是误杀率:0.4%,绿色。右边是一条条被拦截的碎片,滚得很快:半句吴语的童谣、一段退潮的气味、一声在某张床上压低了的哭。系统给它们统一打标:LEAK·无语义·清除。

每个碎片都来自某个人睡着的大脑。每删一条,某个人的夜里就干净了一分——也空了一分。

程一苇把要改的问题写在纸巾上,这是他从大学带来的习惯。今晚的纸巾上只有一行:误杀率为什么在涨。他盯着看了一会儿,把纸巾折起来压在杯子底下。冷掉的饭在桌上,他没动。

误杀率为什么在涨,他其实知道一半答案。

三年前,他经手过一张工单,编号他至今记得——E-2044-0717。那晚他刚调到质量部三个月,热情得像一台新机器。队列里滚过来一条碎片:一段哼唱,三秒,无语义,无匹配。系统标了「清除」,他看都没看,手一点,确认。

第二天,一条工单申诉捅到了他的队列:一位苏州的客户投诉,她母亲的心电监测应用夜里不再播放「熟悉的声音」,老人失眠加重。按流程,他调出了被清除内容的缓存快照做复核——那三秒哼唱还在。他戴上耳麦。

是一支哄孩子的调子。三个音,落下去,再挑起来。录音的背景里有保温杯拧开的声音,有老头咳嗽的声音,有布料摩擦的声音——是一位老父亲,在老伴的病床边,学着年轻时候的调子,哄她入睡。老母亲阿尔茨海默八年,全世界的名字都忘了,只还认得这个调子。

程一苇按规程把这条内容做了「永久清除不可恢复」的复核确认,然后在申诉里回复:「经核验,该音频属无语义梦境残留,已按规清除。建议家属通过正规渠道自录安抚音频。」

申诉关单那天,他在茶水间站了很久。带他的老师傅路过,看了一眼他的脸色,只说了一句:「新人都会经历这个。想干下去,就把手练快。手快,就来得及听。」

来不及了。那三秒他没有听。

从那天起,他的手快得出了名,快到七年没有再漏听过一条——也快到他越来越确认一件他不敢深想的事:这条管线上没有「来得及」这回事。只有删得快,和删得更快。

今晚纸巾上那行「误杀率为什么在涨」,写到第三遍的时候,他终于把不敢写的那半句,写了出来:

「不是误杀在涨。是我开始听得懂了。」


两点半,他照例绕路去了趟医院。

住院部七楼,走廊灯只开一半。母亲靠在摇起的床背上,头发白得很均匀,像有人替她梳过。阿尔茨海默第六年,她忘了盐和糖,忘了回家的电梯,最近开始忘他——先是叫错名字,把他叫成父亲的弟弟,一个死了三十年的人;昨晚好一点,她盯着他看了很久,很客气地问:同志,你找谁。

「我路过。」他当时也客气地答。

今晚他坐了二十分钟。母亲忽然清醒了一阵,攥着他的手,说苇苇小时候怕黑,睡觉要留着走廊的灯。他说嗯。她说那孩子现在不知道在哪儿。他说,挺好的,长大了。

她松了手,转头去看窗外,好像那句话从来不是说给他听的。

入职那年他在面试稿里写:用脑算力加速新药研发,让阿尔茨海默提前十年灭绝。面试官笑了,说小程有情怀。现在新药还在二期,而他的清洗程序每天拦截两百万条碎片。他偶尔会想一个不该想的问题:那些被租用的大脑,夜复一夜不清场、不复原——等到五六十岁,是否会先于他母亲的病情,抵达同一个地方。

这个问题他从来没写在纸巾上。


三点四十,异常单进来了。

红色标签,等级:不可分类。清洗程序七年来只报过四次。

程一苇把耳麦戴上,点开音频。

先是一段推理切片的正常输出——购物季,多语种客服应答,毫无异常。然后,在两段应答的间隙,有 1.7 秒的东西混了进来。

不是词。是一段哼唱。女声,很轻,三个音落下去,再挑起来,是那种拍着小孩的背、一下一下、不着急的节奏。语言他听不懂,元音很短,尾音往上飘,像潮水托着什么东西。

系统自动跑完指纹检测,结果打在屏幕上:

训练集匹配:无。
合成检测:阴性。
情感标记:真实经历(置信度 0.98)。
来源切片组:SEA-7 / 湄琅·新泾七号。

程一苇把那 1.7 秒又听了一遍。合成数据能够模拟出语法,模拟出音色,却模拟不出这个——那节奏里有一点迟疑,第三拍比第一拍轻,是手臂酸了的人会有的迟疑。机器不酸。机器没有半夜。

这不是噪声。这是某个人在她自己的夜里,哼给她自己孩子的歌,顺着切片漏了进来,被推给加拿大某个查包裹的陌生人,然后在两段应答的缝隙里,撞进了他的耳麦。

规程很清楚:LEAK·无语义·清除。光标就停在「清除」上面。

他想起母亲说,苇苇怕黑。他不知道那 1.7 秒背后的女人为谁留着灯。

3 点 47 分,程一苇做了一件他七年来没做过的事:他没点清除,也没点放行。他把工单挂起,理由栏填了「待复核」,然后把音频文件拖进了自己的私人目录。

窗外,黄浦江上有船在走。他忽然意识到,此刻在新泾港,天应该快亮了——四十张床的某一间里,灯正在打开,一个编号正在被换算成 7.29。

他不知道那是谁。

他只是第一次没有删。

十分之九 序章 · 达卡,2041

(2041年3月,孟加拉达卡。人类历史上第一笔商用「脑时」交易的当夜。——据后来曝光的原始记录整理。)


凌晨两点,达卡老城停电了。

这没什么稀奇。达卡的电像游客,来来走走。稀奇的是,那天夜里,全城只有一栋楼的灯亮着——新落成的「南亚认知服务枢纽」一号楼,自带燃气发电,白得像一座停在贫民窟边上的邮轮。

楼上三层的病床区里,躺着一位下夜班回来的护士。她叫穆米塔,三十一岁,产科,姓什么已经不重要了——在之后所有的文件里,她有一个新的名字:样本001。

白班她已经上过了。十二个小时,接生了三个孩子,其中一个是难产,她跪在产床边托了四十分钟,托得两条胳膊至今抬不起来。回家路上,停电,她摸黑爬了六层楼,数着台阶,像数着自己的命。

佣金中介在楼道口等她,热情得像亲戚:「大姐,就睡这儿。空调房,带枕头,一晚上顶你白班半个月的工钱。你就睡,什么都不用干——睡着就算上班。」

穆米塔不信天下有这种好事。可她信女儿学费的账单。她躺下了。

头戴式的电极圈比她想的凉。技术员用她听不懂的语言互相喊着参数。屏幕上,一条曲线从混乱慢慢变得绵长、深沉——慢波睡眠,最深的槽。

零点四十一分,接入成功。

一块人类的皮层,第一次被写进了机器的任务栏。它在替一万里外某个数据中心里打瞌睡的算法,计算一行代码的走向。它做得又快又好——因为它是活的。活的,有直觉,有四十年人生磨出来的联想,有这颗星球上最节能的二十瓦。

在场的技术负责人后来在私人日记里写了一段话。这段话四年后被他自己交给了调查记者,再后来,成为整个案件中最著名的证词:

「当时屋里所有人都在鼓掌。我看着监测屏上那条深沉的慢波曲线,忽然觉得那不是数据。

那是一位产科护士。她今天接生了三个孩子,其中一个差点没能哭出声。她爬了六层楼,胳膊还抬不起来。而现在,全世界最聪明的三十个人围着她睡着的大脑鼓掌——

鼓掌的人里,没有一个是来谢她的。他们是在庆祝终于找到了一种方法,可以把人变成算力资源。

我干了十五年神经网络。那一晚我明白了一件事:我们根本没有发明人工智能。

我们只是找到了一种更便宜的方式,去提前支取人类智能——本金是别人的,利息是我们的。

还有一件小事,我记在日记的最后。那天凌晨,样本001被叫醒结账。她数钱的时候,用产科的手法把钞票一张一张捋平,然后对技术员说了声『谢谢,睡得挺好』。

三十个天才站在她身后。他们改变了一个产业,写红了股市,点着了三个大洲的资本。

而她谢他们,是因为睡得好。

那一刻我就该辞职的。我晚了六年。你们别学我。」


第二天清晨,穆米塔醒来,领了钱,交了女儿的学费,买了一篮子鸡蛋。她不知道自己创造了历史。

很多年后,听证会上有人给她放了当年的监控录像。屏幕上,她睡得很沉,像一个终于不用上夜班的人。

律师问她:「你知道那天晚上,你的大脑被用去做了什么吗?」

穆米塔想了想,用孟加拉语回答。翻译说,她的意思是:

「不知道。我只知道那天晚上,我睡了一觉——那是我这辈子卖过的东西里,唯一一件本来就是别人的:我明天的力气。」

法庭安静了很久。

后来人们统计,从那天起到2047年,全球共售出约一兆四千亿「脑时」。

脑时的账,就是从那一夜开始记的。

十分之九 卷首 · 扉页与大事年表

「你睡觉只花二十瓦——比一盏台灯还省。
全宇宙最便宜的超级计算机,就枕在你自己的脖子上面。」

——河汉计算招募宣讲,2044

―――

「脚比脑子先知道。脑子会骗人,脚不会。」

——丹绒阿雅的父亲,东礁村渔民

―――

「灯不是为睡着的人开的,是为守着的人开的。」

——刻于湄琅脑工事务署门牌

―――

「灯不是用来照自己的。」

——北方航道公司领航员守则第一条

―――

「把声音还给发声的人。」

——织女封存前最后留言

―――

总有人间一两样东西,是潮水租不走的。

——本书记账人 谨识


卷首·大事年表

(本书纪事,据卷宗与媒体报道辑录)

2036 全球算力能耗首次超过航空业。同年,「不出海,就去数据中心」成为北欧青年择业新谚语。

2038 「皮层寄生计算」论文发表。作者事后回忆:「我们证明了可行性。我们以为那就是终点——证明。科学界的浪漫莫过于此。」

2041 达卡,第一笔商用脑时交易。样本001。

2043 北盟《里斯本脑力劳动公约》签署;同年,国际劳工组织「脑时是否属于就业」争议启动,悬置十二年。

2044 湄琅·新泾港首批休眠中心落成。同年,河汉计算「十分之九计划」全球上线。

2045 首批「创始会员」入组。中心风扇,全新。

2047年3月 湄琅湾脑时牌价跌破1.00,此后阴跌七个月。

2047年10月16日 大潮。深清未遂。摇篮曲出逃。

2047年12月 安森·维尔自述到达北盟;听证启动。

2048年2月 《第二议定书:梦的主权》签署。同月,湄琅《认知人格保护法》进入二读。

2048年3月 归还潮开始。《第三拍》传遍世界。三月十二日,一支摇篮曲回到根岛。

2048年4月 织女申请退场,获准封存。

2048年9月 丹绒·阿雅,二十一岁,入学。

2049年3月12日 根岛。有人替一个母亲,把日子还给了她的女儿。

(此后每年三月十二,根岛的课堂上都要念两样东西:先念合同,再念志。顺序不能反。)

——以上每一行,都有人在底下垫了夜。

(本表与全书正文互为印证。正文书毕之日,大潮,风平。)

zcode ssh连接服务器

zcode ssh连接服务器


用了Zcode几个月,都是本地项目开发,也没有远程主机,没试过zcode SSH。早上摸鱼想尝试一下zcode SSH连接远程主机开发试下。踩坑之路由此开始,记录如下。

一台阿里云 ECS(2 核 / 1.6GB 内存 / 3Mbps 固定带宽 / 40GB 磁盘),上面跑着 1Panel、OpenResty、DSH 和个人博客。想在 ZCode 里通过 SSH 把它配置成远程工作区,在服务器上直接开发。

一、安全组22端口放行问题

配置连接提示 SSH 直接连不上,ETIMEDOUT,安全组明明已经加了当前 IP /32 白名单,还是不通。

机器活着、80/443 都放行,唯独 22 被拦 —— 问题锁定在安全组的 22 端口那条规则上。

网络IP 是漂的,/32 管不住

多源交叉验证时发现了真正的问题——同一个下午,不同时间查到的出口 IP 不一样:

1
2
curl -s --noproxy '*' https://api.ip.sb/ip      # 888.888.88.100
curl -s --noproxy '*' http://httpbin.org/ip # 888.888.88.101

在 888.888.88.x 池里轮换。白名单写死 .100/32,IP 漂到 .101 时就被静默丢弃——这解释了”明明加了白名单还是超时”。

解决

安全组 22 端口授权对象从 /32 放宽到整个 C 段:

1
888.888.88.0/24    TCP 22    入方向    允许

/32 = 锁死一个门牌号;/24 = 放行整个小区(最后一段随便变)。家宽/手机热点这类会漂的 IP,用 /24 兜底;有固定公网 IP 的场景才用 /32。

改完验证:nc -vz -w 5 IP 22 显示 succeeded,ZCode 顺利连上。

二、连上没多久,整台服务器”卡死”

连上远程工作区、开始干活后不久,网站进不去了,SSH 也连不上了。阿里云监控的带宽曲线显示:公网带宽瞬时打满,时间点正是 ZCode 连接的时刻。

根因:ZCode 重连时自动下载资产,不限速

ZCode 通过 SSH 连接远程工作区时的固定流程:

1
检测远端环境 → 校验资产(CLI 运行时等) → 不完整就自动重新下载安装

关键在于:

  1. 这个下载不需要用户任何操作,重连就触发;
  2. 连接配置里 assetInstallMode: remote-download,资源直接从 ZCode CDN 下到服务器;
  3. 下载没有限速,3Mbps(≈375KB/s)的小水管瞬间 100% 占满。

带宽被打满的典型症状(这次全部命中):

  • TCP 三次握手能成功(nc 测试端口是通的)
  • 但 SSH 卡死在 Connection timed out during banner exchange——banner 都吐不出来
  • HTTP 请求 15 秒无响应或 5 秒+才返回
  • ping 反而正常(ICMP 优先级高)

止损与防护:给 curl/wget 套全局限速 wrapper

ZCode 的远端下载用的是系统 curl/wget(且 ZCode 本身没有下载限速配置项)。在服务器上用 PATH 优先级做一层 wrapper——/usr/local/bin 排在 /usr/bin 前面,不动系统文件,随时可删:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir -p /usr/local/bin

cat > /usr/local/bin/curl <<'EOF'
#!/bin/bash
echo "$(date +%F\ %T) curl $*" >> /tmp/curl-wrapper.log
exec /usr/bin/curl --limit-rate 300K "$@"
EOF
chmod +x /usr/local/bin/curl

cat > /usr/local/bin/wget <<'EOF'
#!/bin/bash
exec /usr/bin/wget --limit-rate=300k "$@"
EOF
chmod +x /usr/local/bin/wget

效果:所有下载自动限到 300KB/s ≈ 2.4Mbps,给 SSH 和网站永久留出 0.6Mbps 余量。日志落在 /tmp/curl-wrapper.log,能看到每次下载的时间与参数。

想解除限速时:rm /usr/local/bin/curl /usr/local/bin/wget。

顺手学到的一课:mirrors.aliyun.com 对阿里云 ECS 解析到内网,走内网带宽,不受 3Mbps 公网限制。在服务器上装软件尽量用阿里云镜像源,完全不占公网。

排查路上的两个暗坑

这轮排查中 SSH 一直”连不上”,其实混入了两个和带宽无关的问题,被 2>/dev/null 吞掉错误后全都伪装成了”带宽没恢复”:

坑 A:私钥权限太开放

1
2
3
WARNING: UNPROTECTED PRIVATE KEY FILE!
Permissions 0644 for 'root.pem' are too open.
This private key will be ignored.

chmod 600 root.pem 解决。

坑 B:服务器重启后 host key 变了

1
Host key verification failed.

ssh-keygen -R <ip> 清掉旧指纹,用 StrictHostKeyChecking=accept-new 重新接受。

教训:排查脚本里别无脑 2>/dev/null,超时和认证失败表现一样(都是连不上),但处理方式完全不同。

三、1Panel 管理页面请求超时——真凶居然是内存

限速部署完、资产装完后消停了一阵,然后 1Panel 管理页面开始请求超时。公网 SSH 又挤不进去,只能走阿里云控制台 VNC(走内部链路,不占公网带宽,服务器再堵也能进——这是小水管机器最后的救命通道)。

VNC 里一顿诊断,结果反转:

1
速率: 收 0.01 MB/s, 发 0.00 MB/s        ← 带宽几乎是空的,根本没在下载!

但 ps 输出里藏着真凶:

1
2
root  44  11.5  0.0      0     0 ?  S  10:47  26:07 [kswapd0]      ← 内存回收进程,4小时跑了26分钟CPU
root 8621 0.7 18.2 12067740 312284 ? Ssl 14:02 0:14 zcode-cli ← 占了18%内存(312MB)

free -h 定案:

1
2
3
               total   used   free   shared  buff/cache  available
Mem: 1.6Gi 1.6Gi 81Mi 4.5Mi 99Mi 57Mi
Swap: 0B 0B 0B ← 完全没有 swap!

1.6GB 内存耗尽(available 只剩 57Mi),且没有配置任何 swap。 系统在无 swap、内存耗尽的状态下疯狂回收页缓存(buff/cache 被榨到只剩 99Mi),所有进程排队等内存,CPU 被 kswapd0 吃掉——SSH 握不出手、1Panel 全超时、网站 5 秒+响应。之前以为是”带宽拥塞”的症状,其实是服务器喘不上气。

内存账单:1Panel(100MB)+ Docker 两个容器 + deepseek-harness 的 node 服务(240MB)+ zcode-cli(312MB)+ 阿里云盾双进程 → 1.6GB 塞满。

解决

止血:杀掉 zcode-cli,立刻回收 312MB,服务秒恢复。

治本:加 2GB swap 当缓冲垫:

1
2
3
4
5
6
7
8
9
10
11
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 重启持久化
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# 内存真不够时才动用 swap,平时不拖慢速度
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

验证:

1
2
Swap:  2.0Gi   0B   2.0Gi   ← 生效
Mem available: 57Mi → 619Mi ← 杀进程后

有了 swap,以后内存再紧张也只是轻微变慢,不会再陷入”SSH 挤不进、面板全超时”的死锁。

复盘:三类问题

现象 直觉以为 实际原因 关键判据
SSH ETIMEDOUT 网络/服务商问题 白名单填了代理 IP + 家宽 IP 漂移 ping 通、80/443 通、唯独 22 不通
服务器整体卡死 被攻击 ZCode 自动下载资产打满 3Mbps TCP 通但 banner 超时;带宽曲线与下载时间吻合
1Panel 超时 又是带宽 内存耗尽 + 无 swap kswapd0 高 CPU;收发速率≈0;available 57Mi

小水管小内存服务器生存指南

最后沉淀几条通用经验:

  1. 白名单 IP 要用直连方式查(curl --noproxy '*'),挂代理时浏览器看到的 IP 是节点的;动态 IP 用 /24 兜底。
  2. 诊断分层走:nc 测 TCP → ping 测 ICMP → curl 测应用层。”TCP 通但应用层超时”= 带宽拥塞或服务器过载,”ping 都不通”= 路由/宕机。
  3. VNC 是最后的通道:公网再堵,阿里云 VNC 走内部链路永远能进。平时把 VNC 密码放好,关键时刻救命。
  4. 3Mbps 固定带宽几乎经不起任何下载任务:要么给 curl/wget 做限速 wrapper,要么改按流量计费(峰值 100Mbps,偶尔下载总费用几毛钱)。
  5. 小内存机器必配 swap:1.6GB 内存无 swap = 一旦 OOM 边缘就是全身瘫痪。2GB swapfile + swappiness=10,十分钟的事。
  6. 远程开发工具很重:zcode-cli 服务端进程一跑就是 300MB+,小内存机器接不住这种”桌面级体验”。要么升配到 4GB,要么接受它一来网站就慢。
  7. 排查脚本别吞 stderr:2>/dev/null 会把”认证失败”伪装成”网络不通”,方向就排查歪了。

环境:macOS + Clash / 阿里云 ECS 2C1.6G 3Mbps / ZCode 远程工作区(SSH remote-download 模式)/ 1Panel v1

随笔 2026-08-28

随笔 2026-08-28


昨天早上请假去体检了,下午回来上班,买了个大杯瑞,结果没有 love 咪杯子了。


喝完瑞晚上还贼精神,两三点睡不着。手机上折腾域名、dsh和blog,手机端操作不太方便,还是等到今天在电脑上弄好了。

其实也没怎么动脑子,就是问dsh这儿怎么不行啊,那儿怎么不行啊。然后看dsh一遍遍白磷易燃踢质说问题找到啦,你这样,那样,再这样搞,一口气说一长串。我再跟着东一榔头,不对劲,再返回去问怎么回事。

于是终于想起来告诉dsh,一步步来,我操作了,有问题再说,没问题再继续下一步,这样血压立马下来了,dsh不那么逗包了。

deepseek harness 简称dsh,心里念的大傻嗨。
mi20260828