recon工具解读
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工具解读的更多相关文章
- cJSON序列化工具解读一(结构剖析)
cJSON简介 JSON基本信息 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.易于人阅读和编写.同时易于机器解析和生成.是一种很好地数据交换语言. 官方 ...
- cJONS序列化工具解读二(数据解析)
cJSON数据解析 关于数据解析部分,其实这个解析就是个自动机,通过递归或者解析栈进行实现数据的解析 /* Utility to jump whitespace and cr/lf *///用于跳过a ...
- cJONS序列化工具解读三(使用案例)
cJSON使用案例 由了解了cJSON的数据结构,接口以及实现之后,那么我们来举例说明其使用. 本例子是一个简单的学生信息表格管理,我们通过键值对的方式向json中增加元素信息. 然后可以格式化输出结 ...
- rpm部分命令解读
rpm部分命令解读 rpm---RedHat Package Manger---打包及安装工具 rpm参数列表 rpm -a rpm -q < rpm package name> 解读 ...
- 专为seo新手准备的百度分享工具教程
http://www.wocaoseo.com/thread-178-1-1.html 百度分享工具是目前seo站长最为常用的工具之一,主要用来让用户分享来提高网站的流量,同时他也有很多实际有效的方式 ...
- Java RMI学习与解读(三)
Java RMI学习与解读(三) 写在前面 接下来这篇就是最感兴趣的Attack RMI部分了. 前面也说过,RMI的通信过程会用到反序列化,那么针对于RMI的三个角色: Server/Regisrt ...
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- SDK
IOS: iOS Application Life Cycle 应用程序生命周期 http://www.cnblogs.com/chenyg32/p/3873301.html iOS应用程序生命周期( ...
- MySQL复制原理-加强版
mysql从3.23开始提供复制功能,复制指将主库的ddl和dml操作通过binlog文件传送到从库上执行,从而保持主库和从库数据同步.mysql支持一台主库同时向多台从库复制,从库同时也可以作为其他 ...
随机推荐
- html form禁止表单回车自动提交(通常原因是为在ajax提交前、后进行js判断控制)
@*onkeydown事件用于禁止回车自动提交form,这样就不经过js控制跳转*@ <form action="/Account/CheckPsw" method=&quo ...
- [dpdk][sysfs][pci] 在dpdk程序中操纵PCI设备
〇 需求 在DPDK程序运行时,希望能够实时的操纵PCI 网卡设备的驱动绑定与解绑. 本文的目的是为了调查满足以上需求的,kernel提供的,标准的API都有几种,分别是什么.以确定实施方案. 一 ...
- Redis的数据结构之哈希
存储Hash String key和String Value的Map容器 每一个Hash可以存储4294967295个键值对 存储Hash常用命令: 赋值 取值 删除 增加数字 判断字段是否存在 获取 ...
- 小程序 切换到tabBar页面不刷新问题
小程序跳转的几种方式有wx.navigateTo,wx.redirectTo,wx.reLaunch,wx.switchTab等.下面我们重点研究切换到tabBar的两种方式. wx.switchTa ...
- shiro学习总结
首先4个比较好的例子供参考: 1.常规Spring MVC拦截器实现的认证和权限管理例子 https://blog.csdn.net/u013647382/article/details/539956 ...
- OAuth2认证和授权:ResourceOwnerPassword认证
ResourceOwnerPassword在 ClientCredentials认证上新增了用户名和密码 但通过RequestPasswordTokenAsync获取不到refresh_token,不 ...
- cookies增删改擦操作
//判断是否存在名为aaa的cookie function hasSetCookie(name){ var strCookie = document.cookie; var arrCookie = s ...
- Cloud-init
cloud-init用于在创建虚拟机时通过元数据服务对虚拟机基本配置,包括常见的主机名,用户,密码等等.同时用户可以通过user_data自定义一些数据对虚拟机进行配置,可以有配置文件cloud-co ...
- 从AST编译解析谈到写babel插件
之前一直在掘金上看到一些关于面试写babel插件的文章,最近也在学,以下就是学习后的总结. 关键词:AST编译解析, babel AST编译解析 AST[维基百科]:在计算机科学中,抽象语法树(Abs ...
- Matlab的用法总结
1. 对序列进行洗牌 randperm() randperm()产生随机的序列 %if filepaths 是一个5*1的结构体,then cshuffle = randperm(length(fil ...