CPU的核心数、线程数的关系和区别?如何确定Kafka的分区数,key和consumer线程数

2025-08-26 06:30:02 :0

CPU的核心数、线程数的关系和区别?如何确定Kafka的分区数,key和consumer线程数

大家好,如果您还对线程数不太了解,没有关系,今天就由本站为大家分享线程数的知识,包括CPU的核心数、线程数的关系和区别的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

CPU的核心数、线程数的关系和区别

一、关系:

1、线程数可以模拟出不同的CPU核心数。

CPU的核数是指硬件上有多个核,线程数可以模拟多个核的功能。线程越多,就越有利于同时运行多个程序,因为线程数等于CPU在某一时刻可以同时并行处理的任务数。

2、对于一个CPU,线程数总是大于或等于核心数的。

一个内核至少对应一个线程,但通过超线程技术,一个内核可以对应两个线程,即可以同时运行两个线程。

二、区别:

1、不同的存在形式

(1)CPU的核心数是指硬件上的真实对象。

(2)CPU线程数只是一个逻辑概念,不是一个真正的对象,只是为了更好地描述CPU的运行能力。

2、线程数对于不同的CPU类型存在不同的状态

(1)对于英特尔CPU:除了核心数之外,还可以使用线程数的概念,因为它是通过英特尔超线程技术实现的。

(2)对于AMDCPU:只有内核数,没有线程数的概念。因为AMDCPU没有超线程技术,一个CPU核对应一个线程。

3、出现原因不同

(1)核心数产生的原因:提高处理器主频的技术遇到了瓶颈。为了在“多核”的方向上发展,现有的产品可以发展成一个具有更强大理论性能而没有大规模发展的多核处理器系统。因此,“核心数”一词应运而生。

(2)线程数量的原因:为了进一步提高计算机的多任务处理能力。线程越多,同时运行多个程序就越好。

参考资源来源:

百度百科-核心数量

百度百科-线程数

如何确定Kafka的分区数,key和consumer线程数

