显示标签为“Erlang”的博文。显示所有博文
显示标签为“Erlang”的博文。显示所有博文

2009年5月12日星期二

在Linux下统计你的Erlang程序的行数(SLOC)

统计代码行数(SLOC, soure line of code)的几种选择:
  1. 使用命令wc -l filename可以统计文件filename的行数,但是不能除去空行和注释。
  2. Linux下有个程序叫sloccount,可以统计各种语言的代码行数,但是不支持Erlang -_-!
  3. 我的最终解决方案是使用grep。
使用下面的命令即可统计当前目录下Erlang源代码的行数:
grep -cv '\(^%\)\|\(^\s*$\)' *.erl *.hrl
或者
egrep -cv '(^%)|(^\s*$)' *.erl *.hrl
返回的结果类似于:
module1.erl: 120
module2.erl: 38
module2.hrl: 45

参数c表示让grep统计行数
参数v, 也就是--invert-match,表示选取不符合正则表达式的行

正则表达式(^%)|(^\s*$)由两个正则表达式的并组成。正则表达式^%表示注释(Erlang的注释都以%开始),而正则表达式^\s*$表示开头(^)与结尾($)之间只有任意多个空白符(\s)的行,也就是空行。这样整个正则表达式(^%)|(^\s*$)即表示注释行或者空白行。

GNU的grep和egrep功能相当,区别在于前者使用GNU Basic Regular Expression(BRE),这是目前还在使用的最古老的正则表达式语法,而后者使用的是GNU Extended Regular Expression(ERE)。

两种正则表达式语法的主要区别是前者要求特殊符号前必须有转移字符\, 而后者不要求有\,但是当想表示特殊字符的原意的时候必须加\作为前缀。当正则表达式中有很多特殊符号的时候,ERE的表达就比BRE简洁不少。

关于BRE和ERE可以查看http://www.regular-expressions.info/gnu.html
关于grep的正则表达式的语法可以查看http://opengroup.org/onlinepubs/007908775/xsh/regexp.html

2009年4月26日星期日

Erlang的Mailbox或者MQ的性能问题

最近看了几篇帖子

erlang-questions mailing list上的讨论Low disk logging performane in SMP
Caoyuan's Blog: A Case Study of Scalability Related "Out of memory" Crash in Erlang
Caoyuan's Blog: Async or Sync Log in Erlang - Limit the Load of Singleton Process

它们都是关于Erlang的mailbox性能问题的。所谓mailbox,就是Erlang的process用于存储其他进程发来的尚未处理的消息的容器。

根据这些讨论我有下面几点总结:
  1. 不要把mailbox“撑爆”:当mailbox太大的时候,selective receive的性能就会大打折扣。在第二篇帖子中,作者的甚至把error_logger的mailbox塞到机器out of memory!
  2. 如何避免:这几篇讨论这中“撑爆”的mailbox都是日志process:一个是error_logger,另一个是file_logger。日志进程的io操作都是比较耗时间的,而发送来的消息又太多太快,以至于写日志的进程根本来不及处理,消息只能在mailbox中积累。所以这在种consumer速度跟不上producer的情况,要尽量减轻consumer(这里是logger)的负担,让操作尽量在producer处完成(比如日志的格式化操作在发送者处做好,而不是在logger处)。另外还可以考虑把logger从singleton变成分布式的。
  3. SMP:多核的使用会加剧这种多producer单consumer情形的速度差距,导致性能下降,甚至内存溢出。
  4. 根据第一篇中的讨论,file:write似乎也是把write的请求发给一个file server,所以过多的请求也会导致write请求的处理效率低下。把几个write请求大包成一个write请求再发送过去或许是一个提高性能的办法。