白云凰

1. 独自旅游

2018-03-28,稣独自在一条古街游玩,据说这里保持民国时期的民俗风情。稣本身是一个不爱旅游的人,不知为何,居然来了……纳闷一下,就听到后面有人催促,天要黑了,要参观的赶快参观,不参观的可以回去了。稣想,既来之则安之,随处走走吧。

走进街头的石门,前段是一些商铺,但没人在营业,看来这条街已经过时废弃,只是作为景点供人参观而已。

但是再走一段,商铺没了,居然出现当地居民,看服饰,不像现代人。有一对老夫妻在门口好奇地看着稣,好像在念叨:“这么晚,怎么还有游客敢来?”稣很有礼貌地朝他们点点头,说:“老人家好!我们旅游团今天来这边参观,打扰了!”老人家有点不耐烦地说:“就你一个,还什么旅游团!”稣回头一看,嗯?真的就稣一个人,刚才团长让我们自己决定要不要玩,这么坑?就稣一个人进来!

天色已晚,气氛有点不对劲,稣想:“要不回去吧?”这时听到几个小孩在前面玩闹的声音。稣又好奇地往前走,但始终没有看到什么小孩,只看到一间房屋,似乎着过火,后来做了一些基本的修复。

2. 女神?女鬼?谢谢!

稣进入屋子,环顾一下,发现确实曾经失火,有不少痕迹,屋内墙壁还蘸着大片炭灰。

这时候一个白衣女从屋顶飘下来,长得很漂亮,稣还以为是仙女下凡……她开口说自己是鬼魂,呃!这么漂亮的女鬼?别吓稣,等下吓醒就不好了!

“我叫白云凰,19 岁时,这里发生地震,我在屋里被压倒,屋子着火,烧死了。”

“哦,那你真身一定很难看……吓尿!”

“是的,全身都烧黑了!但我是你前世的娘子,你不会嫌弃我吧?”

“啊!那你保持现在这个样子,下来我看看!”

她慢慢飘下来。稣近身观测过,觉得真不错,看来稣前世蛮有眼光嘛!

“我死得不甘心,至今未投胎,一直在这里等你!”

稣一时感动就上前抱她。她立刻推开,说:“我的阴气很重,怕有损相公身体,请相公为我找个美女,我要附身!”

“附身?那不是会把身体的原主人杀死?这样不好吧!”

“不一定,看谁的意志更强,不过我的求生意识很强,一般活人恐怕赢不了我。你可以找一个弱智或者品行恶劣的人,你觉得死不足惜的,我只有一个要求,就是得漂亮,至少和我生前差不多。”

“我考虑一下……如果找到了,后面怎么操作?”

“我的骨骸就葬在这屋子下面,你把我挖出来,我的双脚戴着父母给我的镇邪足环,它们把我绑定在屋子里,无法离开,你把它们摘下。然后我左手的戒指,你摘下来戴自己手上,这样我就可以跟着你了。只要你睡着,我们就能见面。”

稣挖出来一看,真的全是黑色,正常的骨头应该是白色的……但这样的黑色骨骸,反而不让人害怕,稣盯着她的头看了很久,还真是不错的脸型,烧成这样也能看出是个美人。

吓醒。

3. 附身

第二天,稣就研究了一些出现附身的鬼片,比如《万能钥匙》。领悟到一个道理,附身并没有杀人,人还是那么多。有些人脑死了,还捐器官造福别人。如果说有人身体死了,脑子还活着,移植到这个脑死的身体,那不是救人吗?所以其实这没有什么不道德的。

有些人经过某些事情之后,会突然变了个人,外人根本无法知道他还是不是原来的他。记忆是存在并跟随身体的,就算灵魂换一个新的,由于有原来的记忆,别人是无法查知的。

有着丰富鲸神魂裂经验的稣,马上意识到,附身其实是能让更多人存活于世的,不仅是救人一命,还有可能优化世界!举个例子,某人智力低下,考试经常挂,找个聪明的鬼魂附身,可以让他变聪明,提高成绩。即使是聪明人,也可能受限于特定思维方式,不够全面,找个互补的来附身,可以提高技能。

但是,到了晚上,白云凰并没有来找稣,看来只是偶然的一个怪梦。

4. 已经来到稣身边!?

第三天,白云凰出现了,她说前一晚,稣太操劳,睡的时候脑子还在写代码,所以她没有来打扰。但稣白天看到一个美女,已经被她锁定……

