使用 py-spy 进行性能分析#
堆栈跟踪和CPU分析#
py-spy 是一个用于 Python 程序的采样分析器。它允许你可视化你的 Python 程序在哪些方面花费了时间,而无需重新启动程序或以任何方式修改代码。本节描述了如何配置 RayCluster YAML 文件以启用 py-spy,并通过 Ray Dashboard 查看堆栈跟踪和 CPU 火焰图。
前提条件#
py-spy 需要 SYS_PTRACE
权限来读取进程内存。然而,Kubernetes 默认不包含此权限。要启用分析,请将以下内容添加到 template.spec.containers
中,用于头节点和工作节点 Pod。
securityContext:
capabilities:
add:
- SYS_PTRACE
注释:
在
baseline
和restricted
Pod 安全标准下,添加SYS_PTRACE
是被禁止的。更多详情请参见 Pod 安全标准。
通过 Ray 仪表板检查 CPU 火焰图和堆栈跟踪#
步骤 1:创建一个 Kind 集群#
kind create cluster
步骤 2:安装 KubeRay 操作员#
按照 此文档 通过 Helm 仓库安装最新稳定版本的 KubeRay 操作员。
步骤 3:使用 SYS_PTRACE
功能创建一个 RayCluster#
# Download `ray-cluster.py-spy.yaml`
curl -LO https://raw.githubusercontent.com/ray-project/kuberay/v1.0.0/ray-operator/config/samples/ray-cluster.py-spy.yaml
# Create a RayCluster
kubectl apply -f ray-cluster.py-spy.yaml
步骤 4:转发仪表板端口#
kubectl port-forward svc/raycluster-py-spy-head-svc 8265:8265
步骤 5:在头节点 Pod 中运行一个示例作业#
# Log in to the head Pod
kubectl exec -it ${YOUR_HEAD_POD} -- bash
# (Head Pod) Run a sample job in the Pod
# `long_running_task` includes a `while True` loop to ensure the task remains actively running indefinitely.
# This allows you ample time to view the Stack Trace and CPU Flame Graph via Ray Dashboard.
python3 samples/long_running_task.py
注释:
如果你在运行自己的示例时遇到查看CPU火焰图时出现错误
Failed to write flamegraph: I/O error: No stack counts found
,这可能是由于进程处于空闲状态。特别地,使用sleep
函数可能导致这种状态。在这种情况下,py-spy 会过滤掉空闲的堆栈跟踪。更多信息请参考此 问题。
步骤 6:使用 Ray 仪表板进行性能分析#
访问 http://localhost:8265/#/cluster。
点击
Stack Trace
查看ray::long_running_task
。点击
CPU Flame Graph
查看ray::long_running_task
。有关使用分析器的更多详细信息,请参阅 仪表板中的Python CPU分析。
步骤 7:清理#
kubectl delete -f ray-cluster.py-spy.yaml
helm uninstall kuberay-operator