一、客户端/服务器端需要使用的内存就越多
先说说客户端的情况。Kafka 0.8.2之后推出了Java版的全新的producer,这个producer有个参数batch.size,默认是16KB。它会为每个分区缓存消息,一旦满了就打包将消息批量发出。看上去这是个能够提升性能的设计。不过很显然,因为这个参数是分区级别的,如果分区数越多,这部分缓存所需的内存占用也会更多。假设你有10000个分区,按照默认设置,这部分缓存需要占用约157MB的内存。而consumer端呢?我们抛开获取数据所需的内存不说,只说线程的开销。如果还是假设有10000个分区,同时consumer线程数要匹配分区数(大部分情况下是最佳的消费吞吐量配置)的话,那么在consumer client就要创建10000个线程,也需要创建大约10000个Socket去获取分区数据。这里面的线程切换的开销本身已经不容小觑了。
服务器端的开销也不小,如果阅读Kafka源码的话可以发现,服务器端的很多组件都在内存中维护了分区级别的缓存,比如controller,FetcherManager等,因此分区数越多,这种缓存的成本越久越大。
二、文件句柄的开销
每个分区在底层文件系统都有属于自己的一个目录。该目录下通常会有两个文件: base_offset.log和base_offset.index。Kafak的controller和ReplicaManager会为每个broker都保存这两个文件句柄(file handler)。很明显,如果分区数越多,所需要保持打开状态的文件句柄数也就越多,最终可能会突破你的ulimit -n的限制。
三、降低高可用性
Kafka通过副本(replica)机制来保证高可用。具体做法就是为每个分区保存若干个副本(replica_factor指定副本数)。每个副本保存在不同的broker上。期中的一个副本充当leader 副本,负责处理producer和consumer请求。其他副本充当follower角色,由Kafka controller负责保证与leader的同步。如果leader所在的broker挂掉了,contorller会检测到然后在zookeeper的帮助下重选出新的leader——这中间会有短暂的不可用时间窗口,虽然大部分情况下可能只是几毫秒级别。但如果你有10000个分区,10个broker,也就是说平均每个broker上有1000个分区。此时这个broker挂掉了,那么zookeeper和controller需要立即对这1000个分区进行leader选举。比起很少的分区leader选举而言,这必然要花更长的时间,并且通常不是线性累加的。如果这个broker还同时是controller情况就更糟了。
说了这么多“废话”,很多人肯定已经不耐烦了。那你说到底要怎么确定分区数呢?答案就是:视情况而定。基本上你还是需要通过一系列实验和测试来确定。当然测试的依据应该是吞吐量。虽然LinkedIn这篇文章做了Kafka的基准测试,但它的结果其实对你意义不大,因为不同的硬件、软件、负载情况测试出来的结果必然不一样。我经常碰到的问题类似于,官网说每秒能到10MB,为什么我的producer每秒才1MB? —— 且不说硬件条件,最后发现他使用的消息体有1KB,而官网的基准测试是用100B测出来的,因此根本没有可比性。不过你依然可以遵循一定的步骤来尝试确定分区数:创建一个只有1个分区的topic,然后测试这个topic的producer吞吐量和consumer吞吐量。假设它们的值分别是Tp和Tc,单位可以是MB/s。然后假设总的目标吞吐量是Tt,那么分区数 = Tt / max(Tp, Tc)
Tp表示producer的吞吐量。测试producer通常是很容易的,因为它的逻辑非常简单,就是直接发送消息到Kafka就好了。Tc表示consumer的吞吐量。测试Tc通常与应用的关系更大, 因为Tc的值取决于你拿到消息之后执行什么操作,因此Tc的测试通常也要麻烦一些。
另外,Kafka并不能真正地做到线性扩展(其实任何系统都不能),所以你在规划你的分区数的时候最好多规划一下,这样未来扩展时候也更加方便。
消息-分区的分配
默认情况下,Kafka根据传递消息的key来进行分区的分配,即hash(key) % numPartitions,如下图所示:
def partition(key: Any, numPartitions: Int): Int = {
Utils.abs(key.hashCode) % numPartitions
}
这就保证了相同key的消息一定会被路由到相同的分区。如果你没有指定key,那么Kafka是如何确定这条消息去往哪个分区的呢?
复制代码
if(key == null) { // 如果没有指定key
val id = sendPartitionPerTopicCache.get(topic) // 先看看Kafka有没有缓存的现成的分区Id
id match {
case Some(partitionId) =》
partitionId // 如果有的话直接使用这个分区Id就好了
case None =》 // 如果没有的话,
val availablePartitions = topicPartitionList.filter(_.leaderBrokerIdOpt.isDefined) //找出所有可用分区的leader所在的broker
if (availablePartitions.isEmpty)
throw new LeaderNotAvailableException("No leader for any partition in topic " + topic)
val index = Utils.abs(Random.nextInt) % availablePartitions.size // 从中随机挑一个
val partitionId = availablePartitions(index).partitionId
sendPartitionPerTopicCache.put(topic, partitionId) // 更新缓存以备下一次直接使用
partitionId
}
}
复制代码
可以看出,Kafka几乎就是随机找一个分区发送无key的消息,然后把这个分区号加入到缓存中以备后面直接使用——当然了,Kafka本身也会清空该缓存(默认每10分钟或每次请求topic元数据时)
如何设定consumer线程数
我个人的观点,如果你的分区数是N,那么最好线程数也保持为N,这样通常能够达到最大的吞吐量。超过N的配置只是浪费系统资源,因为多出的线程不会被分配到任何分区。让我们来看看具体Kafka是如何分配的。
topic下的一个分区只能被同一个consumer group下的一个consumer线程来消费,但反之并不成立,即一个consumer线程可以消费多个分区的数据,比如Kafka提供的ConsoleConsumer,默认就只是一个线程来消费所有分区的数据。——其实ConsoleConsumer可以使用通配符的功能实现同时消费多个topic数据,但这和本文无关。
再讨论分配策略之前,先说说KafkaStream——它是consumer的关键类,提供了遍历方法用于consumer程序调用实现数据的消费。其底层维护了一个阻塞队列,所以在没有新消息到来时,consumer是处于阻塞状态的,表现出来的状态就是consumer程序一直在等待新消息的到来。——你当然可以配置成带超时的consumer,具体参看参数consumer.timeout.ms的用法。
下面说说Kafka提供的两种分配策略: range和roundrobin,由参数partition.assignment.strategy指定,默认是range策略。本文只讨论range策略。所谓的range其实就是按照阶段平均分配。举个例子就明白了,假设你有10个分区,P0 ~ P9,consumer线程数是3, C0 ~ C2,那么每个线程都分配哪些分区呢?
C0 消费分区 0, 1, 2, 3
C1 消费分区 4, 5, 6
C2 消费分区 7, 8, 9
具体算法就是:
复制代码
val nPartsPerConsumer = curPartitions.size / curConsumers.size // 每个consumer至少保证消费的分区数
val nConsumersWithExtraPart = curPartitions.size % curConsumers.size // 还剩下多少个分区需要单独分配给开头的线程们
...
for (consumerThreadId 《- consumerThreadIdSet) { // 对于每一个consumer线程
val myConsumerPosition = curConsumers.indexOf(consumerThreadId) //算出该线程在所有线程中的位置,介于
assert(myConsumerPosition 》= 0)
// startPart 就是这个线程要消费的起始分区数
val startPart = nPartsPerConsumer * myConsumerPosition + myConsumerPosition.min(nConsumersWithExtraPart)
// nParts 就是这个线程总共要消费多少个分区
val nParts = nPartsPerConsumer + (if (myConsumerPosition + 1 》 nConsumersWithExtraPart) 0 else 1)
...
}
复制代码
针对于这个例子,nPartsPerConsumer就是10/3=3,nConsumersWithExtraPart为10%3=1,说明每个线程至少保证3个分区,还剩下1个分区需要单独分配给开头的若干个线程。这就是为什么C0消费4个分区,后面的2个线程每个消费3个分区,具体过程详见下面的Debug截图信息:
ctx.myTopicThreadIds
nPartsPerConsumer = 10 / 3 = 3
nConsumersWithExtraPart = 10 % 3 = 1
第一次:
myConsumerPosition = 1
startPart = 1 * 3 + min(1, 1) = 4 ---也就是从分区4开始读
nParts = 3 + (if (1 + 1 》 1) 0 else 1) = 3 读取3个分区, 即4,5,6
第二次:
myConsumerPosition = 0
startPart = 3 * 0 + min(1, 0) =0 --- 从分区0开始读
nParts = 3 + (if (0 + 1 》 1) 0 else 1) = 4 读取4个分区,即0,1,2,3
第三次:
myConsumerPosition = 2
startPart = 3 * 2 + min(2, 1) = 7 --- 从分区7开始读
nParts = 3 + if (2 + 1 》 1) 0 else 1) = 3 读取3个分区,即7, 8, 9
至此10个分区都已经分配完毕
说到这里,经常有个需求就是我想让某个consumer线程消费指定的分区而不消费其他的分区。坦率来说,目前Kafka并没有提供自定义分配策略。做到这点很难,但仔细想一想,也许我们期望Kafka做的事情太多了,毕竟它只是个消息引擎,在Kafka中加入消息消费的逻辑也许并不是Kafka该做的事情。