“谁?稣怎么没有印象!”稣想,于是问她:“那你附身了吗?”

“马上,你醒来的时候,我就已经转世到现代了,有缘你会认识我的。”

“叫什么名字?在哪里?”

“呵,在美柚,其它的我不能告诉你!”

再次吓醒。

5. 人间的运行规律?

弱者突然觉悟,是不是被附身的?这个故事告诉我们:好好学习,成绩不好,可能被暗杀,没人知道你是被附身,赫赫!

学习 go 语言【7】设置进程退出码

常规方案

直接用 os.Exit (exit_code),但这个太暴力了,我们需要高雅一点的,于是找到了这个:https://stackoverflow.com/questions/24601516/correct-way-to-set-exit-code-of-process

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"fmt"
"os"
)

func main() {
code := 0
defer func() {
os.Exit(code)
}()
defer func() {
fmt.Println("Another deferred func")
}()
fmt.Println("Hello, 世界")
code = 1
}

问题

调用 panic 的时候就知道以上的方法存在不足!panic 之后会导致 main 退出,本来紧接着应该打印 Trace Log,然而 main 退出时调用了 os.Exit (),然后没有然后了……

本来 panic 时,退出码应该是 2 的,结果由于以上装 X 代码的作用,退出码变成了 0!如果 panic 是自己主动调用的,那还可以改改,使用别的方式;如果是其它库函数的就难办了……

求模版函数地址

最近用 WTL 写 Ribbon 界面,发现一个坑。

先看 WTL9.1 的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static void (CharFormat::*Getk_[])(IPropertyStore*) = 
{
&CharFormat::Getk_Family,
&CharFormat::Getk_FontProperties_Size,
&CharFormat::Getk_MaskEffect<CFM_BOLD, CFE_BOLD, UI_PKEY_FontProperties_Bold>,
&CharFormat::Getk_MaskEffect<CFM_ITALIC, CFE_ITALIC, UI_PKEY_FontProperties_Italic>,
&CharFormat::Getk_MaskEffect<CFM_UNDERLINE, CFE_UNDERLINE, UI_PKEY_FontProperties_Underline>,
&CharFormat::Getk_MaskEffect<CFM_STRIKEOUT, CFE_STRIKEOUT, UI_PKEY_FontProperties_Strikethrough>,
&CharFormat::Getk_VerticalPositioning,
&CharFormat::Getk_Color<CFM_COLOR, UI_PKEY_FontProperties_ForegroundColor>,
&CharFormat::Getk_Color<CFM_BACKCOLOR, UI_PKEY_FontProperties_BackgroundColor>,
&CharFormat::Getk_ColorType<CFM_COLOR, CFE_AUTOCOLOR, UI_SWATCHCOLORTYPE_AUTOMATIC, UI_PKEY_FontProperties_ForegroundColorType>,
&CharFormat::Getk_ColorType<CFM_BACKCOLOR, CFE_AUTOBACKCOLOR, UI_SWATCHCOLORTYPE_NOCOLOR, UI_PKEY_FontProperties_BackgroundColorType>,
};

其中 Getk_MaskEffect 是个模版函数,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
template <DWORD t_dwMask, DWORD t_dwEffects, REFPROPERTYKEY key>
void Getk_MaskEffect(IPropertyStore* pStore)
{
if (SUCCEEDED(pStore->GetValue(key, &propvar)))
{
UIPropertyToUInt32(key, propvar, &uValue);
if ((UI_FONTPROPERTIES)uValue != UI_FONTPROPERTIES_NOTAVAILABLE)
{
dwMask |= t_dwMask;
dwEffects |= ((UI_FONTPROPERTIES) uValue == UI_FONTPROPERTIES_SET) ? t_dwEffects : 0;
}
}
}

然后,在 VS2017 编译失败了……

1>X:\WTL91_5321_Final\Include\atlribbon.h(422): error C2440: ‘initializing’: cannot convert from ‘overloaded-function’ to ‘void (__thiscall WTL::RibbonUI::CharFormat::* )(IPropertyStore *)’

1>X:\WTL91_5321_Final\Include\atlribbon.h(422): note: None of the functions with this name in scope match the target type

然后根据错误提示搜到:Cannot take address of template function,https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39018,翻译一下:模版函数的地址转化,分两步走,第一步先转具化,第二步转目标类型,这样可以;直接转过去不可以!

