4.2 版本以后的 OCP 里租户的 CPU 利用率的计算逻辑看起来是 实际CPU 时间/ 租户最大 CPU 配额,现在这个值基本上很准了。
4.0 版本以及以后的 OB 集群在部署后默认还开启了 cgroup CPU 资源隔离(集群参数 enable_cgroup 为 true )。
以上两点加起来现在 OCP 里租户的 CPU 资源利用率就非常精准且不会超过 100% 。即使你开启了“超卖”,在这个统计逻辑下,这个值依然不会超过 100% 。
所以,这里你的问题是 CPU 告警。告警了,那是真的说明租户需要更多的 CPU 资源。应对方案首先是优化 SQL,降低一些 SQL 的 CPU 、IO 消耗。通常就是通过索引调优,其次就是 outline 调整 sql执行i计划。其他还有一些手段如收集统计信息等,也是间接改变不好的执行计划。
租户开启了分布式(指租户 primary_zone 设置为多个 zone),很可能导致业务事务在内部是分布式事务,事务的平均延时会增加。不过跟租户在单节点的CPU利用率增加没有必然的关系。但是分布式会让你的优化变得复杂。就优化sql而言,可以先设置 primary_zone设置为 单 zone ,让某些明显的 SQL 问题暴露,先优化。如果已经无从优化,租户改为 分布式,压力能分摊到多个节点(分摊水平不一定相同是正常的)。如果节点此时 CPU 利用率还是很高经常告警,那就给租户 CPU 扩容。
此外,由于开启了 cgroup CPU 资源隔离,如果租户的CPU 配额不高,是容易出现机器很空闲但是租户CPU利用率高的情况。这种情形你也可以考虑关闭 cgroup CPU 资源隔离,让这个租户多用一些 CPU 。此时你会观察到 OCP 的租户 CPU 利用率超过 100%。这样节点的CPU 利用率会更高一些。资源隔离有利有弊。
资源分的那么清楚就会避免浪费;不分那么清楚,有时候又会觉得有些租户占了其他租户的便宜。如果是线下的OB 业务,都是自己的业务,如果不同租户业务负载特点不一样,或者说互补,不隔离是最好的。当然隔离开启超卖也是一个做法。
如果你就一个租户,那先开启分布式用法,还不行就扩容租户 CPU 。