关于本次线程数和CPU的核心数、线程数的关系和区别的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

CPU的核心数、线程数的关系和区别?如何确定Kafka的分区数,key和consumer线程数

本文编辑:admin

更多文章:


安装server2008r2系统(windows11系统能安装sqlserver2008R2吗)

安装server2008r2系统(windows11系统能安装sqlserver2008R2吗)

其实安装server2008r2系统的问题并不复杂,但是又很多的朋友都不太了解windows11系统能安装sqlserver2008R2吗,因此呢,今天小编就来为大家分享安装server2008r2系统的一些知识,希望可以帮助到大家,下面我

2026年8月12日 22:30

java复制list(java复制List最快方法是什么)

java复制list(java复制List最快方法是什么)

今天给各位分享java复制List最快方法是什么的知识,其中也会对java复制List最快方法是什么进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录java复制List最快方法是什么JAVA一个泛型数组List

2025年9月26日 17:15

loaded的意思(loading什么意思)

loaded的意思(loading什么意思)

今天给各位分享loading什么意思的知识,其中也会对loading什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录loading什么意思load中文什么意思be loaded是什么意思load是什么意

2026年8月19日 13:15

rowspan原理(如何在后台动态的修改gridview某一列的标题)

rowspan原理(如何在后台动态的修改gridview某一列的标题)

各位老铁们好,相信很多人对rowspan原理都不是特别的了解,因此呢,今天就来为大家分享下关于rowspan原理以及如何在后台动态的修改gridview某一列的标题的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录

2025年8月3日 22:30

pillow库(苹果手机pillow怎么用)

pillow库(苹果手机pillow怎么用)

“pillow库”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看pillow库(苹果手机pillow怎么用)!本文目录苹果手机pillow怎么用python的pillow库怎么使用为什么pillow插件不能离线安装苹果手机p

2025年8月10日 08:15

sql server查询包含某个内容(SQL server 查询数据库中所有包含某值的表)

sql server查询包含某个内容(SQL server 查询数据库中所有包含某值的表)

大家好,sql server查询包含某个内容相信很多的网友都不是很明白,包括SQL server 查询数据库中所有包含某值的表也是一样,不过没有关系,接下来就来为大家分享关于sql server查询包含某个内容和SQL server 查询数

2025年10月12日 18:45

overcome怎么读(overcome 什么意思)

overcome怎么读(overcome 什么意思)

大家好,今天小编来为大家解答以下的问题,关于overcome怎么读,overcome 什么意思这个很多人还不知道,现在让我们一起来看看吧!本文目录overcome 什么意思overcome 的过去分词还是它,过去分词发音的音标是什么,怎么读

2025年6月30日 05:45

利用sumif函数求和(excelsumif求和怎么用)

利用sumif函数求和(excelsumif求和怎么用)

