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请求再发送过去或许是一个提高性能的办法。

你可能感兴趣的:(erlang)