再来看看 WTL10 怎么解决这个问题的!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static void (CharFormat::*Getk_[])(IPropertyStore*) = 
{
&CharFormat::Getk_Family,
&CharFormat::Getk_FontProperties_Size,
&CharFormat::Getk_MaskEffectBold,
&CharFormat::Getk_MaskEffectItalic,
&CharFormat::Getk_MaskEffectUnderline,
&CharFormat::Getk_MaskEffectStrikeout,
&CharFormat::Getk_VerticalPositioning,
&CharFormat::Getk_Color,
&CharFormat::Getk_ColorBack,
&CharFormat::Getk_ColorType,
&CharFormat::Getk_ColorTypeBack,
};

原来的模版函数,已经替换成普通函数了……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void Getk_MaskEffectBold(IPropertyStore* pStore)
{
Getk_MaskEffectAll(pStore, CFM_BOLD, CFE_BOLD, UI_PKEY_FontProperties_Bold);
}

void Getk_MaskEffectItalic(IPropertyStore* pStore)
{
Getk_MaskEffectAll(pStore, CFM_ITALIC, CFE_ITALIC, UI_PKEY_FontProperties_Italic);
}

void Getk_MaskEffectUnderline(IPropertyStore* pStore)
{
Getk_MaskEffectAll(pStore, CFM_UNDERLINE, CFE_UNDERLINE, UI_PKEY_FontProperties_Underline);
}

void Getk_MaskEffectStrikeout(IPropertyStore* pStore)
{
Getk_MaskEffectAll(pStore, CFM_STRIKEOUT, CFE_STRIKEOUT, UI_PKEY_FontProperties_Strikethrough);
}

void Getk_MaskEffectAll(IPropertyStore* pStore, DWORD _dwMask, DWORD _dwEffects, REFPROPERTYKEY key)
{
if (SUCCEEDED(pStore->GetValue(key, &propvar)))
{
UIPropertyToUInt32(key, propvar, &uValue);
if ((UI_FONTPROPERTIES)uValue != UI_FONTPROPERTIES_NOTAVAILABLE)
{
dwMask |= _dwMask;
dwEffects |= ((UI_FONTPROPERTIES)uValue == UI_FONTPROPERTIES_SET) ? _dwEffects : 0;
}
}
}

无形装逼最为致命

1. 鲸神魂裂恶化了?

稣一直以为自己是一个共享记忆型的鲸神魂裂,但最近发生了几件事,让稣有点担心并不是这么回事……

最早的一次怀疑是无意间发现自己的微信签名档被设置为一句莫名其妙的话。要知道,微信签名档几乎没人看,所以也很少改,没有理由改了,自己完全没印象。而且微信的安全性应该蛮高的,不大可能是被人黑了。即使真被黑,也不会就改个签名档吧,钱包里有几千块不顺便转走?

后来是几次同事总说稣讲过什么话,然而一点都不像稣的风格!最近一次是好基友在公司尾牙拿了大奖,回头请客。那晚,是厦门久违的冬天,稣离聚餐的四代目就两公里多,于是选择直接暴走过去。走到海边后,风很大,有点后悔,冷得抖抖手啊,抖抖脚,请做深呼吸……擦,根本停不下来!

走几步无聊就打电话问一下其他人都到哪里了,他们五人都在同一辆车上,哈拉几句,就有点冷得心不在焉,然后他突然说了一句:你要带妹纸的话,要自己付钱。嗯哼??稣什么时候说要带妹纸!而且稣是暴走过去的,要带妹纸的话,怎么可能用走的?

到店后,稣当场就反驳了,可是他们五人异口同声说稣确实说过要带一个美女过来……想起最近好几个反常的事例,稣有点怀疑,自己是不是鲸神魂裂恶化!

2. 情人劫?

2018-02-14,一大早起来就觉得不对劲,朋友圈里有八个前女友在晒婚礼、结婚证,八个前女友!场面何其壮观!最可怕的是这八个前女友都特么哪里来的……稣不记得有这么多啊!

接下来是午睡后,从企业群里得知 13:30 后就下班,正想继续睡,突然一个电话过来,很紧张地说:“稣,你赶快看看私 Q,有人在大池塘里说怀了你的孩子,我给你转到私 Q 了。”

卧槽,稣想起多年以前七夕情人节大池塘表白的狗血剧,这还剧情升级了?夸张得过分了,居然趁稣退出大池塘就造谣!不行,要淡定,稣应该没啥把柄,不怕。

3. 装逼被雷劈

看完转播的消息,稣顿时冷静了,稣和当事者就见过一次面,没有发生任何不可告人的秘密。但为什么她要搞这么大动作呢?