今天给各位分享excelsumif求和怎么用的知识,其中也会对excelsumif求和怎么用进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录excelsumif求和怎么用sumif函数的使用方法求和sumif函

2026年4月23日 23:45

remained怎么读的(30的英文怎么读)

remained怎么读的(30的英文怎么读)

大家好,今天小编来为大家解答以下的问题,关于remained怎么读的,30的英文怎么读这个很多人还不知道,现在让我们一起来看看吧!本文目录30的英文怎么读remained怎么读三十英文怎么读音remained的翻译是什么30的英文怎么读th

2026年4月22日 04:30

location对象的方法(如何使用JavaScript对URL进行重定向)

location对象的方法(如何使用JavaScript对URL进行重定向)

大家好,今天小编来为大家解答以下的问题,关于location对象的方法,如何使用JavaScript对URL进行重定向这个很多人还不知道,现在让我们一起来看看吧!本文目录如何使用JavaScript对URL进行重定向javascript的l

2026年8月11日 01:45

免费模卡在线制作(身边很多模特朋友都在用微模卡小程序制作模特卡,这是真的免费的吗)

免费模卡在线制作(身边很多模特朋友都在用微模卡小程序制作模特卡,这是真的免费的吗)

各位老铁们,大家好,今天由我来为大家分享免费模卡在线制作,以及身边很多模特朋友都在用微模卡小程序制作模特卡,这是真的免费的吗的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,

2026年2月5日 13:45

java的技术框架(什么是java框架)

java的技术框架(什么是java框架)

其实java的技术框架的问题并不复杂,但是又很多的朋友都不太了解什么是java框架,因此呢,今天小编就来为大家分享java的技术框架的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录什么是java框架Java中的三

2026年1月29日 18:00

and是什么意思(and什么意思)

and是什么意思(and什么意思)

大家好,今天小编来为大家解答以下的问题,关于and是什么意思,and什么意思这个很多人还不知道,现在让我们一起来看看吧!本文目录and什么意思sand 是什么意思sand是什么意思withstand是什么意思brand是什么意思brand

2025年9月25日 09:15

微服务架构好处(基于容器的微服务架构带来的优势,说法正确的有哪些)

微服务架构好处(基于容器的微服务架构带来的优势,说法正确的有哪些)

大家好,今天小编来为大家解答以下的问题,关于微服务架构好处,基于容器的微服务架构带来的优势,说法正确的有哪些这个很多人还不知道,现在让我们一起来看看吧!本文目录基于容器的微服务架构带来的优势,说法正确的有哪些微服务的好处(优点)有哪些微服务

2025年6月28日 20:45

分页符删除后怎么表格中还有分页(WPS删除分页符后依然分页显示)

分页符删除后怎么表格中还有分页(WPS删除分页符后依然分页显示)

这篇文章给大家聊聊关于分页符删除后怎么表格中还有分页,以及WPS删除分页符后依然分页显示对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录WPS删除分页符后依然分页显示怎么删除07WORD版的分页符,一个表格被分成两页怎么把它弄

2026年5月10日 23:00

企业微信可信域名(企业微信开发自建应用后台入口在那设置呢)

企业微信可信域名(企业微信开发自建应用后台入口在那设置呢)

本篇文章给大家谈谈企业微信可信域名,以及企业微信开发自建应用后台入口在那设置呢对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录企业微信开发自

2025年6月26日 14:15

keyword关键词搜索(关键词(关键词推广))

keyword关键词搜索(关键词(关键词推广))

本篇文章给大家谈谈keyword关键词搜索,以及关键词(关键词推广)对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录关键词(关键词推广)如何搜索特定的关键字关键词(关键词推广)今天小给各位分享关键词的知识,其中也会对关键词推广

2026年1月20日 07:15

无主之地borderlands(《无主之地》详细攻略)

无主之地borderlands(《无主之地》详细攻略)

各位老铁们,大家好,今天由我来为大家分享无主之地borderlands,以及《无主之地》详细攻略的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录《无

2026年5月20日 03:15

eclipse使用spring框架(在Eclipse中怎么集成spring和hibernate的配置)

eclipse使用spring框架(在Eclipse中怎么集成spring和hibernate的配置)

大家好,eclipse使用spring框架相信很多的网友都不是很明白,包括在Eclipse中怎么集成spring和hibernate的配置也是一样,不过没有关系,接下来就来为大家分享关于eclipse使用spring框架和在Eclipse中

2026年1月26日 21:30

vbmdi窗体(如何给VB.NET窗体添加子窗体)

vbmdi窗体(如何给VB.NET窗体添加子窗体)

本篇文章给大家谈谈vbmdi窗体,以及如何给VB.NET窗体添加子窗体对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录如何给VB.NET窗体

2026年6月4日 14:30

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索