7.5 负载均衡:别让炒股抢走你写代码的CPU
2018年冬天,一个在蚂蚁金服做分布式事务中间件的工程师请了三天年假。他跟他老板说的理由是“最近太累了想休息一下”,真实的理由是那周A股连续暴跌,他重仓的多只股票全部触发了他的心理止损线,他需要一个完整的时间块来“专心处理账户”。
那三天他在家做了什么?第一天早上,他打开交易软件,把所有持仓的K线图从头到尾翻了一遍,试图从技术形态上找到哪些该割、哪些该扛。第一天下午,他在股吧和雪球上刷了几百条帖子,试图从别人的分析里找到自己持仓的信心支撑。第二天上午,他打开Excel,把每一笔持仓的买入理由、当前亏损幅度、以及他收集到的所有利好利空消息全部列在一张表里,试图做一次“理性的决策矩阵分析”。第二天下午,他终于在极度疲惫中清掉了一半仓位,然后把剩下的仓位按照他认为更“抗跌”的标的重新分配了一遍。第三天,他躺在床上盯着天花板,感到一种比加班三天三夜还要深重的虚脱感。
他后来跟我复盘这段经历的时候,说了一句我至今记忆深刻的话:“我给公司写分布式事务框架的时候,每个事务分支都有明确的超时回滚机制,每个锁都有精确的持有时间上限。但我给我自己的股票账户写调度策略的时候,连一个时间片配额都没设。我的大脑CPU被一个低优先级的批处理任务占用了整整三天,而那个任务产生的输出,三天之后就被市场证明是错的。”
时间片的真实成本:你盯盘花掉的那一小时,标价不是你的时薪
计算盯盘成本的时候,大多数人的算法是这样的:我年薪六十万,时薪大概三百块。我每天花一个小时看盘,一年花了两百个小时,成本是六万块。这个算法在会计上是正确的,在经济学上是错误的。它只计算了你花掉的时间的账面工资,没有计算你用这些时间去做别的事情能产生的潜在收益——也就是机会成本。
你是一个软硬件工程师。你的职业赛道,是这个社会里极少数几个还能在三十五岁之前通过纯技术能力的提升实现收入倍增的赛道。你在一个高速迭代的技术领域工作,你每掌握一项新的技术栈——不管是Kubernetes的调度器源码,还是LLM的推理优化,还是RISC-V的微架构实现——你未来三到五年里的市场身价就会因为这项稀缺技能而永久性地跳上一个新台阶。
你今天花一小时盯盘,你表面上只是花掉了三百块的账面时薪。但如果你把这一小时用来深读一篇你收藏了三个月但一直没时间看的论文,你可能会在下次技术评审会上提出一个让架构组所有人眼前一亮的方案,这个方案会在接下来的晋升答辩里成为你“技术影响力”的关键证据。你花一小时盯掉的,不是你这一小时的三百块工资,是你未来三年可能因此涨薪二十万的边际可能性。这个可能性不是虚无缥缈的鸡汤,它在你的行业里每年都在真实地发生在那些把时间砸在技术深水区的人身上。
反过来,你盯盘的那一小时给你的投资带来了什么增量价值?你看到持仓跌了一点五个百分点,心里紧张了一下,打开股吧刷了几条帖子,又切回去看了一会儿分时图,确认没有再继续下跌,然后关掉软件。你的账户在这一小时里没有发生任何变化,但你大脑里那个本应该用来思考分布式一致性算法的缓存空间,现在被一堆你无法控制也无需控制的随机波动占满了。你不仅没有赚到钱,你还欠下了认知负债——你在接下来写代码的时候需要花额外的精力去抑制那些不断浮上来的“会不会继续跌”的杂念。
如果你过去三年花在盯盘和研究个股上的时间加起来超过了一千个小时,而你的股票账户在过去三年里的年化收益没有比简单的股债平衡组合高出哪怕两个百分点,那你这一千个小时的边际产出不是两个百分点的超额收益,是负的。你把同样的一千个小时用在任何一个和你主业相关的技术深水区上,产生的财务回报大概率比你股票账户里多出来的那两个百分点高出一个数量级。
加权公平调度:给投资分配一个固定的、有限的时间片
CFS调度器在设计的时候做了一个非常重要的假设:每个进程都应该得到公平的CPU时间分配,但公平不意味着平均。高优先级的进程可以得到更多的虚拟运行时间权重,而低优先级的批处理任务只需要在后台慢慢跑,不饿死就行。
你的投资活动,在你的人生调度器里,应该被分配什么样的优先级和什么样的时间片配额?它绝对不应该是一个实时进程——它不配。你不需要在开盘时间实时响应股价波动,因为你在第五章已经反复验证过,股价的日内波动和你持有的企业的长期价值变化之间没有任何因果关系。投资在你的任务列表里,应该是一个Nice值设得很高的批处理作业,只在系统空闲的时候被调度,而且每次运行的时间片是固定且有限的。
我给你一个可以直接照着做的调度配置:每周日下午两点到四点,是你处理一切投资相关事务的唯一时间窗口。这两个小时,你用来做四件事。第一,检查本周有没有触发的止损单或者再平衡阈值——这些应该是由你的条件单和季度规则自动处理的,你只是做一次事后确认。第二,如果你有新的资金需要部署,在这个时间窗口里按照你预设的资产配置比例完成买入操作,不需要择时。第三,如果你想研究某个新的投资标的或者某个新的策略思路,在这两个小时里做——不是在下周三的下午三点看到一篇公众号文章之后立刻打开交易软件去做。第四,如果没有什么特别需要处理的,这两个小时你可以用来读财报、读行业报告、或者只是把本周在技术工作中观察到的行业趋势记录到你的投资日志里。时间到了就关掉所有和投资相关的页面,直到下周日两点之前不再打开。
这个调度策略的核心设计理念只有一条:投资决策不应该在工作时间发生,也不应该在深夜你刷手机的时候发生。它只应该在你专门为它预留的、精力充沛的、不受其他任务干扰的时间块里发生。你在工作中被一个技术难题卡住的时候,切出去看一眼股票,你不仅解决不了那个技术难题,你也做不出一笔高质量的投资决策。你同时在两个线程上都跑了空转。
上下文切换的开销:你的大脑不是实时操作系统
实时操作系统和通用操作系统在调度上的最大区别,不是谁跑得更快,是实时系统尽量减少上下文切换。每一次上下文切换,CPU都要把当前进程的寄存器值压栈,加载新进程的上下文,切换内存映射,刷新TLB。这些操作本身不产生任何业务价值,它们是纯开销。
你刚花了一个半小时调试了一个极其复杂的并发Bug,你的脑子里装满了锁的获取顺序、临界区的边界条件、以及某次线程交错时可能出现的竞态窗口。你正处于对这个问题的深度理解状态——认知心理学管这种状态叫“心流”,它需要至少二十分钟的连续专注才能进入,而一旦被中断,重新进入的成本可能是十五分钟甚至更长。就在这个时刻,你突然想起今天有一只重仓股要出财报,你切到交易软件看了一眼——营收略低于预期,盘后跌了三个点。你心里一沉,回到IDE面前,发现刚才脑子里那个快要成型的Bug修复方案已经蒸发了。你不记得自己在切换之前推导到哪一步了,也不记得那个竞态窗口的触发条件里第三个参数为什么被设成false。
这个上下文切换的成本,不是你看盘的那三分钟,是你从深度工作状态跌出之后,重新进入所需要的二十分钟甚至更久。你一天切换三四次,你一天的有效深度工作时间可能被砍掉了接近一半。而你牺牲了一半的工作产出换来的那个“看到了营收不及预期”的信息,在你下周日的投资时间窗口里看,和今天下午三点看,没有任何区别。市场不会因为你提前三天知道了这个消息就给你打折,但你自己的工作产出会因为这三天的上下文切换损耗而实实在在打折。
更隐蔽的损耗发生在长期记忆和技能积累层面。深度学习一个复杂的技术领域——不管是操作系统的内存管理子系统还是分布式数据库的共识协议——需要的不是碎片化的浅层阅读,是长时间的、不间断的深度专注。你每一次被股市的短期波动打断,你不仅在损失当下的工作效率,你还在阻断自己向技术深处走的那条路。那条路一旦停掉,重新起步需要的启动成本比你想象中高得多。
你可能会想,那我用碎片时间来研究投资不就行了——上下班路上听听财经播客,午休时刷几篇券商研报,晚上睡前看看投资大V的复盘视频。这些碎片时间输入的信息,大多数情况下不但没有提高你的投资决策质量,反而给你注入了大量你在第五章花了整整一个章节去屏蔽的噪声。你听到了某个播客说“新能源板块已经调整到位”,你听到了某个大V说“这轮熊市可能还要持续半年”,这些声音在你脑子里互相矛盾,互相叠加,最后变成了一种模糊的焦虑——你觉得自己应该做点什么,但你不确定该做什么。这种焦虑不会帮助你做出更好的投资决策,但它会持续侵蚀你在工作时间里的专注力。
你的CFS调度器需要加一个硬约束:任何和投资相关的碎片化信息输入,也必须被限制在周日的那两个小时之内。不在周日下午打开的投资播客,不听。不是周日下午刷到的投资文章,不读。不是周日下午冒出来的投资想法,不执行。让投资线程在你的大脑CPU上按照预设的时间片安静地运行,用完了就挂起。把剩下的全部计算资源,还给那个真正能让你未来几年身价翻倍的主线程。