From e1f56c25ff2c61f3d391dc05b3ce0f07f5d475b9 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Thu, 20 May 2021 18:18:44 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20nif=E7=BC=96=E8=AF=91=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 96 +++++++++++++++++++------------------- c_src/eNpc | Bin 0 -> 25550 bytes c_src/eNpc.cmd | 4 ++ c_src/tracer/rebar.config | 7 +++ rebar.config | 9 +++- 5 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 c_src/eNpc create mode 100644 c_src/eNpc.cmd create mode 100644 c_src/tracer/rebar.config diff --git a/README.md b/README.md index d5cee2d..5dbe923 100644 --- a/README.md +++ b/README.md @@ -235,89 +235,91 @@ end. 对于长时间运行的会话,eTpf可以旋转跟踪文件。这是一项有助于避免磁盘空间用完的功能,并且不用于保留较小的文件(eTpf可以处理非常大的文件就可以了)。 -lg:trace/3,4可以提供一个映射,而不是将文件名前缀作为第三个参数传递 给。当前有三个选项,包括filename_prefix。其他选项是最大文件大小(以字节为单位)max_size,以及将在文件中每LZ4帧存储的事件数 +eTpf:trace/3,4可以提供一个映射,而不是将文件名前缀作为第三个参数传递 给。当前有三个选项,包括filename_prefix。其他选项是最大文件大小(以字节为单位)max_size,以及将在文件中每LZ4帧存储的事件数 events_per_frame。这两个选项使您可以控制文件写入或旋转的频率。 以下示例将文件大小限制为100MB: ``` -1> lg:trace('_', lg_file_tracer,#{filename_prefix => "traces.lz4", max_size => 100000000}, #{mode => profile, running =>true}). +1> eTpf:trace('_', lg_file_tracer, #{filename_prefix => "traces.lz4", max_size => 100000000}, #{mode => profile, running =>true}). ``` 在测试此功能期间,目前实施的轮换似乎很昂贵,因此您应注意不要设置太低的值。 ## Callgrind分析 -Looking Glass的主要目的是对Erlang应用程序进行性能分析。这是通过首先将事件跟踪到文件或套接字,然后对其进行处理以提取有用的输出来完成的。 +eTpf的主要目的是对Erlang应用程序进行性能分析。这是通过首先将事件跟踪到文件或套接字,然后对其进行处理以提取有用的输出来完成的。 分析工具通常具有几种不同类型的输出。本章是关于callgrind输出的,可以使用qcachegrind/kcachegrind 工具读取。 快速开始 -假设您使用概要文件模式和运行标志生成了跟踪文件(如“ 跟踪”一章中所述),则可以使用以下命令生成callgrind.out文件: - -1 > lg_callgrind:profile_many(“ traces.lz4。* ”,“ callgrind.out ”, -#{ running => true })。 +假设您使用概要文件模式和运行标志生成了跟踪文件(如Tracer一章中所述),则可以使用以下命令生成callgrind.out文件: +``` +1> tpCallgrind:profile_many("traces.lz4.*", "callgrind.out", #{running => true}). +``` 这将为您生成的所有跟踪文件创建一个callgrind.out文件。例如,如果您具有“ traces.lz4.1”和“ traces.lz4.2”,则现在还应该具有“ callgrind.out.1”和“ callgrind.out.2”。 - 现在,您可以通过用户界面或命令行在cachegrind工具中打开这两个文件: - +``` $ qcachegrind callgrind.out -它将自动检测并打开所有与该callgrind.out.*模式匹配的文件。 +``` -分析一个文件 -您可以通过调用函数来分析一个文件 lg_callgrind:profile/2,3。它包含跟踪文件名,输出文件名和一个可选的选项映射: +它将自动检测并打开所有与该callgrind.out.*模式匹配的文件。 -1 > lg_callgrind:配置文件(“ traces.lz4.1 ”,“ callgrind.out.1 ”)。 +Profiling one file +您可以通过调用函数来分析一个文件 `tpCallgrind:profile/2,3`。它包含跟踪文件名,输出文件名和一个可选的选项映射: +``` +1> tpCallgrind:profile("traces.lz4.1", "callgrind.out.1"). +``` 它还接受以下选项: - -1 > lg_callgrind:配置文件(“ traces.lz4.1 ”,“ callgrind.out.1 ”, -#{ running => true })。 -分析许多文件 -便利功能可用于一次分析许多文件:lg_callgrind:profile_many/2,3。它以通配符模式作为第一个参数,并以文件名前缀作为第二个参数: - -1 > lg_callgrind:profile_many(“ traces.lz4。* ”,“ callgrind.out ”)。 -如果有两个跟踪文件,这将导致两个“ callgrind.out”文件:“ callgrind.out.1”和“ callgrind.out.2”。 +``` +1> tpCallgrind:profile("traces.lz4.1", "callgrind.out.1", #{running => true}). +``` +Profiling many files +便利功能可用于一次分析许多文件:`tpCallgrind:profile_many/2,3`, 它以通配符模式作为第一个参数,并以文件名前缀作为第二个参数: +``` +1> tpCallgrind:profile_many("traces.lz4.*", "callgrind.out"). +``` +如果有两个跟踪文件,这将导致两个'callgrind.out'文件:'callgrind.out.1'和'callgrind.out.2'。 它还接受以下选项: - -1 > lg_callgrind:profile_many(“ traces.lz4。* ”,“ callgrind.out ”, -#{ running => true })。 -运行信息 +``` +1> tpCallgrind:profile_many("traces.lz4.*", "callgrind.out", #{running => true}). +``` +Running information 当跟踪文件包含运行信息时,这意味着它们是在running启用了标记的情况下创建的,您还需要将running标记传递给事件探查器,以使该信息在'callgrind.out'文件中可用: - -1 > lg_callgrind:profile_many(“ traces.lz4。* ”,“ callgrind.out ”, -#{ running => true })。 -范围 +``` +1> tpCallgrind:profile_many("traces.lz4.*", "callgrind.out", #{running => true}). +``` +Scope 默认情况下,跟踪事件的范围是全局的。这意味着cachegrind工具会将所有事件组合在一起,无论它们发生在何处。这对于查看哪些功能总体上占用最多资源很有用。 -其他时间,您可能想查看哪些进程占用最多的资源。为此,您需要指示Looking Glass在生成“ callgrind.out”文件时保留过程信息。使用以下scope选项完成此操作: - -1 > lg_callgrind:profile_many(“ traces.lz4。* ”,“ callgrind.out ”, -#{ scope => per_process })。 +其他时间,您可能想查看哪些进程占用最多的资源。为此,您需要指示eTpf在生成“ callgrind.out”文件时保留过程信息。使用以下scope选项完成此操作: +``` +1> lg_callgrind:profile_many("traces.lz4.*", "callgrind.out", #{scope => per_process}). +``` 使用cachegrind工具 当将cachegrind工具与Looking Glass生成的输出一起使用时,需要注意一些陷阱。 cachegrind工具在构建时就考虑了命令性代码。递归处理得不太好。这意味着调用函数的次数可能并不总是正确的,尤其是对于调用自身的函数而言。例如,在查看调用图时,您可以看到此问题的示例。 -当使用该scope ⇒ per_process选项时,Looking Glass使用ELF对象字段来存储过程的pid 。这使您可以通过使用“分组”功能并选择“ ELF对象”来单独调查过程。然后,您可以查看哪些进程占用最多的资源,并查看这些进程中的函数调用。 +当使用该`scope => per_process`选项时,Looking Glass使用ELF对象字段来存储过程的pid 。这使您可以通过使用'grouping'功能并选择'ELF Object'来单独调查过程。 +然后,您可以查看哪些进程占用最多的资源,并查看这些进程中的函数调用。 使用运行标志时,将生成以下事件类型: +* Total time in microseconds +* Active time in microseconds +* Wait time in microseconds (scheduled out) +* Number of times the process was scheduled out -总时间(以微秒为单位) - -激活时间(以微秒为单位) - -等待时间(以微秒为单位) - -计划处理的次数 - -以下公式是正确的:Total = Active + Wait。 +以下公式是正确的:`Total = Active + Wait`. -等待时间是指计划该流程(即它未运行)所花费的时间。这发生在许多不同的地方,例如接收子句或减少计数达到零时。 +等待时间是指计划该流程(即它未运行)所花费的时间。这发生在许多不同的地方,like receive clauses or when the reduction count reached zero. -目前,计划的时间安排可能不准确。另一个可能不准确的部分是花费在执行端口操作上的时间,该时间可能在进程主要等待时显示为活动时间。两者都将在未来得到改进。 +目前,process was scheduled out 次数统计可能不准确。另一个可能不准确的部分是花费在执行端口操作上的时间,该时间可能在进程主要等待时显示为活动时间。两者都将在未来得到改进。 -虽然Looking Glass提供了有关各种调用的行号信息,但它无法识别此调用过程中涉及的函数子句。这意味着当在cachegrind工具中查看源代码时,具有很多子句的函数的调用信息将聚集在同一行号上。这对大多数标准行为(包括handle_event 来自)具有重要影响gen_statem。但是,您可以对代码进行结构化,以使子句繁重的函数仅分派给其他函数,从而在cachegrind工具中获得更好的视图。 +虽然eTpf提供了有关各种调用的行号信息,但它无法识别此调用过程中涉及的函数子句。 +这意味着当在cachegrind工具中查看源代码时,具有很多子句的函数的调用信息将聚集在同一行号上。 +这对大多数标准行为(包括handle_event 来自)具有重要影响gen_statem。但是,您可以对代码进行结构化,以使子句繁重的函数仅分派给其他函数,从而在cachegrind工具中获得更好的视图。 -Looking Glass目前无法找到列表理解和乐趣的行号。他们将始终指向第1行。 +eTpf目前无法找到列表理解和匿名函数的行号。他们将始终指向第1行。 ## Flame graph profiling diff --git a/c_src/eNpc b/c_src/eNpc new file mode 100644 index 0000000000000000000000000000000000000000..18a1eacfc58e23a7a26cc93850f74ccb520446b9 GIT binary patch literal 25550 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