稣回忆了当时的情况:稣乐于助人,帮她妈点忙,后来她要请吃饭,刚好那时稣的车被撞了,开去修,就在神鲸租车租了一辆奔驰 S500,装几天逼。但那晚不小心陪了一杯酒,回来就默默请了神鲸代驾,因为和神鲸租车是同一个公司,可以直接让他开回去还。但是这位代驾很有意思,一来就装孙子,称呼都是老板、圣总的,还装得好像很熟,搞得稣有点尴尬,还好 S500 的后座十分舒服,尤其是头枕,不小心就睡着了……难道睡着后发生什么?不可能啊!车上能搞出孩子?

稣找她私聊,问到底搞什么,要这样毁自己声誉!?她一口咬定就是稣干的……稣心想一定是别人的孩子,想找稣接盘。灵光一闪,稣记起,这应该是蓝翔技校的狗血剧情,发生在稣身上一定是哪里有八哥!很可能这是另一个平行世界,稣有八个前女友?不可能,这绝对是在做梦。

吓醒。

Mongo Shell 下批量更新集合

需求

延长 MongoDB 某集合里的“过期时间”字段。

风险分析

update 一下是很简单,主要怕在 Shell 下操作可能改变数字类型。
先做了实验,发现 3.2 的版本下,并没有这个问题,之前看书,说数字可能被改为双精度,看来是旧版本的不足。

1
2
3
4
db.UMU.find().forEach(function (doc) {
doc.expireDate = NumberLong(doc.updateTime + 180*24*60*60*1000);
db.UMU.save(doc);
})

其中 NumberLong 是必要的,不然更新后,expireDate 的类型并不是和 updateTime 一样的 NumberLong。

Ceph 慢盘原因分析一例:CPU 偷懒了!

问题

Ceph 运维发现一个 osd 慢了。

分析

1. 硬件配置对比

找了一台参照机器,上面也一样跑了 15 个 osd,发现 CPU、内存、主板、内存、硬盘的型号都一样,参数也没看出明显差别。但磁盘有点毛病,用 smartctl 看不出通电时长,所以也没有法断定不是磁盘之间的差异。

ProLiant DL380e Gen8

Intel® Xeon® CPU E5-2470 0 @ 2.30GHz

16G DDR3 1333 MHz * 10

2. 排除配置差异

确实找出一个差异来,这个慢的 osd 的磁盘分区和别的 osd 不一样,前面 14 个 osd 的 journal 分区占整个硬盘的比例是 20%,这个慢的 osd 则是 10%。

但后来发现,其它 14 个是普通的 osd,慢的那个是 bucket index osd,所以是故意那样分区的。

3. 发现 mcelog 大了很多

慢盘的 mcelog 比参照机器上的大了 20G,后来确认是很早以前有内存错误打的,不是最近发生。

4. 怀疑内存还是有毛病,毕竟曾经有过毛病

测试逐字节内存填写,结果发现慢盘机器总是比参照机器慢一些,而且浮动比较大,所以怀疑是整机性能不行,并非就那个 bucket index osd 慢,只是 bucket index osd 慢得比较明显。后来,另一名同事确认了这点,15 个 osd 都比参照机器上的 15 个 osd 慢。

5. 在另一名同事的协助下,发现 CPU 降频了……

cpufreq-info 查看,发现这个问题机器的 CPU 是 ondemand 模式,降频后,没有及时恢复!后来改为性能模式,问题解决。至于为什么 CPU 不能恢复高频模式,有点怀疑是 pcc-cpufreq.ko 这个 cpufreq_driver 的 bug,但没仔细研究了,直接听取前辈的经验:使用 ondemand 模式,可能导致莫名其妙的问题,而且并不能省多少电,意义不大。

单说 CPU,省电的关键应该是把工作电压降低了,功率下降肯定能省电;只把频率降低(能提高电阻?),效果目测是不会很明显。这个研究不深,欢迎指教。

6. 为什么参照机器没有问题?

两个可能性:

(1)BIOS ROM 版本不一样,参照机器更高:P73 08/20/2012,问题机器:P73 06/01/2012。

(2)BIOS 参数可能也不一样。(服务器不能 IPMI,无法查看……)

诗盗·圣诞绿帽

《#诗盗#·圣诞绿帽》:冬城懒觉睡眠好,狗皮皱纹迎风悼。绿帽难戴晓寒惊,红耳猪头切克闹。浮生长恨热量少,肯爱千薪轻一笑。为君打开小太阳,或向火边留晚照。

