平均交易额不到二十美金,但並发量极大。
尖峰时段每秒钟涌进来的请求数可以到几百甚至上千。”
陈浩在白板上画了一条时间轴,標註了流量曲线。
“这种场景下,nt的iis中间件层会发生什么?”
他转过身看著玛斯克。
玛斯克没有回答,眼睛盯著白板。
陈浩继续在白板上写。
“windows nt 4.0的iis,底层的线程调度模型是基於i/o完成埠。
理论上这个机制在处理中等並发量的时候效率不错。
但是它有一个天生的短板,那就是內存管理。”
他画了一个內存分配的示意图。
“nt的內核在处理大量短生命周期的tcp连接时,每一次连接建立都会分配一块非分页內存池。
连接关闭之后,这块內存的回收依赖於內核的延迟回收机制。
在正常负载下,回收速度跟得上分配速度,没有问题。”
他在示意图的右侧画了另一条曲线,標註了“高频並发”。
“但在每秒数百笔支付请求的场景下,tcp连接的建立和断开速度远超內核回收的节奏。
非分页內存池会在短时间內被耗尽。
一旦非分页池枯竭,nt內核不会优雅地降级。
它会直接蓝屏。”
陈浩在白板上画了一个大大的方块,里面写了“bsod”。
“整台伺服器直接死掉。
这不是性能下降,或者响应变慢。
而是整个作业系统层面的崩溃。
更可怕的是,这个问题不是单点的。
如果你用nt做集群,负载均衡器把流量转到备用节点。
备用节点在同样的高並发下,同样的內存耗尽逻辑,同样会蓝屏。
所有的机器在几分钟之內全部死掉。”
他把马克笔放回架子上,转身看向三人。
“这不是我编出来的假设。
去年hotmail被微软收购之后,从freebsd迁移到nt,第一个圣诞节就出了大规模宕机。
原因就是非分页內存池耗尽。
几千万用户的邮箱服务中断了將近八个小时。
微软的工程师花了三天才把系统完全恢復。
hotmail处理的不过是邮件收发,不涉及资金流转。
你们做的是在线支付。
用户的钱在你的系统里流动。
如果在交易高峰期,系统蓝屏了,用户的转帐扣了款但对方没收到,你觉得被宝还会被用户信任吗?”
会议室里没有人说话。
马克斯·列夫琴对於这个问题有些猜想,但是没有像陈浩解释的这么清晰。
他曾经想和玛斯克討论下,最后都会变成爭吵。
皮特·蒂尔的眼睛一直盯著白板。
他是法律和金融背景,技术细节他插不上嘴。
但陈浩刚才描述的那个灾难场景,从风险管理的角度来看,足以让任何一个公司老板崩溃的。
玛斯克的表情很复杂。
他想反驳,但他找不到切入点。
hotmail迁移nt后宕机的事情他听说过,当时他没太在意,认为是微软的运维团队不行。
但陈浩把问题追溯到了nt內核的內存回收机制上。
这是作业系统设计层面的缺陷,那就不是运维能解决的。
“这类致命缺陷不只是这一个,如果需要,我还能够找到很多。”
陈浩看著玛斯克,继续增加骆驼上的稻草。
“每一个对於在线支付这样的场景,都是毁灭性的问题。
所以,在技术架构这个问题上,你错了。
不是皮特和马克斯在故意跟你作对。
他们的直觉是对的。
把整套支付系统押注在windows nt上,等於把公司的命运交给了一个全是bug的作业系统。”