常用启动参数
- -detached
用于运行守护或后台进程 - -remsh Node
连接到某个节点 - -connect_all false
禁止节点自动连通,且不能使用全局注册(global) - +sub true|false
开启或关闭进程调度的负载平衡,默认false - +S Num
开启smp时设置调度进程数量 - +P Number
设置进程数量上限 - -setcookie
指定cookie - -hidden
设置为隐藏节点,在多节点中不会被其他节点自动连接,需要显示调用net_kernel:connect/1 - +sub true
开启调度程序负载平衡 - -extra
设置启动参数,通过init:get_plain_arguments/0获得 - -config
指定应用的配置,通过application:get_env/2获得 - +pc unicode | latin1
启动时指定字符格式- latin1:只有ISO-latin-1范围内的字符才能被认为是可打印的,这意味着代码点大于255的字符将永远不会被打印,并且包含此类字符的列表将被工具显示为整数列表,而不是文本字符串
- unicode:在决定是否以字符串语法显示整数列表时,将考虑所有可打印的Unicode字符。这可能会带来意想不到的结果,例如,如果您的字体没有涵盖所有Unicode字符
- io:printable_range(). 查看shell的字符格式
编程规范
官网推荐
http://www.erlang.se/doc/programming_rules.shtml#REF19691
- 不要写深度嵌套代码
- 不要写非常大的模块,模块行数控制在1000行内
- 不要写很大的函数 尽量控制一个屏幕能显示完整
- 不要写太长的代码,太长时就换行
- 变量命名,驼峰式命名 后面跟数字的前面可以加’_’,以突出显示 如Player_2
- 函数名、模块名,单词以_分隔
- 代码间隔格式 ,后面加空格 看起来比较直观 如{12, 23, 45}
运维常用
recon:scheduler_usage(1000). %% 查看一定时间内调度器程序使用率 参数为毫秒
%% Type = used | allocated | unused | usage | allocated_types | allocated_instances
%% usage 使用率 = used/allocated
%% allocated 系统分配的
%% allocated_types 各种数据类型的占用
%% allocated_instances 调度程序占用,0代表所有
recon_alloc:memory(Type). %% 内存查看 单位b
reconcile:info(Pid). %% 获取进程信息 类似process_info/1 但相对安全,不安全的如binary、dictionary、messages
%% 按Type值排序取前Num个进程的信息
%% Type = memory | message_queue_len | heap_size | binary_memory | reductions
%% 上述为常用选项,其实就是类似process_info里的key
recon:proc_count(Type, Num).
recon:proc_window(Type, Num, Milliseconds) %% 同上,但会在给定时间内采样两次取均值
recon:port_types(). %% 查看端口类型数量
recon:port_info("#Port<0.3440>"). %% 查看端口信息
%% 查看按属性排序的前N个端口信息
%% Attribute = 'recv_cnt' | 'recv_oct' | 'send_cnt' | 'send_oct' | 'cnt' | 'oct'
%% oct:流量字节数,cnt包数
recon:inet_count(Attribute, Num).
recon:inet_window(Attribute, Count, Milliseconds). %% 同上
recon:bin_leak(N). %% 对比gc前后binary内存变化,得出变化最大的N个进程
recon_trace:calls({queue, in, 2}, 1). %% 追踪函数调用
rb:start() %% 查看系统自带日志输出
crashdump_viewer:start() %% win端查看节点挂掉的dump文件
observer:start() %% 具象化看二郎节点信息
%% ets表占用内存排序
lists:reverse(lists:keysort(2, [{Name, ets:info(Name, memory)}||Name<-ets:all()])).
%% 显示10秒内内核进程的使用率
msacc:start(10000),msacc:print().
dialyzer 静态分析
使用示例
dialyzer --build_plt -r "C:\Program Files\erl7.3\lib\erts-7.3\ebin" "C:\Program Files\erl7.3\lib\kernel-4.2\ebin" "C:\Program Files\erl7.3\lib\stdlib-2.8\ebin" "C:\Program Files\erl7.3\lib\mnesia-4.13.3\ebin" "C:\Program Files\erl7.3\lib\crypto-3.6.3\ebin" "C:\Program Files\erl7.3\lib\sasl-2.7\ebin"
dialyzer -Werror_handling -r E:\work\cshx\server\script\../ebin >
gen_server exit
trap_exit | 终止原因 | 进程终止否 | teminate执行否 |
---|---|---|---|
false | test、shutdown、kill、other | 是 | 否 |
false | normal | 否 | 否 |
true | normal、shutdown、test、other | 是 | 是 |
true | kill | 是 | 否 |
ps:游戏节点终止会用init:stop/0,通知到gen_server退出的原因是shutdown
xrl yrl erlydtl
.xrl
.yrl
具体看官方文档,大意是按一定规制写文件,然后可以用erlc编译生成.erl文件
erlc可支持编译的文件格式
erlang模板引擎
https://github.com/erlydtl/erlydtl
https://github.com/erlydtl/erlydtl/wiki 例子
运算符号
运算符 | 说明 | 参数类型 |
---|---|---|
+ | 一元 + | number |
- | 一元 - | number |
* | 乘法 | number |
/ | 浮点除法 | number |
div | 整数除法 | integer |
bnot | 一元 not 位运算 | integer |
rem | 整数求余 | integer |
band | 与运算 | integer |
bor | 或运算 | integer |
bxor | 异或运算 | integer |
bsl | 左移运算 | integer |
bsr | 右移运算 | integer |
全局宏
宏名 | 类型 | 说明 |
---|---|---|
?MODULE | atom | 当前模块 |
?LINE | integer | 当前行数 |
?FILE | string | 当前文件名 |
?FUNCTION_NAME | atom | 当前函数名 |
?FUNCTION_ARITY | integer | 当前函数参数数量 |
?MACHINE | string | 当前执行程序名 ‘BEAM’ |
?MODULE_STRING | string | 当前模块 |
?OTP_RELEASE | integer | OTP版本 = erlang:system_info(otp_release) = 21 |
字符编码
源文件的编码
编译器会用正则\s*[:=]\s*([-a-zA-Z0-9]检索erl文件头两行,若命中,则以声明的编码格式编译文件,R16B之前默认是Latin-1,之后是UTF-8。如可以用以下任意一种声明方式
%% coding: utf-8
%% For this file we have chosen encoding = Latin-1
%% -*- coding: latin-1 -*-
位语法
Flag = utf8、utf16、utf32、little、big、binary
<<Ch/utf8,_/binary>> = Bin1,
<<Ch/utf16-little,_/binary>> = Bin2,
Bin3 = <<$H/utf32-little, $e/utf32-little, $l/utf32-little, $l/utf32-little,
$o/utf32-little>>