最近都在做服务器端的性能测试, 主要在做profile, 业界用的最多的估计就是万能的valgrind, 我们的引擎还嵌入了google的google-perftools. 具体的测试数据会在这周完成, 这里只记录下我对这两个工具的原理理解

Valgrind

这东东是linux 上很出名的开源性能测试工具, 主要的功能是测试内存, 还提供了cpu cache命中, call 统计, heap 测试, 线程测试等功能, 灰常强大, 所以应用面很广.

valgrind 现在已经可以算是庞然大物了, 手册都有300页, 代码没仔细看, 只简单了解了下它的原理.

valgrind 的执行不需要重新编译, 只要把二进制作为参数传入即可. 运行时会先把binary的debug 信息(估计主要是符号表)都读到自己的内存中, 用于结果的输出, 否则看到一堆地址, 估计谁都抓狂. 然后在内存中根据当前运行环境为找到对应的tools , 并根据tools 参数选择交给哪个继续执行, 默认是memcheck. 而最关键的是valgrind 的core, 程序的所有cpu指令都将被core接管, 再真正被执行. tools 会对指令进行处理, 插入自己需要的指令后, 再交给cpu, 以达到测试的目的.

由于接管了所有cpu指令, 所以valgrind 不但能测试到自有代码, 还会接管系统库的代码. 不过这也是比较头疼的, 因为输出的结果会包含很多我不关心的数据, 还好的是valgrind 提供方法去过滤这些信息. 但由于插入的代码量是根据工具不同不一样, 而且所有调用以及内存访问都可能会被处理, 所以程序会变的很慢, 官方数据是10-50倍的减速… 所以每次valgrind 都是很折磨的, 特别是我们这样的即时战斗游戏, 技能会出现很诡异的效果. 所以用valgrind的测试也许不是非常适合我们游戏.

Google-perftools

这个最早是google内部用的性能优化工具, 最出名的是它提供的tcmalloc, 号称在多线程的情况下是ptmalloc的10倍性能提升, 峰值出现在16 threads, 分配256k字节数据的时候. 再往后性能差别不大(参考 tmalloc 性能测试报告). 但我们没有用到这个模块, 用的是它提供的cpu profiler.

google的cpu profiler (下简称pprof, 本来想用gprof, 但又和GNU的prof 名字冲突了, 就用了它提供的一个工具的名字)用的是取样的方法, 这个方法我曾经在stack overflow上看到一个老外说的(@maguschen 同学推荐的). 老外说的方法更原始, gdb 调试程序, 然后随意Ctrl+C, 对断点所在函数做个统计就可以知道程序的热点大概在什么地方了. 很有道理! goolgle 的这个profiler 完全就是根据这个原理实现的.

由于这个工具的代码不大(src/profiler.cc), 网上也有一些指引, 所以我是大概把原理过了一遍的, 大致如下:

  • 必须把profiler的库连接到程序中. 因为pprof 的初始化是通过一个库中的static 变量来实现的.
  • 在类的cstor中,会调用Start
    capture_004.png
  • 其中重要的函数是StartTimer, 它启动了一个定时器,
    capture_001.png
  • 还有一个重要的函数是EnableHandler, 它注册了SIGPROF, 下面是这两个函数的实现(src/profile-handler.cc ):
    capture_002.png
  • 可以看到, 默认是启动了一个1000000 usec 的定时器, 定时器fire 的时候会发出SIGPROF 信号, pprof 响应了这个信号. 所以被测试的程序不能接管这个型号(这点是我的猜测, 没有通读代码, 不敢说这个一定成立, 但尽量不要这样做)
    而下面这段就是pprof的精华所在了:
    capture_000.png
  • 这里使用了libunwind库, 把现在的调用栈dump出来了, 然后放到collector中, 可以看到pprof 是异步输出的, 数据到将来的某个时刻才最后输出(一般是程序终结的时候, 也可用ProfileFlush函数把内容flush 到io去)

