Erlang Thursday – c:i/0

今天的Erlang Thursday继续讲c模块的另一个函数 c:i/0

c:i/0 输出系统的信息,展示本节点的所有进程信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
c:i().
% Pid Initial Call Heap Reds Msgs
% Registered Current Function Stack
% <0.0.0> otp_ring0:start/2 987 4987 0
% init init:loop/1 2
% <0.3.0> erlang:apply/2 6772 823443 0
% erl_prim_loader erl_prim_loader:loop/3 6
% <0.6.0> gen_event:init_it/6 376 220 0
% error_logger gen_event:fetch_msg/5 8
% <0.7.0> erlang:apply/2 1598 463 0
% application_controlle gen_server:loop/6 7
% <0.9.0> application_master:init/4 376 44 0
% application_master:main_loop/2 6
% <0.10.0> application_master:start_it/4 233 69 0
% application_master:loop_it/4 5
% <0.11.0> supervisor:kernel/1 4185 49109 0
% kernel_sup gen_server:loop/6 9
% <0.12.0> rpc:init/1 233 35 0
% rex gen_server:loop/6 9
% <0.13.0> global:init/1 233 51 0
% global_name_server gen_server:loop/6 9
% <0.14.0> erlang:apply/2 233 19 0
% global:loop_the_locker/1 5
% <0.15.0> erlang:apply/2 233 3 0
% global:loop_the_registrar/0 2
% <0.16.0> inet_db:init/1 233 206 0
% inet_db gen_server:loop/6 9
% <0.17.0> global_group:init/1 233 59 0
% global_group gen_server:loop/6 9
% <0.18.0> file_server:init/1 2586 2562 0
% file_server_2 gen_server:loop/6 9
% <0.19.0> erlang:apply/2 2586 155919 0
% code_server code_server:loop/1 3
% <0.20.0> supervisor_bridge:standard_error/ 233 41 0
% standard_error_sup gen_server:loop/6 9
% <0.21.0> erlang:apply/2 233 9 0
% standard_error standard_error:server_loop/1 2
% <0.22.0> supervisor_bridge:user_sup/1 610 87 0
% gen_server:loop/6 9
% <0.23.0> erlang:apply/2 233 24 0
% user user:server_loop/2 5
% <0.24.0> kernel_config:init/1 233 286 0
% gen_server:loop/6 9
% <0.25.0> supervisor:kernel/1 233 58 0
% kernel_safe_sup gen_server:loop/6 9
% <0.29.0> kjell_profile:init/1 987 27100 0
% kjell_profile gen_server:loop/6 9
% <0.30.0> kjell_extension:init/1 2586 3903 0
% kjell_extension gen_server:loop/6 9
% <0.45.0> k_user_drv:server/2 987 2218 0
% user_drv k_user_drv:server_loop/5 8
% <0.46.0> k_group:server/3 987 14541 0
% k_group:server_loop/3 4
% <0.47.0> erlang:apply/2 28690 4406 0
% kjell:shell_rep/4 17
% <0.48.0> erlang:apply/2 1598 20585 0
% c:pinfo/1 49
% Total 58707 1110447 0
% 237
% ok

我们可以看到这个函数返回进程的id,进程的初始化函数即启动进程的函数,进程堆的大小,进程的规约数,进程消息队列里的消息数,进程的注册名字,进程当前所处的函数,以及进程的栈大小。

c:i/0 的输出也包括堆大小、规约数,消息队列大小以及栈大小的各项数据的总和。

c模块也提供 c:ni/0 函数,它展示所有联通的节点的系统信息。

从该函数输出的进程信息来看,我们可以找到几个和 kjell 相关的进程,kjell是我用来替换 erl shell的,它易于查找进程的信息。

查看一个kjell相关的进程,我们可以获得其pid,然后通过调用 c:i/3 展示进程的信息来深入观察该进程,我们可以用pid的3个整数做为此函数的入参。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
c:i(0, 47, 0).
% [{current_function,{kjell,shell_rep,4}},
% {initial_call,{erlang,apply,2}},
% {status,waiting},
% {message_queue_len,0},
% {messages,[]},
% {links,[<0.48.0>,<0.46.0>]},
% {dictionary,[{{result,1},ok},
% {{command,1},[{call,1,{remote,1,{atom,1,c},{atom,1,i}},[]}]},
% {evaluator,<0.48.0>}]},
% {trap_exit,true},
% {error_handler,error_handler},
% {priority,normal},
% {group_leader,<0.46.0>},
% {total_heap_size,46421},
% {heap_size,28690},
% {stack_size,17},
% {reductions,4479},
% {garbage_collection,[{min_bin_vheap_size,46422},
% {min_heap_size,233},
% {fullsweep_after,65535},
% {minor_gcs,2}]},
% {suspending,[]}]

当我们查看指定的进程的信息,我们可以看到它的链接进程,消息和消息队列长度,堆栈的信息,以及其他各种可能有用的相关设置。

同样,这几个函数也没有observer那样有漂亮的界面,不过它们在你无法直接通过一个终端来访问节点的时候可以派上用场,比如在一个跳板机上工作;它们能给你一个好的方式使得你能知道你的erlang节点的运行情况。

原文链接: https://www.proctor-it.com/erlang-thursday-c-i-0/