wikimedia / arc-lamp
用于 PHP 堆栈跟踪的火焰图和日志处理。
Requires
- php: >=7.2.0
- ext-redis: *
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-08 07:36:25 UTC
README
Arc Lamp
Arc Lamp 可以帮助从正在运行的 PHP 7 应用程序中收集堆栈跟踪,并以火焰图和跟踪日志的形式发布。
请参阅 performance.wikimedia.org 以查看实时示例。
先决条件
客户端
- 您的 PHP 应用程序,包括 php-excimer 和 php-redis。
处理器
快速入门
require_once 'ArcLamp.php'; Wikimedia\ArcLamp::collect( [ 'redis-host' => '127.0.0.1' ] );
要自动为所有网络请求和入口启用此功能,您可以使用 PHP 的 auto_prepend_file
选项。例如,请参阅 Wikimedia 的配置。
工作原理
另请参阅:在 Wikimedia Techblog 上的 大规模生产中的 PHP 性能分析。
Arc Lamp 管道包括三个阶段
- 捕获堆栈跟踪。
- 创建跟踪日志。
- 生成火焰图。
捕获堆栈跟踪
使用 php-excimer 扩展定期收集回溯。默认情况下,它没有运行时开销。当从网络请求启用时,它会定期安排一个优雅的中断,此时它将捕获回溯。
这些跟踪可以收集自 PHP 回调,并根据需要发送到套接字或文件。
在 ArcLamp.php
中的默认操作是将跟踪发送到 Redis pubsub 通道。
Arc Lamp最初于2014年创建,用于Xenon,这是一个 HHVM 引擎本地的 PHP 采样分析器。要使用 Arc Lamp 与 HHVM Xenon 一起,请参阅 arc-lamp v1.0。
创建跟踪日志
在 Wikimedia 的生产集群中,Arc Lamp 的 Redis 服务器位于高可用性的 "Tier 1" 区域,因此与离线性能、研究和统计服务("Tier 2")分离。
每个生产网络服务器使用 PHP 中的 ArcLamp::collect
客户端将跟踪发送到 Redis。
arclamp-log
服务订阅 Redis pubsub 通道,标准化堆栈跟踪并将它们写入相关的跟踪日志文件。例如,示例配置 为每小时和每天创建一个跟踪日志文件。
在这两个时间段内,它将跟踪日志按 PHP 应用程序的入口点分割。
例如,MediaWiki 应用程序有 index.php
,和 rest.php
(Web)以及 RunJobs.php
(CLI)入口点。这导致以下跟踪日志
daily/2019-12-21.all.log
daily/2019-12-21.index.log
daily/2019-12-21.rest.log
daily/2019-12-21.RunJobs.log
- …
hourly/2019-12-21_20.all.log
hourly/2019-12-21_20.index.log
hourly/2019-12-21_20.rest.log
hourly/2019-12-21_20.RunJobs.log
- …
《arclamp-log》服务还负责删除超过配置保留期的旧跟踪日志。
生成火焰图
《arclamp-generate-svgs》脚本是定期运行的,它会为每个跟踪日志文件创建或更新相关的火焰图。它还维护每个火焰图的反向版本。
例如
daily/2019-12-21.all.svgz
daily/2019-12-21.all.reversed.svgz
daily/2019-12-21.index.svgz
daily/2019-12-21.index.reversed.svgz
- …
hourly/2019-12-21_20.all.svgz
hourly/2019-12-21_20.all.reversed.svgz
hourly/2019-12-21_20.index.svgz
hourly/2019-12-21_20.index.reversed.svgz
- …
《arclamp-generate-svgs》脚本还会删除不再存在的跟踪日志对应的图表。
火焰图使用Brendan Gregg的flamegraph.pl生成。
演示
请参阅 performance.wikimedia.org 以查看实时示例。