June 27
一般来说好的软件或系统应该具有三个非常关键的特性:
- 功能突出 该有的都要有,“一个都不能少”
- 性能优越 运行时消耗的系统资源不能过大,IBM的好多产品在这点上多为人诟病
- 稳定健壮 马步扎的要稳,不能时不时的就crash了,要像郭冬临小品中说的那样“我的成绩一直很稳定”
在这三者中谁最重要呢,这是一个很难回答的问题。如果没有齐全的功能,再优越的性能和卓越的稳定性也是白搭。如果没有很强的稳定性,功能再齐全,也没人敢用。所以这三个方面都很重要,但在不同的发展阶段,可以进行一定的优先级调整。一般来说,在发展的初期,应以功能为主,在中后期即取得了一定的客户后,要以性能和稳定性为主。
怎么样才能实现性能优越,稳定健壮呢?个人以为需要多了解底层的东西,以linux为例,底层的内容包括glibc,Linux内核,CPU架构。当然这个修炼是很痛苦的,就如爬山,越是陡峭的地方越吃力,但爬上去了,风景往往是在平地无法看到的。
June 26
google performance tool 是一个usermode下的内存管理库,具备以下功能:
- 重载了glibc中的malloc, free, new, delete等,性能较glibc的ptmalloc有显著的提高
- 可以用tcmalloc(google performance tool提供的内存管理库)中的heapprofiler来检测内存泄露
接下来重点介绍tcmalloc中进行内存泄露检测的基本idea
- 通过调用sbrk或mmap2向os申请一块虚拟内存(VM), 一次性进货,属批发性质 对这一点的理解需要具备一些elf知识,主要是elf 的executive view,另外也要知道virtual memory的概念
- 当应用程序使用malloc或new时,从已经申请来的内存中分出一部分,属零售, tcmalloc用自己独特的memory allocation algorithm,这也是需要掌握的重点
- 对malloc及free操作进行记录,内容有内存大小,调用的堆栈
- 输出日志到指定文件,如/tmp/profile.0001.heap, profile文件中主要有两大部分,一为malloc发生时的调用堆栈,另一部分为maps内容,有关maps的具体格式解释,可以用”man 5 proc”查看
| 1 | extern "C" void* malloc(size_t size) __THROW { |
| 2 | void* result = do_malloc(size); |
| 3 | MallocHook::InvokeNewHook(result, size); |
| 4 | return result; |
| 5 | } |
-
| 1 | extern "C" void cfree(void* ptr) __THROW { |
| 2 | MallocHook::InvokeDeleteHook(ptr); |
| 3 | do_free(ptr); |
| 4 | } |
- 使用pprof对profile进行分析,pprof主要利用了maps的信息和addr2line工具。 pprof本身是一段perl脚本,如果不明白其具体的意思,可以使用debugger模式进行调试, perl –d pprof ./test /tmp/profile.0001.heap
- 查找共享中的函数名,基本原理
- offset=记录下的地址 - 共享库加载的地址
- addr2line –f –s –C –e 共享库名称 offset
- 静态链接的函数
- addr2line 地址 –e 共享库或可执行文件名称
tcmalloc.cc和heap-profiler.cc是google performance tool中的两个关键源文件.
目前的总结还是比较粗的,我将尽可能的整理出一份ppt来。
google performance tool下载地址 http://code.google.com/p/google-perftools/downloads/list
June 19
今天早上在看《程序员的自我修养》中的运行库部分,突然想起如何自己实现backtrace功能,google一搜,果然已经有牛人解释了其原理并有相应的demo。另外一个收获是知道台湾著名黑客黄敬群老师已经有相应的ppt来解释hello world.
之所以要了解backtrace的实现机制,是因为在阅读google performance tool的源代码时,在这方面遇到了困难。有了李先静的解释,再去看源代码可能会好一些。
列出这两个博客的地址
- http://blog.linux.org.tw/~jserv/ 黄敬群老师
- http://www.limodev.cn/blog/ 李先静大侠
June 16
凡学一门编程语言,绝大部分举的第一个例子都是如何打印”Hello,world”。若干年前在学习C语言时,碰到的第一个例子也是如此,只是我不能了解的是为什么它就显示出来了呢,后面具体都做了些什么东西。
这个问题可以回答的很简单,也可以回答的很复杂。现在我是想往复杂里整,于是就胡乱的看了一些书,要想很好的解释这个非常简单的程序。我想这些书或参考是少不了。
- CPU相关
- Intel 80386 Programmer’s Reference Manual 1986
- 操作系统内核相关
- understanding linux kernel
- 《Linux内核完全注释》
- linker&loader
- 程序员的自我修养
- Linkers and Loaders
当然还有一些没有列出来,比如编译原理和Makefile。我只是列出自己目前感兴趣的,并无心将其丰富成为古板的教学参考目录。希望明年某个时候,我能以易中天品三国的方式将这些内容贯通起来。
May 25
今天上午再次拜会了第一人民医院的专家,第二次来应该算是熟人了。专家看了看片子,说道”一切还好,没有什么异常。至于你的头痛原因,大部分还是因为焦虑而起,过于追求完美所致,性格还不是很成熟啊。”
看来专家就是专家,没有忽悠,呵呵。接下来除了吃些药物辅助治疗外,最主要的还是要调节自己的心理了。