8C 的机器,工作流消费很慢,因为工作流里都是网络请求,几十个工作流排队的情况下,CPU 利用率都只有 10% 都不到。
目前 kafka 默认 每个主题 10 个分区,分别对应 10 个消费线程。
请问目前是只能通过调整 kafka 的分区数量来增加消费线程吗?还有其他提高消费能力的方式吗?
因为只有 workflow-process 的主题排队特别多,是否可以只增加该主题分区数譬如到 50 个,同时消费线程配置增加到 50 个,其他主题的分区数保持默认 10 个?
8C 的机器,工作流消费很慢,因为工作流里都是网络请求,几十个工作流排队的情况下,CPU 利用率都只有 10% 都不到。
目前 kafka 默认 每个主题 10 个分区,分别对应 10 个消费线程。
请问目前是只能通过调整 kafka 的分区数量来增加消费线程吗?还有其他提高消费能力的方式吗?
因为只有 workflow-process 的主题排队特别多,是否可以只增加该主题分区数譬如到 50 个,同时消费线程配置增加到 50 个,其他主题的分区数保持默认 10 个?
单机不建议,因为
ENV_WORKFLOW_CONSUMER_THREADS
是工作流相关消费端共用的,replicas
默认都是 1,你调整了部分 Topic 的分区数,会导致不均衡;集群可以,因为集群可以调整不同消费服务的replicas
的值,从而控制和ENV_WORKFLOW_CONSUMER_THREADS
的乘积小于等于 Topic 分区数。
好的谢谢!
谢谢回答!
这块调优我理解是根据业务特性来的,我是看着监控调的。我们的业务基本都集中在 workflow-button
和 workflow-process
2 个主题中,但是我们业务特性是高网络 IO(延迟),几乎没有计算,所以我的调整方向是增加线程来提高 CPU 利用率,内存可以扩问题不大。
我想确认下是否一定要按照文档里的 如何查看现有分区数、当前消息堆积情况以及如何自定义工作流消息队列的消费=线程=数,把所有主题的分区同时调高到譬如 20,还是说可以只调整其中个别分区?
默认情况,ENV_WORKFLOW_CONSUMER_THREADS=3,每个主题 10 分区情况下,kafka 的 CLIENT-ID 有 18 个消费线程。
当 ENV_WORKFLOW_CONSUMER_THREADS=20,且只调整 workflow-button
和 workflow-process
的分区数到 20,其余主题不做变化,不重复的 CLIENTID,也就是消费线程来到了 86 个,这样会有隐患问题吗?
谢谢回答!
这块调优我理解是根据业务特性来的,我是看着监控调的。我们的业务基本都集中在workflow-button
和workflow-process
2 个主题中,但是我们业务特性是高网络 IO(延迟),几乎没有计算,所以我的调整方向是增加线程来提高 CPU 利用率,内存可以扩问题不大。
我想确认下是否一定要按照文档里的 如何查看现有分区数、当前消息堆积情况以及如何自定义工作流消息队列的消费=线程=数,把所有主题的分区同时调高到譬如 20,还是说可以只调整其中个别分区?默认情况,ENV_WORKFLOW_CONSUMER_THREADS=10,每个主题 10 分区情况下,kafka 的 CLIENT-ID 有 18 个消费线程。
当 ENV_WORKFLOW_CONSUMER_THREADS=20,且只调整
workflow-button
和workflow-process
的分区数到 20,其余主题不做变化,不重复的 CLIENTID,也就是消费线程来到了 86 个,这样会有隐患问题吗?
单机不建议,因为 ENV_WORKFLOW_CONSUMER_THREADS
是工作流相关消费端共用的,replicas
默认都是 1,你调整了部分 Topic 的分区数,会导致不均衡;集群可以,因为集群可以调整不同消费服务的 replicas
的值,从而控制和 ENV_WORKFLOW_CONSUMER_THREADS
的乘积小于等于 Topic 分区数。
kafka 分区数 >=replicas
(单机默认为 1)*ENV_WORKFLOW_CONSUMER_THREADS
最好是等于;另外关于资源情况,就是调整分区数和 ENV_WORKFLOW_CONSUMER_THREADS
以及 replicas
,需要伴随着监控观察来确认还能调整多少或者增加多少。
CPU 和内存,一般单机 8C32G 要求,8C(其实就是线程数;但是颗数也不要低于 4,判断方式:cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l),8C 一般情况下是吃不过 50% 的,比较极端情况可能会过 50% 甚至吃满(比如:慢查询等);内存是比较吃的,这个是直观受 MongoDB 和消费分区数、replicas
和 ENV_WORKFLOW_CONSUMER_THREADS
影响的,一些服务本身也是相对吃内存的(比如。Net)。
你说的“差点崩了”是因为内存还是 CPU?
内存,CPU 占用率基本很少会超过 50%,主要是内存感觉
我把 2 个分区(WorkFlow-Process
,WorkFlow-Button
)调到 20 了,其他分区没动,ENV_WORKFLOW_CONSUMER_THREADS
也调到了 20,现在 CPU 利用率上来了。
按道理分区数和线程数得匹配,但是 kafka 我记得如果线程挂在不存在的分区,顶多也就拿个空消息,现在结果看来也运行正常。
不过这种调整方式最好官方还是确认下心里踏实点。
感觉对内存要求比较高,CPU 一般都能满足,CPU 利用率一直都不高,改过一次,服务器差点崩了。10 到 20
改完后我自己几个人测试完全没问题,前端流程一多起来或者用的人一多起来,直接报错 504、502 各种报错。
现在暂时不敢改了,有点小慌
你说的“差点崩了”是因为内存还是 CPU?
感觉对内存要求比较高,CPU 一般都能满足,CPU 利用率一直都不高,改过一次,服务器差点崩了。10 到 20
改完后我自己几个人测试完全没问题,前端流程一多起来或者用的人一多起来,直接报错 504、502 各种报错。
现在暂时不敢改了,有点小慌
调是能调,但具体多少量根本不清楚,配置肯定是往大了开的,具体服务器承受的了多少,根本不清楚,看着是“才”十几条数据 👀️