查看源代码 测试和工具
追踪
为了启用追踪功能,我们对代码进行了仪表化处理。在禁用追踪的情况下运行应用程序,性能开销可以忽略不计(即调用一个返回原子值的外部函数)。激活追踪功能不需要重新编译代码,因为我们依赖于 Erlang/OTP 内置的动态追踪激活支持。在我们的例子中,是对给定外部函数的调用进行追踪。
事件追踪可以在通用消息序列图工具 et
中查看,或者作为标准输出(事件写入到 stdio)。
有关更多信息,请参阅 enable_trace、disable_trace 和 set_trace。
测量和转换
我们提供了一些简单的工具,用于编解码器测量 (meas)、性能测试 (mstone1 和 mstone2) 和消息转换。
这些工具位于 example/meas 目录中。
要求
- Erlang/OTP,版本 24.2 或更高版本。
- 此 应用程序的版本 4.2 或更高版本。
- asn1 应用程序的版本 5.0.17 或更高版本。
- flex 库。如果没有它,则无法使用 flex 驱动的编解码器。
Meas 结果
测量运行 (meas) 的结果是四个与 Excel 兼容的文本文件
- decode_time.xls -> 解码结果
- encode_time.xls -> 编码结果
- total_time.xls -> 总计(解码+编码)结果
- message_size.xls -> 消息大小
说明
该工具包含四项内容
- 转换模块
- 测量 (meas) 模块
- mstone (mstone1 和 mstone2) 模块
- 基本消息文件
消息转换
不同工具使用的消息包含在单个消息包文件中(请参阅下文了解更多信息)。此文件中的消息仅使用一种编解码器进行编码。在测量开始时,读取消息,然后将其转换为测量中使用的所有编解码器格式。
消息转换由转换模块完成。它用于将一组使用一种编解码器编码的消息转换为其他基本编解码器的格式。
测量
有两种不同的测量工具
meas:
用于执行编解码器测量。即,查看 megaco 应用程序提供的不同编解码器可以达到什么样的性能。
测量通过在每个消息的解码/编码函数上迭代约 2 秒并计算解码/编码的数量来完成。
最好通过修改工具提供的 meas.sh.skel 骨架脚本来运行。
要手动运行,请执行以下操作
% erl -pa <path-megaco-ebin-dir> -pa <path-to-meas-module-dir> Erlang (BEAM) emulator version 5.6 [source] Eshell V12.2 (abort with ^G) 1> megaco_codec_meas:start(). ... 2> halt().
或者为了更轻松,假设将在所有编解码器上进行测量(如上所述)
% erl -noshell -pa <path-megaco-ebin-dir> \\ -pa <path-to-meas-module-dir> \\ -s megaco_codec_meas -s init stop
如上所述运行(这将需要一些时间),测量过程按如下方式进行
For each codec: For each message: Read the message from the file Detect message version Measure decode Measure encode Write results, encode, decode and total, to file
mstone1 和 mstone2:
这是两个不同的 SMP 性能监控工具。
mstone1 为 megaco 应用程序支持的每个编解码器配置创建一个进程,并让它们运行特定时间(全部同时运行),编码和解码 megaco 消息。处理的消息总数是 mstone1(1) 值。
有不同的方法来运行 mstone1 工具,例如,使用或不使用驱动程序,仅 使用 flex 驱动的配置。
最好通过修改工具提供的 mstone1.sh.skel 骨架脚本来运行。
mstone2 与 mstone1 工具类似,但在这种情况下,每个创建的进程只对消息进行一次 运行,然后退出。一旦进程退出,就会创建一个新进程(具有相同的配置和消息)来代替它。处理的消息总数是 mstone2(1) 值。
这两个工具都使用工具提供的消息包 (time_test.msgs),尽管它可以在任何消息包上运行,只要它具有相同的结构。
消息包文件
这只是一个 Erlang 兼容的文本文件,其结构如下:{codec_name(), messages_list()}
。
codec_name() = pretty | compact | ber | per | erlang (how the messages are encoded)
messages_list() = [{message_name(), message()}]
message_name() = atom()
message() = binary()
编解码器名称是 message_list()
中所有消息都已编码的编解码器的名称。
可以通过调用 export_messages 函数将此文件 导出
到文件结构。如果要使用外部工具进行测量,这会很有用。导出消息会创建一个具有以下结构的目录树
<message package>/pretty/<message-files>
compact/
per/
ber/<message-files>
erlang/
该文件包括版本 1、2 和版本 3 的消息。
注释
二进制编解码器
使用二进制编码有两种基本方法:使用与包相关的名称和终止 ID 转换(“本机”编码配置)或不使用。这种转换将与包相关的名称和终止 ID 转换为更方便的内部形式(与解码的文本消息等效)。
转换在实际解码完成后_进行_。
因此,在测试中,二进制编解码器使用两种不同的编码配置进行测试,以确定不同的选项如何影响性能:使用转换 ([]) 和不使用转换 ([native])。
包含的测试消息
其中一些消息是从旧版本 RFC 中的呼叫流程示例中提取的,另一些消息则是为了测试 megaco 的特定功能而创建的。
测量工具目录名称
请确保_不要_将包含测量二进制文件的目录命名为以 “megaco-” 开头,例如 megaco-meas。这将混淆 Erlang 应用程序加载器(Erlang 应用程序命名为,例如 megaco-5.2)。