Linux系统性能剖析工具(四)

前面(一)(二)(三)分别介绍了如何剖析系统CPU、内存、磁盘等性能的工具,主要关注点在单个计算机内部;而在接下来的这篇文章中,会将我们的视野伸向更加广阔的互联网络,介绍一些剖析网络性能相关的工具,包括ping,netstat,tcpdump,iftop,nethogs等。

Read More

Linux系统性能剖析工具(三)

前面(一)(二) 两篇文章分别介绍了一些基本的剖析工具,此篇中将会介绍一个更加强大的工具——perf。perf不仅可以统计软件层面的追踪点,如系统调用调度等,还可以追踪统计系统的软硬件事件,如上下文切换(软件事件)、CPU迁移(软件事件)、缓存失效(硬件事件)等。perf中包含一系列的子命令,常用的有list,record,report,sched,top等,下面通过例子列举一些基本用法。

Read More

Linux系统性能剖析工具(二)

如果一个系统负载过高时,通过Linux性能剖析工具(一)中介绍的工具,可以看出当前系统大概的状态,了解到比如什么任务的占用的CPU较多等信息。那知道这些信息后,接下来应该怎么办呢?——接下来就应该去试图找出函数级别的热点代码了。本篇将会简单介绍strace(system call trace),ltrace(library trace)在函数性能剖析中的用法。

Read More

Linux系统性能剖析工具(一)

最近抽空翻了System Performance这本书,内容主要是讲如何使用工具去查找Linux系统的性能瓶颈。前面我特意把“如何使用工具“这几个字加粗了,除了这就是这本书的核心之外,还有是因为这里面其实含有两层意思:一是字面的意思——怎么使用这些工具以及通过这些个工具能够获取到哪些信息;二是关于工具使用的时间和场合,应该在什么时候使用什么样的工具。我觉得第二点尤为重要,Linux系统经过这么些年的开源演化,伴随着也产生了很多优秀的系统剖析工具,不过对于需要做软件优化的工程师——特别是新人来说,可能就会懵逼了。所以把这些工具梳理出来,系统化叙述成册以便索引是很重要的。

Read More

推荐一些Linux基础学习书籍

这是我给我司同事推荐的关于Linux基础学习的一些书籍,稍作整理放到这里。其中1/2/3三本属于入门书籍,4/5两本属于进阶书籍,最后几本则稍微难点。

Read More

Unix高级环境编程中的一个Bug

这个bug发现于Unix高级环境编程2013年出版的第三版第17章第7节——An Open Server,在这一节里作者开发了一个Client-Server结构的示例程序,让读者可以把本章前面几节的一些内容——其中包括Unix Naming Domain Socket, Unique Connection和Passing File Descriptor等知识可以很好地融会贯通起来。不过这个例子在IA-64的Linux的平台下运行时会遇到一个bug,这个bug会导致Client收到的数据和Server发送的数据不匹配,使程序运行时不能产生预期的行为。

Read More

Goto语句

很多程序员可能听说过,“不要使用Goto语句”这样的观点。但是现在计算机系的学生可能很少有听到过这个原则背后有着怎么样的历史背景了。关于是否使用Goto语句、什么场合使用Goto语句曾经在编程史上引发激烈的辩论,这些争论从上个世纪的60年代一直延续到本世纪初,其中的参与者包括大名鼎鼎Dijkstra Edsger、Knuth Donald还有Linus Troald等等,大部分同学应该对这些计算机发展史上里程牌式的名字非常熟悉。以现在的眼光回去看当时这些大牛们的文章,可能会觉得这些争论已经了无意义或者类似的问题已经不复存在了,但是设身处地的回到他们各自的时代,就会看到他们的讨论对计算机编程语言演进的影响。

Read More

需要什么样的代码审查方法?

公司最近严控代码质量,代码审查(Code Review)相应地也就多了起来。每天常常收到好几封代码审查的邀请邮件,每封邮件都包含了需要审查的代码附件,这些附件的压缩方式还是各式各样的都有,7z, zip, rar等等,附件中还有一个用来填写评论(Comment)的Excel表格。直到上周的有一天,我公司邮箱不小心又被爆仓了,收件箱按照附件排列一看大多是代码审查相关的邮件,终于对这种工作方式受不了。

Read More

奇特的一生

奇特的一生讲述了苏联昆虫学家亚历山大•柳比歇夫[1]的故事。柳比歇夫一生成就非凡,不仅能够在自己的昆虫学专业领域取得很大的成就,而且在其他诸如宗教、哲学、历史等领域令其专业学者侧目。因此引发作者思考的事:柳比歇夫的一生能够干那么多事情、留下那么多的作品,而同一时代的大部分人则碌碌无为的离开人世,为什么会这样呢?于是作者在柳比歇夫的诸多资料中看到了他奇特的时间统计法(用现在比较流行的话说就是时间管理)。

Read More

黑客与画家

作者保罗是一名科班出身的程序员,曾经在艺术学院流窜过,也梦想成为一名画家。其实他是不是画家并不重要,他甚至可以是一名作家、建筑师、摄影师等等其他角色,这些工作在创作完美作品上和黑客需要做的事情有着很多相似之处。书中有很多地方强调了这一点,比如在我们的审美上,和事老总是教导我们不同个体之间对审美有着很大的主观差异,说着仁者见仁智者见智之类的屁话,从而避免可能由于意见分歧带来的伤害。如果主观差异很大,为什么还有那么多在博物馆图书馆中林列的伟大作品?那些经过时间洗礼的作品就是大家共同的品味。

Read More

Clean Code Contest

5月份公司举办了Clean Code Contest,比赛形式是:主办方给出一份内部工具的源代码,要求在这个基础版本上加入一个非常微小的功能(这个值得一提,为了避开为重构而重构的原则),参赛者通过自己对Clean Code的理解修改这份代码、做好单元测试,然后在截止期前把源代码提交到代码库。时间一个月左右,5月底最后一天冻结代码。比赛的前三名可以拿到一个Nokia的Lumia 800。

Read More

代码的排版

代码排版是每个软件工程师都要面对的问题。好的排版不仅可以让读代码的人感到赏心悦目,更重要的是可以从代码格式中发现程序的内在逻辑结构。这就好像文章、博客的一样,它们会通过分段、空白行、标点符号等各种元素来体现文章内在结构,从而提升读者的阅读体验。试想,阅读这两句话“子曰见贤思齐靥见不贤而内自省也”与“子曰,见贤思齐靥,见不贤而内自醒也”,有多大的差异。我们的古书没有版式和标点,有一部分原因是古书记录在在竹木简上,省去标点可以减少记录的成本。有意思的是,在计算机发展的早期,那些程序员也会因为存储的限制而牺牲代码的排版,算是殊途同归。幸好,现在这两个问题都已经不复存在。

Read More

海明威的老人与海

我不相信人会有所谓的“命运”,但是我相信对于任何人来说,“限度”总是存在的。再聪明再强悍的人,能够做到的事情也总是有限度的。老人桑地亚哥不是无能之辈,然而,尽管他是最好的渔夫,也不能让那些鱼来上他的钩。他遇到他的限度了,就象最好的农民遇上了大旱,最好的猎手久久碰不到猎物一般。每一个人都会遇到这样的限度,仿佛是命运在向你发出停止前行的命令。

Read More