recon 是ferd 大神 释出的一个 用于生产环境诊断Erlang 问题的一个工具, 不仅仅是对Erlang stdlib 接口的封装, 还有memory fragmentation 相关的函数.

下面对rencon的各个函数进行解读,做个笔记

-module(recon).
-export([info/1, info/2, info/3, info/4,
proc_count/2, proc_window/3,
bin_leak/1,
node_stats_print/2, node_stats_list/2, node_stats/4,
scheduler_usage/1]).
-export([get_state/1, get_state/2]).
-export([remote_load/1, remote_load/2,
source/1]).
-export([tcp/0, udp/0, sctp/0, files/0, port_types/0,
inet_count/2, inet_window/3,
port_info/1, port_info/2]).
-export([rpc/1, rpc/2, rpc/3,
named_rpc/1, named_rpc/2, named_rpc/3]).
......
......

info/1,2,3,4  erlang:process_info的封装,默认打印[meta, signals, location, memory_used, work]这几个参数

info(PidTerm, meta) ->
info_type(PidTerm, meta, [registered_name, dictionary, group_leader,
status
]);
info(PidTerm, signals) ->
info_type(PidTerm, signals, [links, monitors, monitored_by, trap_exit]);
info(PidTerm, location) ->
info_type(PidTerm, location, [initial_call, current_stacktrace]);
info(PidTerm, memory_used) ->
info_type(PidTerm, memory_used, [memory, message_queue_len, heap_size,
total_heap_size, garbage_collection
]);
info(PidTerm, work) ->
info_type(PidTerm, work, [reductions]);

1个参数是[pid],默认显示5类如上,2个参数是[pid, type],和erlang:process_info/2一样;3个参数A,B,C 3个int,组成<A.B.C>;4个参数是 A, B, C, type


proc_count/2  第一个参数type是process_info_item()(erlang:process_info/2第二个参数的选项)或者binary_memory(使用的内存和),

