Hyperf定时任务耗时统计与性能分析需在任务中埋点记录毫秒级执行时间、绑定PID采集内存/CPU快照、设置慢任务阈值告警,并确保采集轻量非阻塞、可配置开关。

Hyperf 定时任务的耗时统计与进程性能分析,核心在于捕获任务执行时间、识别慢任务、关联进程资源消耗,并避免影响主业务。不依赖外部 APM 工具也能实现轻量级可观测性。
1. 在定时任务中注入耗时埋点
利用 Hyperf 的 AbstractTask 或注解式任务(@Command/@Cron),在 handle() 方法前后记录毫秒级时间戳,并写入日志或指标存储。
- 推荐使用
microtime(true)获取高精度时间,误差低于 1ms - 将任务名、开始时间、结束时间、耗时(ms)、是否异常等结构化记录
- 示例代码片段:
public function handle()
{
$start = microtime(true);
$taskName = static::class;
<pre class="brush:php;toolbar:false;">try {
// 你的实际业务逻辑
$this->doWork();
$duration = round((microtime(true) - $start) * 1000, 2);
$this->logger->info('Cron task finished', [
'task' => $taskName,
'duration_ms' => $duration,
'status' => 'success'
]);
} catch (\Throwable $e) {
$duration = round((microtime(true) - $start) * 1000, 2);
$this->logger->error('Cron task failed', [
'task' => $taskName,
'duration_ms' => $duration,
'exception' => $e->getMessage(),
'status' => 'failed'
]);
throw $e;
}}
2. 绑定进程 PID 与内存/CPU 使用快照
在任务执行关键节点(如开始前、结束后)调用系统命令或 PHP 内置函数采集当前进程资源占用,便于定位高负载任务。
- 使用
getmypid()获取当前协程所在 worker 进程 PID - 通过
sys_getloadavg()或/proc/{pid}/stat(Linux)读取 CPU/内存快照 - 注意:Hyperf 多协程共享同一进程,PID 不代表单个任务,但可反映该 worker 整体压力
// 示例:记录任务开始时的内存使用(单位 KB)
$pid = getmypid();
$memUsage = (int)shell_exec("ps -o rss= -p {$pid} 2>/dev/null");
$this->logger->debug('Task memory usage start', ['pid' => $pid, 'rss_kb' => $memUsage]);3. 建立慢任务阈值告警机制
基于耗时统计结果,设置动态或静态阈值(如 >3000ms 触发告警),并通过日志关键字、Redis 计数器或 Prometheus 指标暴露。
- 用 Redis 记录最近 N 次耗时,计算 P95/P99,自动调整阈值
- 配合 Hyperf 的
Logger+FileHandler或Monolog配置独立 cron 日志通道,方便 grep 分析 - 可选:对接企业微信/钉钉机器人,超时即推送简要信息(任务类名 + 耗时 + 时间)
4. 避免性能干扰的关键细节
定时任务本身不应成为性能瓶颈,采集逻辑必须轻量、非阻塞、可开关。
- 耗时统计建议关闭 debug 模式下的冗余日志(如 SQL trace),防止 IO 拖慢
- 资源采集频率不宜过高(例如每 5 分钟最多采样一次),避免
ps频繁调用带来开销 - 所有采集逻辑应包裹
try/catch,失败时静默降级,绝不影响任务主流程 - 生产环境建议通过配置项控制是否启用性能采集(如
env('CRON_PERF_ENABLED', false))











