Ray 开发者的性能分析#
本指南帮助 Ray 项目的贡献者分析 Ray 性能。
获取 Ray C++ 进程的堆栈跟踪#
你可以使用以下 GDB 命令来查看任何运行中的 Ray 进程(例如,raylet)的当前堆栈跟踪。这对于调试 100% CPU 利用率或无限循环非常有用(只需多次运行该命令以查看进程卡在何处)。
sudo gdb -batch -ex "thread apply all bt" -p <pid>
请注意,你可以通过 pgrep raylet
找到 raylet 的进程 ID。
安装#
这些说明仅适用于Ubuntu。尝试在Mac OS上正确符号化 pprof
的尝试已失败。
sudo apt-get install google-perftools libgoogle-perftools-dev
你可能需要安装 graphviz
以便 pprof
生成火焰图。
sudo apt-get install graphviz
CPU 分析#
要在分析模式下启动 Ray 并分析 Raylet,请定义以下变量:
export PERFTOOLS_PATH=/usr/lib/x86_64-linux-gnu/libprofiler.so
export PERFTOOLS_LOGFILE=/tmp/pprof.out
export RAY_RAYLET_PERFTOOLS_PROFILER=1
文件 /tmp/pprof.out
在你让二进制文件运行目标工作负载一段时间后才会被填充,然后通过 ray stop
或让驱动程序退出将其 kill
。
注意:启用 RAY_RAYLET_PERFTOOLS_PROFILER
允许对 Raylet 组件进行性能分析。要分析其他模块,请使用 RAY_{MODULE}_PERFTOOLS_PROFILER
,其中 MODULE
表示进程类型的全大写形式,例如 GCS_SERVER
。
可视化 CPU 性能分析#
你可以通过不同的方式来可视化 pprof
的输出。下面,输出是一个可缩放的 .svg
图像,显示了带有热路径注释的调用图。
# Use the appropriate path.
RAYLET=ray/python/ray/core/src/ray/raylet/raylet
google-pprof -svg $RAYLET /tmp/pprof.out > /tmp/pprof.svg
# Then open the .svg file with Chrome.
# If you realize the call graph is too large, use -focus=<some function> to zoom
# into subtrees.
google-pprof -focus=epoll_wait -svg $RAYLET /tmp/pprof.out > /tmp/pprof.svg
以下是来自官方文档的一个示例SVG输出的快照:
内存分析#
要在 Ray 核心组件上运行内存分析,请使用 Jemalloc (jemalloc/jemalloc)。Ray 支持环境变量来覆盖核心组件上的 LD_PRELOAD。
你可以在 ray_constants.py
中找到组件名称。例如,如果你想分析 gcs_server,可以在 ray_constants.py
中搜索 PROCESS_TYPE_GCS_SERVER
。你可以看到其值为 gcs_server
。
用户需要提供3个环境变量用于内存分析。
RAY_JEMALLOC_LIB_PATH: jemalloc 共享库
.so
的路径。RAY_JEMALLOC_CONF: jemalloc 的 MALLOC_CONF(逗号分隔)。
RAY_JEMALLOC_PROFILE: 以逗号分隔的 Ray 组件来运行 Jemalloc
.so
。例如,(“raylet,gcs_server”)。注意,组件应与ray_constants.py
中的进程类型匹配。(这意味着 “RAYLET,GCS_SERVER” 将不起作用)。
# Install jemalloc
wget https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2
tar -xf jemalloc-5.2.1.tar.bz2
cd jemalloc-5.2.1
./configure --enable-prof --enable-prof-libunwind
make
make install
# Set jemalloc configs through MALLOC_CONF env variable.
# Read http://jemalloc.net/jemalloc.3.html#opt.lg_prof_interval.
# for all jemalloc configs
# Ray start will profile the GCS server component.
RAY_JEMALLOC_CONF=prof:true,lg_prof_interval:33,lg_prof_sample:17,prof_final:true,prof_leak:true \
RAY_JEMALLOC_LIB_PATH=~/jemalloc-5.2.1/lib/libjemalloc.so \
RAY_JEMALLOC_PROFILE=gcs_server \
ray start --head
# You should see the following logs.
2021-10-20 19:45:08,175 INFO services.py:622 -- Jemalloc profiling will be used for gcs_server. env vars: {'LD_PRELOAD': '/Users/sangbincho/jemalloc-5.2.1/lib/libjemalloc.so', 'MALLOC_CONF': 'prof:true,lg_prof_interval:33,lg_prof_sample:17,prof_final:true,prof_leak:true'}
可视化内存概况#
输出文件位于你调用“ray start”的路径。对于名为“jeprof.15786.0.f.heap”的配置文件示例,使用以下命令生成.svg图表。
# Use the appropriate path.
RAYLET=ray/python/ray/core/src/ray/raylet/raylet
sudo jeprof $RAYLET jeprof.15786.0.f.heap --svg > /tmp/prof.svg
# Then open the .svg file with Chrome.
运行微基准测试#
要运行一组单节点 Ray 微基准测试,请使用:
ray microbenchmark
你可以在 GitHub 发布日志 中找到 Ray 发布的微基准测试结果。
参考文献#
一个 Go 版本的 pprof。
gperftools,包括 libprofiler、tcmalloc 和其他有用的工具。