背景
Ray Data的算子并发度大多是通过手工设置的, 自动感知的大多不能满足资源利用率的情况。但是手工设置opeartor并发很容易触发限流,但是限流目前很难获取到限流原因,火山EMR提供了一些分析背压原因的功能以及如何增加更多的背压策略。
背压触发条件
触发条件总共包括四种:
- 资源有预留:DataContext.get_current()data_context.op_resource_reservation_enabled = true (默认)。每次在新任务提交时会检查task 所需要的资源是否还能满足。整体资源会分为reserved和shared。
- **资源无预留:**DataContext.get_current()data_context.op_resource_reservation_enabled = false。资源统一管理
- 背压策略: 开源策略中只支持 ConcurrencyCapBackpressurePolicy, running tasks是否超过了设置的并发数
- Op 是否可以增加输入: 针对actor pool是否有剩余free slots空间, 主要是 看actor上的running tasks 与默认数目的差别
背压增强
背压可观测增强
增加背压策略
如何调优执行参数
示例:执行链路调整

- 默认参数提交后发现整体的CPU没有利用起来 (20/46),而ReadBinary的的任务数也不能增加,下图可以看出来总共触发了两类反压:
- New tasks反压: 预留资源模式的反压,shared资源占用过多。
- 要对shared资源的模式设置为false. op_resource_reservation_enabled = false
- Should add input: actor上无空闲slot,也就是资源不够。
- 增加BgeEmbeddingMapper用到的GPU资源
- 调整了上一步骤的预留资源参数后, 可以看到cpu的资源基本上都被使用上了。
但是Resources 这里的cpu只是逻辑计数,不是实际的cpu使用率, 具体的资源使用率可以用通过ui查看。
如果cpu 利用率比较低的话, 可以调整num_cpus 、concurrency、batch_size 来控制具体的资源使用率。如果资源利用率不高的话,可以DEFAULT_MAX_TASKS_IN_FLIGHT=4 修改下
- 如果是因为内存使用问题可以调整以下两个参数
- op_resource_reservation_enabled
- DEFAULT_OBJECT_STORE_MEMORY_LIMIT_FRACTION_WO_RESOURCE_RESERVATION