致光大:这个世界出了故障,一般拔电源没用

知乎日报 知乎用户 303℃ 评论

致光大:这个世界出了故障,一般拔电源没用

图片:Ragnar Jensen / CC BY

光大证券事件停止真的是靠拔电源吗?

知乎用户,借题发挥小化肥

简短回答问题的三行:

第一行:不可信。
第二行:一般情况下,程序不会停都停不住,很快就跑完了交易,来不及停倒有可能。
第三行:真出现程序停都停不住的状况,IT人员有超过10种办法解决这个问题。拔电源是比较笨,慢,难的办法。而且只有专业人员才有能力拔电源,但没有专业人员会这么傻,所以不可信。

我刚才看到了这条同样内容的微博 http://weibo.com/1651428902/A5m6xABmh ,边吃饭边把接近400条评论都看了一次,里面只有不到十条评论是靠谱的。借题发挥是我的爱好,就列个八股文的概要吧:

1) 不熟悉设备的人连机器都找不到,怎么拔?
2) 电源比萝卜还难拔!
3) 有UPS也没用!
4) 程序会停不下来吗?
5) 真出了程序停不下来的情况,除了拔电源,还有什么办法?
6) 拔网线vs拔电源线
7) 其他

1) 不熟悉设备的人连机器都找不到,怎么拔?

我们来看看事件的时间点:2013年8月16日上午11:05:08-10秒的时候,生成了26082笔预期外的委托订单。在11:07分,发现有异常,开始卖出IF1309空头合约。也就是说,如果真的要拔电源的话,是在11:05-11:07这两分钟内完成的。

大家可能有个误会:交易用的服务器就好像我们平时工作的电脑那样摆在桌面,近在咫尺。出事了,风紧,扯乎,扯电源!趴的一声设备掉电,整个世界恢复了平静...

但实际情况是:桌子上的电脑一般只用来发发邮件,写写文档,装个终端软件连接到交易用的服务器上进行交易而已。运行证券交易(以下简称应用)的程序服务器都在机房里面。机房不可以随便进,有各种门禁(常见的有密码,电子卡锁,掌纹指纹等,科幻电影中的什么语音虹膜的很少见)。进机房要打申请,要换拖鞋或者戴鞋套套。机房对温度湿度洁净度都有各种要求,着火了就喷七氟丙烷、IG-541。没事闲人免进,有事需要进去的话,好多机房也规定要有客户的维护人员跟随。只跟证券打交道的交易员可能买卖股票基金期货一辈子都没机会进机房,没见过这些服务器。这很正常的,钱钟书说过类似的话:大家吃了一辈子鸡蛋(大致是鸡鸡的大姨妈),也很少人把玩过鸡的泄殖孔嘛...

退一步来说,交易员就算进了机房,也会找不到设备:证券公司的机房虽然比较小,但一般十个八个机柜几十台设备还是有的。不懂IT的交易员,连哪台是服务器,哪台是存储设备,哪台是网络设备都未必能分清楚。不是专门维护的人员,就算我这种老油条,可能认得出所有的机器型号,也找不到对应某个应用的设备是那台。所以如果真有拔电源的事,只有光大内部IT维护的人员才能找到机器。交易员通知到IT维护人员,还要找到机器,2分钟,够不够?

2) 电源比萝卜还难拔!

再退一步,就算设备上面有猪头大的标签“ETF套利专用设备”,业务人员冲到这台设备前面,想拔电源,也未必能找得到电源的位置:电源有的在前面,有的在后面,有的要把挡板卸掉才能拔。----电源不是你想拆,想拆就能拆 ,让我挣开,让我明白, 放手你的唉。

下图IBM服务器的双电源:

下图HP服务器的双电源 (一号电源已经被拔出来了,二号电源还装着,亮绿灯证明有加电)
证券公司还好了,一般也就是中低端小型机(记忆中光大好像有IBM也有HP的设备,不知道具体本次事件相关的应用在什么设备上,当然还有可能在x86的服务器上)。如果是银行的核心主机,很多是大型机,或者是最高端的小型机,电源大约在下面这个图的位置(整个服务器接近两米高),没经过训练,要拔都不知道怎么拔。一般来说,用户都不懂,也不需要懂如何拔电源,这些都是专门的原厂硬件工程师的干活。


仔细想想:其实拔电源这个词也是很模糊的词,可以有几种理解

1. 把电源模块残暴地从服务器中拔出来。
在大家用的家用电脑上,由于电源是用螺丝固定在机箱上的(此处鸣谢@孙悟睡指出我之前写的固定在主板上的不严谨说法),所以基本上无法实现拔出来。但在专业服务器上面,电源模块是可以在机器运行的时候更换的。当然这里面有很多学问,比如有的机器拔了电源之后如果3分钟内不把一个新的插回去的话,机器就会整个断电。硬件工程师每次换的时候都生死时速的样子。
2. 把电源线从电源模块中拔掉,这个比较好理解。
3. 电源上面一般都有开关,可以直接断电,这个也比较好理解。

