OTP监控树笔记

这是Learn You Some Erlang中的Building an Applications with Otp的笔记.

在文中, OTP被戏称为Onion Theory Platform, 监控树像洋葱一样, 一层又一层.

OTP的哲学是工人-监工, 工作进程做错事就让它死掉, 监督进程再开启新的工作进程来干活. 这样做有个让人觉得很麻烦的问题: 工作进程死掉了, 它的状态怎么办? 文中进行了讨论. 状态可以分成三类:

  • 静态的状态. 这从配置文件读回来就可以, 没什么问题.

  • 动态但可重新获取的状态. 就是那些可以利用初始状态计算而来的东西, 重新算就行了.

  • 动态且不可重新获取的状态. 比如说用户的输入, 外部事件等等.

如果工作进程只有前两类状态, 用监工的方法很容易的处理, 死了重启, 恢复状态就可以了.

第三类的状态需要放到不允许出错的地方(error kernel), 其实就是用try...catch包起来.

作者示范了一个进程池的设计.

所谓进程池, 就是可以容纳一定数量的进程同时运行, 当同时运行的进程数达到限制时, 把工作放入队列进行排队, 等待有空位时再开始新的任务.

做这么一个进程池, 需要有一个服务进程来计数同时运行的工作进程数 …

more ...

Apache启动时报443端口被占用的处理方法

下午在自己机上装了Apache2.4, 启动时说443端口被占了:

(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。  : AH00072: mak
e_sock: could not bind to address [::]:443
(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。  : AH00072: mak
e_sock: could not bind to address 0.0.0.0:443
AH00451: no listening sockets available, shutting down

杀掉占用443的那个程序当然可以, 另一种方法是把443改成另外的不常用端口: 如这篇文章 …

more ...

【Erl代码片段】cowboy的一处大小写处理代码

在cowboy的库cowlib中的cow_inline.hrl文件看到一堆很长的宏:

-define(INLINE_LOWERCASE(Function, Rest, Acc),
    $A -> Function(Rest, << Acc/binary, $a >>);
    $B -> Function(Rest, << Acc/binary, $b >>);
    $C -> Function(Rest, << Acc/binary, $c >>);
    $D -> Function(Rest, << Acc/binary, $d >>);
    $E -> Function(Rest, << Acc/binary, $e >>);
    $F -> Function(Rest, << Acc/binary, $f >>);
    $G -> Function(Rest, << Acc/binary …
more ...

【Erl代码片段】更快的proplists:get_value/3

在cowboy的cowboy_protocol.erl 文件中看到如这样一下函数:

%% Faster alternative to proplists:get_value/3.
get_value(Key, Opts, Default) ->
    case lists:keyfind(Key, 1, Opts) of
        {_, Value} -> Value;
        _ -> Default
    end.

做了一下测试, 考虑到proplist一般都不长, 用一个10个元素的列表进行测试, 结果这个函数比 proplists:get_value/3 快5倍, 对于更长的列表差别更大.

bench:get_value/3
Single Process:   13035909 call per sec,   16777216 times in  1287 ms …
more ...

Erlang数据项的size

Erlang中数据项(Erlang Term)的所占据的空间大小可以用各种size来获取.

  • 其中对于所有数据项都通用的有: erlang:external_size/1, erts_debug:size/1, erts_debug:flat_size/1

  • 适用于二进制串有: erlang:size/1, erlang:byte_size/1, erlang:bit_size/1

  • 适用于元组的有: erlang:size/1, erlang:tuple_size/1

erlang:external_size/1

erlang:external_size/1 用来获取erlang数据项的外部格式(External Term Format)最大大小. 所谓外部格式, 就是用term_to_binary/1 打包形成的格式, 如果要把数据项从一台节点发到另一个节点, 或是持久化装到数据库中 …

more ...

使用jqPlot绘制统计图-1

要在网页上显示统计图, 可以在服务器生成图片后发给浏览器, 也可以把数据发给浏览器, 用JavaScript画. jqPlot是后者的一种, 它是jQuery的一个插件, 是完全运行于客户端的绘图包. 下面简介一下它的使用.

引用库文件

jqPlot 是 jQuery 插件, 需要在网页上引用 jQuery 和 jqPlot 包中的以下的几个文件.

要注意这几个只是最基本的, 要做出各种图形效果的话, 需要另外再引用其他的一些文件, 后面会分别介绍.

<!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
<script language="javascript" type="text/javascript" src="jquery.min.js"></script>
<script …
more ...