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

关于存档

This page is an archive of entries from 11 2010 listed from newest to oldest.

10 2010 is the previous archive.

12 2010 is the next archive.

Find recent content on the main index or look in the 存档 to find all content.