电源拔出来了之后是这个样子:

3) 有UPS也没用!
这是最常见的误解,之前的微博里面UPS这个词至少出现了50次,大家都在说,拔了电源机器就停了吗?不是有UPS(Uninterruptible Power System ,不间断电源)吗。这个反驳还真是错的。

这文章反馈不咋的,实在没心思详细写了,也懒得贴图了,简单来说,从市电到服务器之间的强电相关链条是这样的:
市电
<----UPS在这里
电源列头柜
机柜对外防水插头
机柜PDU
<----要拔的电源在这里
服务器电源

拔了下游的电源,上游的UPS怎么能有作用呢?普通服务器上面又没电池,一拔就玩完,UPS鞭长莫及徒呼奈何。

4) 程序会停不下来吗?
看《环太平洋》的时候我都想吐槽了,这么先进的机器人居然要拔电源?科幻片就算了,光大这事件可是真实事件,真以为是天网作乱,智能机器人造反,只能拔电源吗? 小时候看了卫斯理的《笔友》和《怪物》还真有点担心电脑作乱。真进入了这行之后才知道,放心,以现在广泛应用的电脑的智力,人类照顾少点电脑都会死,更不要说作反了。想想,一个有五千年历史的老妖(人类),养了一个七十年的萝莉(计算机),要造反?相当于70岁的妈妈照顾1岁的婴儿,小宝贝别说造反了,喂少一口奶都不行,走开一会还怕她乱滚滚到床底下呐...

扯远了,刚才@宋思源 在另一个回答中@我,提到套利触发没法终止。如果是运行时间很短,迅雷不及掩耳之势就完了,来不及终止,这很正常。但我的这篇文章是针对新闻中的说法“停都停不住只好拔电源”,这证明程序是一直在运行。可能在程序开发者角度没法终止,但在系统管理员角度,用系统命令杀进程,怎么会杀不死?毕竟,这运行的是高频交易软件,不是病毒啊;特别如果这软件运行在UNIX/Linux下,那就更不太可能停不下来了。就算正常的关闭方式不行,杀进程啊,一条kill -9 PID命令就都能杀掉99%的应用进程,有一堆进程就结合awk嘛。再不行,直接就一条命令马上关机:IBM AIX用halt -q , HP-UX用haltsys , 还有 poweroff, bye, shutdown, init 0之类一大堆咒语,触命令,尽死;立仆,无御之者。

来点闷的:直接杀掉了进程之后对交易有什么影响? 从交易系统或者中间件设计的角度,有个很重要的原则就是ACID (原子性Atomicity 一致性Consistency 隔离性Isolation 持久性Durability) ,A和C保证了应用系统不会受影响,只是某些交易会失败。

每次看到程序停不下来,我就想起这位不幸中的万幸的老兄:丰田定速巡航失控时速130公里狂奔1个半小时(图)

5) 真出了程序停不下来的情况,除了拔电源,还有什么办法?

拔电源最大的风险是系统可能出现不一致,包括数据库不一致,文件系统不一致等等,原因是内存中的一些数据还没写回到硬盘中,最终会导致系统崩溃起不来。当然,OS在设计的时候已经考虑到这些问题,比如AIX的JFS+fsck,Linux的reiserfs来实现系统断电自动修复方面比较安全,但Linux的ext2/3好多时候需要手动修复,还不一定成功。这个话题展开可以出一本书,这里就不多说了。一句话就是拔电源是非正常关机,有风险,应该尽量避免。

而且,我们把场景需求设定在只中断这台服务器,而不是中断整个机房对外的服务。我一拍脑袋就可以拍到以下办法:

  1. 在服务器上用命令杀程序进程。
  2. 在服务器上用命令直接关机。
  3. 在服务器上用命令把网络服务,网卡停用,或者修改IP。
  4. 在服务器上,按关机按钮,UEPO开关。(变相的拔电源)
  5. 在服务器上,拔网线。
  6. 在机柜PDU上把供电关掉。(变相的拔电源)
  7. 在电源列头柜上把输电关掉。(变相的拔电源)
  8. 在网络设备(路由器/交换机/防火墙/F5/DNS等)把这台设备的网络链路断掉。就这一句就可以化出另外10种方法了。


看上去以上方法都是可以的,在网上各种讨论里面也被反复提出,但真的这样操作就可以吗?答案是不一定,在第七部分会详细讲述:拔电源拔网线就不能工作的服务器就是渣渣。

6) 拔网线vs拔电源线

从日常电脑使用的角度,好像听上去真的是这样:拔电源这么麻烦,还可能有数据丢失的风险,拔网线多简单,一拔就无法往外发数据,系统也不用关,回头插回网线就随时能恢复,多好。但实际上,在很关键的系统,拔什么都没用。因为正常的设计是:拔一个电源拔一条网线,系统都能继续运行。这是一种系统很重要的指标,叫做高可用指标,使用的是高可用技术。