可以看到pprof 是基于采样, 和最上面提到的stack overflow上面提到的老外是一个方法, 所以pprof的结果是不准确的, 应该说是提供了一个统计学上的意义, 我们知道采样的可信度是和样本空间的大小是相关的, 所以如果想要pprof比较准确就需要较大的样本空间, 这可以通过2个方法做到:

  1. 增加测试时间;
  2. 增加采样密度;

而用pprof最大的感受是一个字 — "快", 和许多profile 工具不一样, pprof 是很快的, 基本上感觉不到性能的下降, 甚至可以在生产环境只用它.

 

前段時間入手了觀望了很久的LX3,上周末沒事,就和老婆跑到外面試了一下。這里上一些照片,分享一下。

因為希望體現LX3最原始的效果,所以片子均没修饰,没有剪裁,其中夜景和招財貓是因为操作不熟,曝光有点偏差,就用picasa稍微调了一下。

先來看看靜物

P1010111

這張選取了室內大逆光,24mm,ISO250,F2.0, 無閃光燈。效果可以說是出乎我意料,因為在我的印象中,DC對逆光的曝光控制上都是非常不好的,但是這張照片讓我比較滿意,甚至沒有考慮去調整曝光。而ISO250上的表現也讓我可以接受。廣角端畸變有,但從這張照片來看,不算嚴重。

P1010108-1

60mm,F2.8, ISO500,依舊沒有用閃光燈。縮略圖看著好像還可以,但是實際上噪點已經“爆”了,1:1看會發現噪點非常夸張。而且不知道為何,這張原片曝光偏暗,所以我用了picasa微調。

P1010114

24mm, F2.0, ISO400。既然難得有2.0這么大光圈+廣角的DC,當然要“用盡佢”啦^ ^。所以又是一張大光圈廣角的片子。說實話,這張是我個人比較喜歡的一張。顏色還原好,景深淺,焦外舒服,細節丟失少。總體不錯,可惜的是ISO還是高,而且背景雜亂。不是也就是隨手拍拍而已,也就不要求這么高了, LOL.

P1010119

最后上一張夜景。24mm, F2.5, ISO400。這張其實也是出乎我意料。第一,這是我手持拍的,快門1/15,居然沒有模糊,真不知道是LX3的防抖做的好,還是我手持功夫到家了^O^。第二,夜景色彩控制比較好,原景實際上不如照片看到的出彩。由于是夜景,根據現有測光系統的原理,無法避免會有出錯,所以也是用picasa微調了一下曝光。正如剛才的照片一樣,軟肋還是高ISO。原片1:1時噪點依舊很夸張……另,因為沒有裁剪,所以左下角多了一個燈出來……囧

总体來說,LX3的表現符合我的预期,基本上能满足日常拍摄需要。同期還把玩了下朋友剛買的G11,感觉略显笨重,失去了作为辅机的最重要功能–便携。另外操作也稍嫌复杂,上面的两个转盘操作有点生硬,+/-单独一个转盘有点鸡肋。但是在高ISO(由于是DC,所以只指400 以上)的表现,G11确实出色,这点在夜景时候表现的比较突出。习惯了单反,对LX3在400就有这种颗粒感还是觉得比较夸张的。CCD小,没办法……

另外一个问题是LX3的等效焦距在 24~60mm。一些朋友觉得太短了,我拍的时候也确实偶尔觉得不够,但我一直对长焦没有爱。所以如果介意的朋友,这点需要考虑。除此以外,LX3確實可以說是DC中的比較不錯的機器,而且由于出道也有一段時間,價格已經降到合理的范圍,如果再晚一點,機器停產后,質量就比較難以保證,增加了買到翻新貨的風險。各位觀望的朋友其實可以考慮出手了。

© 2011 Life N' Tech brought to you by @jaconey Suffusion theme by Sayontan Sinha