注解

昨晚开电暖器睡眯眯,今早起来还很冷,想着要骑车上班会被冷风吹成狗,心里是拒绝的……
突然看到墙上有一顶帽子,是前几年圣诞节公司发的,可惜是绿色的……算了,还是不要戴,肉体御寒。

诗盗·狗冻鸡冻

《#诗盗#·狗冻》:拖鞋套袜来暴走,风吹手抖冻成狗。穷狗出门包个球,富狗车里挤乳沟。
《#诗盗#·鸡冻》:今晚降温没冷死,明早吓醒有饭吃。夜长有尽梦无穷,日短无妨日一日。

注解

穷人出门就是把自己包成一个球,富人不用靠自身御寒,所以一年四季都可以穿很少,秀身材是分分秒的事情。
御寒手段:吃饱、床上运动。

穿越 2018

1. 白洁的故事

现在是 2017 年 12 月 29 日 22 点,哥在西湖边的一个咖啡厅,思考人生。

差点忘记自我介绍,哥叫白洁,呃,男,不是你们想的那个少妇……是一名爱岗敬业的专业运维,日常工作是写脚本,比如这样的:

1
rm -rf /

这样的:

1
python -c 'import os; os.system("".join([chr(ord(i)-1) for i in "sn!.sg! "]))'

还有这样的:

1
dd if=/dev/zero of=/dev/sda

好吧,你们可能看不懂,说人话,哥是一名背锅侠……黑锅可以背,但是绿帽哥是不能戴的,完全无法忍受。

幽绿的灯光映射在田牌笔记本 Logo 上,哥若有所思,咖啡厅的 BGM 很应景地放着:“爱是一道光,如此美妙”,纳尼,还朗朗上口,居然不由自主跟着哼起来!!

但是哥很快陷入深思,快 4 个月前,哥从币特宝公司离职,理由是老板给哥发了一顶绿帽。

这个公司原来是一个游戏公司,2014 年时,游戏业务有很稳定的收入,老板发大财,团队也有些人员空闲出来,于是老板想扩展新业务,选择了当时很火的皮土坯理财,所以后来公司就有两大业务,都很赚钱。

老板也是个蛮年轻的人,脑子转得快,钱也赚得快,但有个毛病——喜欢 PBC……长话短说,哥追了 8 个月的女神,彼此已经默认,周边人也都认同了,快送入洞房时,迅速失败,原因居然是女神被老板砸钱收走了!

哥离职前就暗自发誓要报仇!在新公司上三个月班,业余时都在学习社工和黑客技术,准备选择目前比较敏感和脆弱的皮土坯业务下手,下一个重重的黑手。

打开田牌笔记本,架起美国云主机加蓝灯,用脚本把以前记录的服务器试探了一遍,通过端口开启情况判断,服务器和上面跑的应用都变化不大,但哥早已没有权限登录,实在懊恼!

尝试了几个系统漏洞,都不成功,难道技术还不够硬?一个小时过去了,有点心灰意冷……果然时间就是金钱,想那时,哥拥有所有服务器的最高管理权限,但基于职业道德,并没有故意留下什么后门。苦恼啊!

等等!时间就是金钱!对了,早期哥部署服务器时,曾经架设过一个 NTP 服务器,币特宝公司的所有服务器都会向一系列的 NTP 服务器同步时间,其中就包含了哥架设的那个 gsntp.cc,当时技术总监有亲自审核过同步脚本,大家还开玩笑地说,那个是“高速 NTP”的意思。事实上,大家并没有重视这个事情,gsntp.cc 是哥个人的域名,是在上上家公司就存在的,大约 2010 年到币特宝时,直接给用上了,直到扩展皮土坯业务时,才有人问过,但由于存在历史悠久,没人去怀疑什么。

后来哥的个人云主机到期,没有续费,NTP 服务也失效了,但由于 NTP 服务器列表有好几个,所以第一个失效也没人发现异常。更加天助我也的是,技术总监是个比较抠的人,币特宝公司内部其实也有自己的 NTP 服务器,但他怕服务器负担大,把自己的服务器放在列表的最后,美其名曰保护资源。哥哈哈一笑,用手指托了托墨镜,赫赫,哥没有近视,戴墨镜是为了在咖啡厅装逼,5.2 视力的双眼,紧盯着屏幕,一个计划展开,指令在键盘上咔咔地输入,一个小时后,这个公司将会陷入漩涡。