高可用技术主要分为三个层面,第一层是服务器本身的高可用,比如内存用ECC,硬盘用RAID,配备双电源等等,关键部件都有两份,坏了一份服务器还能跑。不过考虑到在关键部件都坏了整台设备都垮了的情况下,就需要用到第二层:双机高可用技术,就是用另外一个设备,一般叫做冷备机/热备机顶上。(以下讨论只基于最常见的两台机器组成的高可用系统,两台以上的相对罕见,略)

在高可用技术下,拔单机的电源不会影响应用,因为IBM用的HACMP,HP用的Service Guard之类的双机软件,最善于应付这种拔电的状况。电源一拔,备机马上就开始切换,一般中间会有几十秒到几分钟的中断。这时候业务部门发现怎么电脑突然慢了,但切换完毕后备机顶上后,应用很快就回复正常了,业务部门也不会太在意,不知道其实出过问题又被解决了。

我碰过很搞笑的状况:配好的双机系统,系统掉电了自动切换了系统管理员都不知道,运行了一个多月我去现场无意中发现主机名变了,再仔细查查才发现居然已经切换到另外一台服务器上了。后来在我的撺掇下,领导当然是把坏事当好事宣传了:xxx第一时间赶赴现场,在领导的大力关注下,力挽狂澜,敲下了重要的命令,基于优秀的管理水平,解决xxx,化坏事为好事,xxx情绪稳定,再次体现xxx是一支来之能战战之能胜的训练有素的队伍,迅速,立即,有序,精干,全力以赴,难度很大,全力救援….

有趣的是,在个人电脑上,拔电源和拔网线效果差不多,都是系统马上就不能运作了。但在双机系统中,如果只拔一台机器的线缆的话,拔网线还没拔电源那么立竿见影来切换。因为如果只拔其中一台设备的电源的话,系统通过心跳线等方式能知道另一台机器已经死了,马上会进行切换;不过如果只拔其中一台设备的网线的话,不会马上切换。因为网络略有不稳定是很常见的现象,如果网络断个几秒就切换的话,有可能在切到一半的时候网络突然又好了,又要自动往回切,会出现各种争抢资源的古怪现象。所以双机软件设计上一般是网络断了的话会等一段时间,确定网络真的断掉才切换。等多久视乎不同的软件而不一样,最典型的默认时间大约是20来秒。你想想,24秒打NBA都算违例了,Reggie Miller 8.9秒都可以拿8分了,对高频交易软件来说,24秒和一万年差不多长哪,(在这次事故中,2秒就成交了2万多笔订单了)。所以拔电源比拔网线切换得快多了。当然如果两台设备主备机都同时拔网线或者电源的话,效果还是一样的,立毙。

必须指出的是,双机高可用技术并不能保证100%的设备就运行正常,就好像大家乘车挂了安全带有了气囊就不能一定保证出车祸不挂,双机高可用技术只能保证某些最常见的问题可以被解决。比如某个机器不小心被关掉了,单个机柜掉电了,单个网卡坏掉了之类,如果碰到了大规模的问题,比如两台设备都挂了,两个网卡都坏了….这就要更高级的玩意,高可用技术的第三层:容灾系统出场了。不过跑题跑到牙买加了,下回再借题发挥吧。

还有,你以为要拔的线缆是这样子的:

但实际状况往往是这样的:


请拔。

其实上面这个图里面已经是很不错的状况了,线虽然散虽然乱,但还算是一条条分开,可以撸出来。最悲痛的是一堆缠在一起,还用尼龙扎带固定的线缆,恨不得挥出亚历山大之剑破结,只求个触电而亡...

7) 其他

关于“拔电源”与“拔电源线”的区别:
我自我介绍是“借题发挥小化肥”,完整地思考一个问题是我对自己的要求,借题介绍一些相关东西是我的回答习惯。我知道“拔电源线”一略扩展成“拔电源”(其实原文明明是“拔电源”嘛),必然有人会赶紧喷喷喷。所以我在第一稿就已经很明确地说明:“其实拔电源这个词也是很模糊的词,可以有几种理解”,不知道大家为什么都没看到,起码有10多人反复指出这个“错误”。

难道知道如何“拔电源”的人还不知道“拔电源线”?但知道”拔电源线“的人是否知道电源是怎样拔出来的?在我本来的构思是会详细介绍一下机房的强电知识,贴些图说什么叫PDU,什么叫UEPO,甚至扯到PUE等,不过就被这些回应浇灭了兴趣了,加上周末耽于唱卡拉OK,没兴趣详细更了。

转载请注明:微图摘 » 致光大:这个世界出了故障,一般拔电源没用

喜欢 (0)or分享 (0)
发表我的评论