DongHao: 11 2010存档

感恩节

| | Comments (1) | TrackBacks (0)
小钢炮是公司唯一一个热爱lisp的人。同时还热爱emacs。

感恩节我送给他一份礼物(当然是虚拟的),附上赠言:“伟大的lisp!伟大的emacs!“

几个小时后。

小钢炮:你的赠言也太......

我:伟大是吧?我这样鼓励你也是为了lisp的大爱

小钢炮:我很怀疑你到底了不了解lisp

我:我当然不了解。真正的大爱,就是不管了不了解,只管爱不爱。

小钢炮: -_- b

压力测试

| | Comments (6) | TrackBacks (0)
架构师:要重现你的问题,我们需要做个压力,恒定的QPS,比如每秒100次访问,针对前端的。

我:我想到个好办法——你用浏览器访问页面,每秒点100次刷新按钮。

架构师:......这怎么可能呢?我点不了那么快。

我:确实....那这样,我们找100个同事,每个同事每秒点一次刷新按钮。

架构师:这样也不行,压力不均匀啊。

我:....这样,统一号令,我喊一二、一二、一二,一秒喊一次,大家一听到“一”,就一起按“刷新”。

(谨以此文献给架构师——史峰同学,感谢他常年不厌其烦的帮助我查找生产上的疑难问题,以及在痛苦寻找问题原因时给我的鼓励和调侃)
我记得很清楚,那是1997年,我读高二。

喔,对了,我不仅读高二,我还很爱读书,读的方向很杂。

97年夏天的某个周末,我在西西弗书社看中了一套两本的《战争论》,但是30元有点贵,所以当时没下决心。又过了几天,也可能是几个星期,我又拉上爸去逛街(其实是逛书店,怪癖),也许只是由于老爸在身边,也许是老爸那句“买吧,为读书花钱值得”,我顿觉决心大增,所以买了这一套《战争论》。

一个高二学生,马上面临高考,有时间看《战争论》吗?对,确实没有。买回后我挑了其中比较有趣的几个章节,翻了大概几十页,就没再看了。
后来,高中毕业了。
后来,上大学了。
后来,找不到工作,继续读研了。
后来,读研毕业了。
后来,工作了。
后来,工作4年了。

今年年初,爸妈帮我把这套《战争论》从遵义背到了北京(也是我要求的)。我拿着已经略泛黄的两本书,看着后面13年前盖的“西西弗”的书章,感慨万千。为了对得起爸妈当年不遗余力的读书投资,为了对得起当年我那么热爱读书,我决定——把它读完。

* * *

打仗是很实践的东西,一般来说兵书应该多谈点怎么行军打仗,但是克劳塞维茨同学却不是,他先聊聊战争的本质是什么(是政治的延伸),再聊聊战略和战术这两个概念具体有什么区别同时又有什么共同点,然后聊聊何为进攻何为防御,接着谈谈进攻和防御有什么区别有什么共同点......是不是很像哲学书?我当年就是被他罗嗦得实在看不下去了,所以才放弃的。

大家都知道”战争从其本质上来说是政治的延伸“这句话是克劳塞维茨的名言,但可能没几个人知道他老人家用了多少篇幅论证这个事情——将近100页,而且里面的论述在我看来简直就是“车轱辘话”,翻来覆去的说。而《孙子兵法》里说明这点用了多少篇幅呢?一共19个字:

兵者,国之大事,死生之地,存亡之道,不可不察也。

虽然我一直觉得古文太过简略意思含糊,但这次,不能不说,孙武比克劳塞维茨给力多了。

* * *

虽然有上面的批评,我仍然觉得《战争论》了不起。克劳塞维茨很碎嘴,但是在这堆唠叨里,确实有闪光的东西。

在《战争论》之前,大多数兵书喜欢讨论阵型、武器、地形,甚至后勤,克劳塞维茨却是第一次把战争中人的精神力量(包括指挥者的和士兵的)放到了一个很高的位置。因为如果一支军队士气不振、将军胆小怕事,那连行军都无法按时完成,什么阵型、机动、战术就更是免谈了。

对于精神力量,《战争论》里有详细的解释,我就不费话了。个人认为,这些解释,连同最后的结论,是整书的精华。

有人评论《战争论》里关于精神力量的论述属于”唯心主义“,我只能说,这个人一没弄懂《战争论》,二没弄懂啥叫“唯心主义”。

* * *