23:46,由于是周末,这时候有大量玩家,哥在贴吧已经看到大量玩家在骂,更厉害的是皮土坯的贴吧,很多人在怀疑老板是不是要跑路,自己的钱是不是都飞了……还有一个帖子很好玩,自称内部人士,说这公司快倒闭了,因为欠运营商巨款,服务器被强行断网。神助攻啊!以这家公司的尿性,一群人需要至少 3 小时才能处理好故障,而哥已经准备清理一切,喝完最后一滴咖啡,离开。

2. 值班运维小弟的故事

小弟是一名运维,平时的工作主要是看监控图,有这样的……这样的……还有这样的!没错,其实并没有图,都是一些曲线而已。然后简单分析告警原因,如果解决不了就叫人。

放假前夜,他们都出去 high,就小弟们俩在值班,一切风平浪静地有点困,另一个小伙伴嫌无聊,去蹲坑兼抽烟。趁他不在,顺便骂一句:香烟,真基罢臭。小弟想起,以前看某手机大厂创始人接受采访时,居然当众抽起烟来,这素质……有钱也是乐射。

心里正骂得爽时,突然就出事了,各种应用错误飙升的告警,一台台报上来,直到重要的交易服务器也告警了,小弟几乎吓尿,另一枚小伙伴估计正在吓屎……已经 23 点后,大部分人可能都比较难找,只能硬着头皮一个个电话打过去,慢慢地叫来几个人,产品经理、项目管理、开发。

人是来了,但灾难面积还是一直扩大,小弟已经双腿发软,领导也赶来群聊问话。这简直是小弟职业生涯最壮观的一次救灾时间。围观了一个小时,才有人发现时间发生了跃进,跑到 2018 年 2 月,然后再倒退回现在的正常时间。这直接导致各个分布式系统的核心组件崩溃,进而引起所有集群雪崩……

然而为什么会这样呢?却是木有人搞明白。直到一个扫地僧出现,三言两语之后就发现问题根源出在 NTP 同步脚本。小弟真是佩服,佩服。

3. 扫地僧的故事

作为一名扫地僧,修身养性是基本技能,23 点就睡觉比啥修炼方法都简单实用。周末,最多也就晚个一小时。洗澡时,领导连续给贫僧打了 4 个电话,肯定没好事,最后接到的时间是 23:35,果然出大事了。

线上的问题,正常情况下贫僧是不参与的,之前也没有领导半夜打来电话问候,嗯,平时早就关机了,赫赫。总之,贫僧就安静地扫地,宁静以致远。接到电话时,也是懵逼,但领导特别关爱,明显马上开机干活,说不定还能露两手装装逼。

从工作群的聊天记录看,时间曾经发生跳进和倒退,而且是大规模,这只有 NTP 服务器出错才有可能,于是贫僧看了 NTP 同步脚本,里面有个 gsntp.cc 很可疑,好像是“搞死你逃跑,嘻嘻”的意思……What??居然还是放在同步列表的第一位!然后是 asia.pool.ntp.org,最后才是公司自己的……实在无语。另外,为了分散服务器的压力,同步脚本的计划时间还是随机产生的,每小时一次,但分钟数不一样,所以出问题的时间各自不同,但在一小时内大量出事。那为什么时间又迅速自己复原了?坑爹呢!计划任务里居然有两个时间同步!一个是指向刚刚看的脚本,另一个是直接一行命令强行同步 asia.pool.ntp.org。这一切都对上了,那么是不是这个 gsntp.cc 搞的鬼呢?敲了个命令向它查询时间差,结果这个域名指向的根本就不是 NTP 服务器,而且是加拿大的 IP。怀疑有人在这一小时内,开启了 NTP 服务,导致时间错乱后,又迅速关闭。

查一下同步脚本的 log……尼玛,这 log 里面只有一堆的“同步成功”,没有记录同步前后时间!这特么是谁写的!

蛋定,蛋定,这种事情不是第一次遇到,目前只能全线撤除这个时间同步脚本,改天让人精心改造后再上线。这故障已经找不到负责人了,也没有铁一般的证据解释根本原因,但贫僧的第六感认为这一定和三个月前的那个事件有关。于是贫僧宣告:可能是 DNS 被劫持,NTP 服务器列表中有一个被解析到某个时间错误的 NTP 服务器上了。这么离奇的巧合,你们信吗?

4. 吓醒

稣是不信……本故事纯属做梦,如有雷同,请吓醒!