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输出的快照:

http://goog-perftools.sourceforge.net/doc/pprof-test-big.gif

内存分析#

要在 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 发布的微基准测试结果。

参考文献#