公元2世纪,古罗马派大将保卢斯远征马其顿(今天的希腊半岛)。
马其顿步兵使用的是长矛方阵,这是当年亚历山大大帝的制胜法宝,靠着矛尖组成的密不透风的墙,亚历山大从希腊一直打到印度。
这次罗马与马其顿的战争,已经是亚历山大东征三百年后了。

战斗打响不久,罗马士兵由于拿的是剑,所以无法靠近马其顿步兵,高超剑术难以发挥威力。
罗马的方阵支撑不住,开始慢慢后退,情况很危急。

保卢斯注意到:由于罗马方阵的后退,地形慢慢从平原变得高低不平(“破碎”的地形),马其顿的长矛方阵之间开始出现空隙。于是他果断下令,罗马原先的紧密方阵分开,士兵分为小股往长矛方阵的空隙处钻。

这一命令效果良好,罗马人冲进去后挥舞短剑,而马其顿步兵没有近身武器(他们只有长矛)损失惨重。
结果,罗马胜。  (此故事参考《图解世界战争战法》

天下阵法,无攻不破,唯变不破。

看上去,是地形和临时变换的阵法带来了胜利。

但是,如果保卢斯不是一个冷静沉着的老指挥官,不敢在两军紧张的对砍中分散士兵,就根本不会有这个胜利;同样,如果罗马士兵不是训练有素吃苦耐劳,抵挡不住马其顿的初期攻势在后撤中直接撒腿跑了(记得二战中的法国士兵吗?),那也一样是失败告终。

士兵的训练有素,指挥官的冷静敏锐。你能说这些精神因素不是决定战争胜负的关键吗?

ULK3上花了不少力气讲解32位x86机器的内存分区(zone)的原因和现状,可能很多人都看熟了,物理内存被分为三个zone:

ZONE_DMA
ZONE_NORMAL
ZONE_HIGHMEM

ZONE_DMA是为了给一些外设硬件保留的,是0~16MB,ZONE_NORMAL是从16MB~896MB,ZONE_HIGHMEM(高端内存)负责896MB以上的物理内存。当然,如果物理内存本身就小于896MB,那么就没有ZONE_HIGHMEM(高端内存)区了。
为什么边界是896MB?为什么会有一个“高端内存”?我擅自给个粗俗的解释:
大家都知道32位linux上的虚拟地址空间是4G(CPU最多能访问这么大),其中用户态使用前3G,内核态使用最后1G,但是内核必须能够访问整个物理空间(直观想一下,这样驱动才能够为所欲为),可是万一内存条大于1G了,就不能完整的将物理内存映射到这个可怜的1G虚拟空间(显然不够),那怎么办,于是发明了这个“高端内存”的概念。假设机器上装了2G的内存条,那么内核只把内存条上的896MB直接映射到内核态去,这下,内核的虚拟地址空间也只剩下128MB了(总共才1G),剩下的1G零128MB的物理内存怎么办?这样,内核什么时候需要,就什么时候把这些剩下的物理内存映射到那128MB虚拟地址空间上,这就叫临时映射,用的是kmap。当然,这128MB虚拟地址空间一次也只能映射128MB的物理地址空间,想要访问另外的物理空间,只能用kunmap把这一映射取消,再kmap重新映射另外128MB的物理地址......按需临时分配,很罗嗦很烦人,效率也不高。


这一别扭设计的根源在于——32位的地址空间太小了,所以,赶快升级64位吧。
到了x86_64体系下,地址空间就大多了,不用这么别扭了。在x86_64体系下,用户态和内核态各有多大的虚拟地址空间呢?看下图,一目了然。为什么是这样?参考维基百科


现在既然虚拟地址空间这么充裕,就不需要再使用ZONE_HIGHMEM了(还在啃ULK3上这部分内容的同学,抛开它吧!),kmap操作也变成直接返回页面地址。x86_64上的物理内存分三个zone:

ZONE_DMA(这个是为了外设,必须保留)
ZONE_DMA32 (这个还是为了一些特殊硬件,参考作者的解释
ZONE_NORMAL

如果有x86_64的机器,大家可以

cat /proc/zoneinfo

看到这三个区各自的参数。

Node 0, zone    DMA32
  pages free     634082
        min      1159
        low      1448
        high     1738
        scanned  0
        spanned  1044480
        present  833504

喏,这就是ZONE_DMA32的情况,总共用了833504个物理页面,其中634082个物理页面空闲,这里还能看到著名的page_low%P縄POST /cgi-bin/blog/mt.cgi HTTP/1.1 Host: www.baidu.com Connection: keep-alive Referer: http://www.baidu.com/cgi-bin/blog/mt.cgi?__mode=view