OceanBase 会将 DOP 按照分区个数的比例分配到多个 OBServer 节点上。如果DOP 为 9,要访问 120 个分区,其中 server1 上有 60 个分区, server2 上有 40 个分区,server3 上有 20 个分区,那么并行线程将会如何分配?
2 个赞
DOP 按分区数量比例分配到各 OBServer,432线程分配度。
- 每个 OBServer 至少分配 1 个线程
- 按分区数量比例分配
- 剩余线程优先分配给执行时间最长的节点,以平衡负载
1 个赞
432分配的话没有严格按比例来吧
按照代码中计算,当做分配时进行整数除法会向下取整。所以最后会空出一个线程。
-
server1: 60 * 9 / 120 = 4.5 → 4 个线程(整数除法向下取整)
-
server2: 40 * 9 / 120 = 3.0 → 3 个线程
-
server3: 20 * 9 / 120 = 1.5 → 1 个线程(整数除法向下取整)
1 个赞
那空出的这个线程就不会使用吗
优化算法进行分配吧
这个肯定是按比例分的
空出的线程优先分配给执行时间最长的节点,以平衡负载
1 个赞
按这样算感觉是432,server1是1个线程处理15个分区,server2是1个线程处理13.3个,server3要1个线程处理20个,在不考虑数据分布倾斜的情况下,最后一个线程大概率是加到server3上
所以如果不考虑数据分布倾斜的情况下,最可能的情况是432分布的吧?
1 个赞
是的