第二个参数N是个数,打印的是排序后(从大到小)前N个进程的type值(运行这个命令的本进程不在计算内


proc_window/3  第一个是type(同上),第二个是N(同上),第3个是Time(ms)时间

表示Time时间内,type值得变化增长或减小


bin_leak/1 第一个参数是N, 表示排序后前N个进程(主动gc前后内存使用的变化值)


node_stats_print/2  第一个个参数是N, 表示打印的次数, 第二个是Time(ms)时间,表示打印间隔时间, 打印的内容如下,主要包括进程数,内存,io,gc次数,erlang调度器利用率(调度器线程忙不忙)

    Stats = fun({{OldIn,OldOut},{OldGCs,OldWords,_}, SchedWall}) ->
%% Absolutes
ProcC = erlang:system_info(process_count),
RunQ = erlang:statistics(run_queue),
{_,LogQ} = process_info(whereis(error_logger), message_queue_len),
%% Mem (Absolutes)
Mem = erlang:memory(),
Tot = proplists:get_value(total, Mem),
ProcM = proplists:get_value(processes_used,Mem),
Atom = proplists:get_value(atom_used,Mem),
Bin = proplists:get_value(binary, Mem),
Ets = proplists:get_value(ets, Mem),
%% Incremental
{{input,In},{output,Out}} = erlang:statistics(io),
GC={GCs,Words,_} = erlang:statistics(garbage_collection),
BytesIn = In-OldIn,
BytesOut = Out-OldOut,
GCCount = GCs-OldGCs,
GCWords = Words-OldWords,
{_, Reds} = erlang:statistics(reductions),
SchedWallNew = erlang:statistics(scheduler_wall_time),
SchedUsage = recon_lib:scheduler_usage_diff(SchedWall, SchedWallNew),
%% Stats Results
{{[{process_count,ProcC}, {run_queue,RunQ},
{error_logger_queue_len,LogQ}, {memory_total,Tot},
{memory_procs,ProcM}, {memory_atoms,Atom},
{memory_bin,Bin}, {memory_ets,Ets}],
[{bytes_in,BytesIn}, {bytes_out,BytesOut},
{gc_count,GCCount}, {gc_words_reclaimed,GCWords},
{reductions,Reds}, {scheduler_usage, SchedUsage}]},
%% New State
{{In,Out}, GC, SchedWallNew}}
end,

node_stats_list/2 和node_stats_print/2函数一样,一个个打印出来,一个是返回list


node_stats/4  前2个参数和node_stats_print/2一样,第3个参数是Fun函数,第4个初始状态Acc,表示对每次的采样使用Fun函数,结果加上Acc(4参数)组成列表。


scheduler_usage/1 ,参数表示时间Time, 表示Time时间间隔,erlang调度器利用率(调度器线程忙不忙)的比较,只是node_stats_print/2的第一步。


get_state/1, get_state/2    先使用sys:get_state/2,如果未取得结果使用sys:get_status/2, get_state/1使用默认的5000超时时间

 recon:get_state(kernel_sup).
{state,{local,kernel_sup},
one_for_all,
[{child,<0.29.0>,kernel_safe_sup,
{supervisor,start_link,
[{local,kernel_safe_sup},kernel,safe]},
permanent,infinity,supervisor,
[kernel]},
{child,<0.28.0>,kernel_config,
{kernel_config,start_link,[]},
permanent,2000,worker,
[kernel_config]},
{child,<0.23.0>,user,
{user_sup,start,[]},
temporary,2000,supervisor,
[user_sup]},
{child,<0.21.0>,standard_error,
{standard_error,start_link,[]},
temporary,2000,supervisor,
[user_sup]},
{child,<0.20.0>,code_server,
{code,start_link,[]},
permanent,2000,worker,
[code]},
{child,<0.19.0>,file_server_2,
{file_server,start_link,[]},
permanent,2000,worker,
[file,file_server,file_io_server,prim_file]},
{child,<0.18.0>,global_group,
{global_group,start_link,[]},
permanent,2000,worker,
[global_group]},
{child,undefined,net_sup,
{erl_distribution,start_link,[]},
permanent,infinity,supervisor,
[erl_distribution]},
{child,<0.16.0>,inet_db,
{inet_db,start_link,[]},
permanent,2000,worker,
[inet_db]},
{child,<0.13.0>,global_name_server,
{global,start_link,[]},
permanent,2000,worker,
[global]},
{child,<0.12.0>,rex,
{rpc,start_link,[]},
permanent,2000,worker,
[rpc]}],
undefined,0,1,[],kernel,[]}

remote_load/1, remote_load/2  远程热更新节点,第一个参数是nodes()(不包括node()),remote_load/1用的默认的nodes/0,

remote_load(Nodes=[_|_], Mod) when is_atom(Mod) ->
{Mod, Bin, File} = code:get_object_code(Mod),
rpc:multicall(Nodes, code, load_binary, [Mod, File, Bin]);
remote_load(Nodes=[_|_], Modules) when is_list(Modules) ->
[remote_load(Nodes, Mod) || Mod <- Modules];
remote_load(Node, Mod) ->
remote_load([Node], Mod).

source/1 根据模块(.beam)生成(.erl)


tcp/0, udp/0, sctp/0, files/0 各种类型的端口,根据erlang:ports/0的name分开


port_types/0   根据erlang:ports/0的name统计个数


inet_count/2  第一个参数 ['recv_cnt' | 'recv_oct' | 'send_cnt' | 'send_oct'| 'cnt' | 'oct'], cnt表示recv_cnt和send_cnt, oct表示recv_oct和send_oct

第二个参数是个数N,表示all inet ports (TCP, UDP, SCTP)中第一个参数(收发包数)的前N个


inet_window/3 第1,2个参数同上,第3个参数Time时间,表示Time时间内第一个参数(收发包数)的前N个


port_info/1, port_info/2    erlang:port_info/2的封装

port_info(PortTerm) ->
Port = recon_lib:term_to_port(PortTerm),
[port_info(Port, Type) || Type <- [meta, signals, io, memory_used,
specific
]].

rpc/1, rpc/2, rpc/3, named_rpc/1, named_rpc/2, named_rpc/3   这些全是rpc的封装,区别如下

 ......
......
rpc(Nodes=[_|_], Fun, Timeout) when is_function(Fun,0) ->
rpc:multicall(Nodes, erlang, apply, [Fun,[]], Timeout);
......
......
named_rpc(Nodes=[_|_], Fun, Timeout) when is_function(Fun,0) ->
rpc:multicall(Nodes, erlang, apply, [fun() -> {node(),Fun()} end,[]], Timeout);
......
......

recon工具解读的更多相关文章

  1. cJSON序列化工具解读一(结构剖析)

    cJSON简介 JSON基本信息 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.易于人阅读和编写.同时易于机器解析和生成.是一种很好地数据交换语言. 官方 ...

  2. cJONS序列化工具解读二(数据解析)

    cJSON数据解析 关于数据解析部分,其实这个解析就是个自动机,通过递归或者解析栈进行实现数据的解析 /* Utility to jump whitespace and cr/lf *///用于跳过a ...

  3. cJONS序列化工具解读三(使用案例)

    cJSON使用案例 由了解了cJSON的数据结构,接口以及实现之后,那么我们来举例说明其使用. 本例子是一个简单的学生信息表格管理,我们通过键值对的方式向json中增加元素信息. 然后可以格式化输出结 ...

  4. rpm部分命令解读

    rpm部分命令解读 rpm---RedHat Package Manger---打包及安装工具 rpm参数列表   rpm -a rpm -q < rpm package name> 解读 ...

  5. 专为seo新手准备的百度分享工具教程

    http://www.wocaoseo.com/thread-178-1-1.html 百度分享工具是目前seo站长最为常用的工具之一,主要用来让用户分享来提高网站的流量,同时他也有很多实际有效的方式 ...

  6. Java RMI学习与解读(三)

    Java RMI学习与解读(三) 写在前面 接下来这篇就是最感兴趣的Attack RMI部分了. 前面也说过,RMI的通信过程会用到反序列化,那么针对于RMI的三个角色: Server/Regisrt ...

  7. Encrypting bootloader (程序BIN文件加密及在线升级)

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...

  8. SDK

    IOS: iOS Application Life Cycle 应用程序生命周期 http://www.cnblogs.com/chenyg32/p/3873301.html iOS应用程序生命周期( ...

  9. MySQL复制原理-加强版

    mysql从3.23开始提供复制功能,复制指将主库的ddl和dml操作通过binlog文件传送到从库上执行,从而保持主库和从库数据同步.mysql支持一台主库同时向多台从库复制,从库同时也可以作为其他 ...

随机推荐

  1. BeeHive小思考

    事件分发和事件处理 将所有行为注册为不同的时间类型,配置Module,让他们在事件发生时,响应这些事件(除了系统的事件,还可以注册自定义事件,触发自定义事件) Module注册之后应当会生成单例对象, ...

  2. [redis] redis

    redis是什么? wiki redis官方介绍:introduction to redis 安装: install 拉到最下面的install小节 wget http://download.redi ...

  3. CookieUitl

    import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.h ...

  4. PHP中array_merge和array+array的区别

    在PHP中可以使用array_merge函数和两个数组相加array+array的方式进行数组合并,但两者效果并不相同,区别如下: 当下标为数值时,array_merge()不会覆盖掉原来的值,但ar ...

  5. 大牛推荐的5本 Linux 经典必读书

    今天给大家推荐5本Linux学习相关的书籍:这些书籍基本都是很多大牛推荐过,并且深受业界好评的书:虽然只有5本,但是相信把5本全都认真看过的同学应该不多吧?希望这些书能够帮助你进阶为大牛! 上期传送门 ...

  6. 八、UIViewController们之间的协作——Segue

    概述 正所谓“一生二,二生三,三生万物”,1个UIViewController没什么花样,多个UIViewController相互协作就有了各式各样丰富多彩的APP.但是UIViewControlle ...

  7. jsp一些使用技巧

    1.web.xml中配置error页面 一.<error-page> <error-code>500</error-code> <location>50 ...

  8. SQL Server 之 事务与隔离级别实例讲解

    SQL Server 之 事务与隔离级别实例讲解 SQL Server 实现了6个隔离级别来防止并发情况下,类似企图并发的访问或修改同一数据时问题的发生.本文将带你体验全部6个隔离级别.正如你接下来将 ...

  9. SQL SERVER 备份脚本

    DECLARE @FileName VARCHAR(200), @CurrentTime VARCHAR(50), @DBName VARCHAR(100), @SQL VARCHAR(1000)SE ...

  10. Flask最强攻略 - 跟DragonFire学Flask - 第十四篇 Flask-SQLAlchemy

    前不久刚刚认识过了SQLAlchemy,点击这里复习一下 当 Flask 与 SQLAlchemy 发生火花会怎么样呢? Flask-SQLAlchemy就这么诞生了 首先要先安装一下Flask-SQ ...