文档章节

影响kafka性能的配置

暖海砬
 暖海砬
发布于 2017/04/07 09:50
字数 1308
阅读 36
收藏 0

总结一下Kafka本身可能会对性能产生影响的配置项。


Broker

num.network.threads:3

用于接收并处理网络请求的线程数,默认为3。其内部实现是采用Selector模型。启动一个线程作为Acceptor来负责建立连接,再配合启动num.network.threads个线程来轮流负责从Sockets里读取请求,一般无需改动,除非上下游并发请求量过大。

num.partitions:1

Partition的数量选取也会直接影响到Kafka集群的吞吐性能。例如我写过MapReduce任务从Kafka中读取数据,每个Partition对应一个Mapper去消费数据,如果Partition数量太少,则任务会因为Mapper数不足而非常慢。此外,当Partition数量相对于流入流出的数据量显得较少,或由于业务逻辑和Partition数量没有匹配好造成个别Partition读写数据量大,大量的读写请求集中落在一台或几台机器上时,很容易就会打满NIC的全部流量。不难想象这时不仅这一个Partition的读写会出现性能瓶颈,同Broker上的其他Partition或服务都会陷入一个网络资源匮乏的情况。

queued.max.requests:500

这个参数是指定用于缓存网络请求的队列的最大容量,这个队列达到上限之后将不再接收新请求。一般不会成为瓶颈点,除非I/O性能太差,这时需要配合num.io.threads等配置一同进行调整。

 

Replica相关配置:

replica.lag.time.max.ms:10000replica.lag.max.messages:4000num.replica.fetchers:1

上篇文章已经简单介绍过上两项配置的含义,这里不再重复,重点说一下第三项配置。对于任意(Broker, Leader)元组,都会有replication.factor-1个Broker作为Replica,在Replica上会启动若干Fetch线程把对应的数据同步到本地,而num.replica.fetchers这个参数是用来控制Fetch线程的数量。

一般来说如果发现Partition的ISR当中只有自己一个Partition,且长时间没有新的Replica增加进来时,就可以考虑适当的增大这个参数加快复制进度。其内部实现上,每个Fetch就对应了一个SimpleConsumer,对于任意一台其他机器上需要Catch-up的Leader,会创建num.replica.fetchers个SimpleConsumer来拉取Log。

当初刚知道这块设计的时候还蛮疑惑的,在Kafka文档开篇的时候就郑重介绍过,同一个ConsumerGroup内的Consumer和Partition在同一时间内必须保证是一对一的消费关系,而这么简单地增加SimpleConsumer就可以提高效率又是什么原因呢?

查看源码,在AbstractFetcherThread.scala里可以看到,Fetch启动的多线程其实就是一个个的SimpleConsumer。

首先,getFetcherId()利用numFetcher来控制FetchId的范围,进而控制Consumer数量。partitionsPerFetcher结构则是一个从Partition到Partition上启动的Fetchers的Mapping。

上面为每个Partition启动的多个Fetcher(也就是SimpleConsumer)之间通过partitionMap: mutable.HashMap[TopicAndPartition, Long]来共享offset,达到并行Fetch数据的目的。因此,通过共享offset既保证了同一时间内Consumer和Partition之间的一对一关系,又允许我们通过增多Fetch线程来提高效率。

default.replication.factor:1

这个参数指新创建一个topic时,默认的Replica数量。当Producer中的 acks!=0 && acks!=1时,Replica的大小可能会导致在Produce数据时的性能表现有很大不同。Replica过少会影响数据的可用性,太多则会白白浪费存储资源,一般建议在2~3为宜。

fetch.purgatory.purge.interval.requests:1000producer.purgatory.purge.interval.requests:1000

首先让我先来介绍一下这个“炼狱”究竟是用来做什么用的。Broker的一项主要工作就是接收并处理网络上发来的Request。这些Request其中有一些是可以立即答复的,那很自然这些Request会被直接回复。另外还有一部分是没办法或者Request自发的要求延时答复(例如发送和接收的Batch),Broker会把这种Request放入Paurgatory当中,同时每一个加入Purgatory当中的Request还会额外的加入到两个监控对队列:

  • WatcherFor队列:用于检查Request是否被满足。

  • DelayedQueue队列:用于检测Request是否超时。

Request最终的状态只有一个,就是Complete。请求被满足和超时最终都会被统一的认为是Complete。

目前版本的Purgatory设计上是存在一定缺陷的。Request状态转变为Complete后,并没能立即从Purgatory中移除,而是继续占用资源,因此占用内存累积最终会引发OOM。这种情况一般只会在topic流量较少的情况下触发。更详细的资料可以查阅扩展阅读,在此不做展开。

在实际使用中我也是踩了这个坑过来的,当时的情况是集群新上了一个topic,初期该topic数据很少(Low volume topic),导致那段时间在凌晨3,4点左右会随机有Broker因为OOM挂掉。定位原因后把*.purgatory.purge.interval.requests的配置调整小至100就解决了这个问题。

 

原文连接:http://blog.csdn.net/stark_summer/article/details/50203133

本文转载自:

共有 人打赏支持
上一篇: Spring Aop随笔
下一篇: java学习路线图
暖海砬
粉丝 0
博文 11
码字总数 2222
作品 0
嘉定
程序员
私信 提问
闫燕飞:Kafka的高性能揭秘及优化

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文首发在云+社区,未经许可,不得转载。 大家下午好,我是来自腾讯云基础架构部ckafka团队的高级工程师闫燕飞。今天在这里首先...

腾讯云加社区
05/03
0
0
开源软件成熟度评测报告-分布式消息中间件

一、背景 随着互联网技术和金融科技的不断发展,从RPC到Web Service,从SOA的推行再到RESTful以及云计算中PaaS与SaaS的推广,分布式架构在金融企业中得到了广泛应用,消息中间件则在分布式系...

何东杰
2017/12/20
0
0
storm集群 + kafka单机性能测试

storm与kafka单机功能整合很顺利,但是到了storm集群环境和数据处理性能时则出现了一些问题,现将测试过程和问题简单记录如下: 性能指标:每分钟处理至少100万的信息(csv格式,100bytes左右...

GoldenRoc
2014/09/26
0
2
NiFi 入门:Kakfa 数据同步到关系数据库(PostgreSQL)--Part3

Kafka源的设置: NiFi中对应Kafka有不同版本, 分队对应0.9,0.10,0.11和1.0的不同Kafka版本,低版本的process可以处理高版本的Kafka HDP用的Kafka0.10的版本,我使用了ConsumeKafka010,注意group...

seng
08/15
0
0
Kafka性能调优

Kafka的配置详尽、复杂,想要进行全面的性能调优需要掌握大量信息,这里只记录一下我在日常工作使用中走过的坑和经验来对kafka集群进行优化常用的几点。 1.JVM的优化 java相关系统自然离不开...

Jx战壕
2017/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

以太坊Token通证或者代币的真正作用是什么?

上一篇文章以太坊(Ethereum)与以太(Ether)中,你应该很好地理解以太坊是如何构建以太坊应用程序网络的,这些应用程序需要一个名为Ether的加密货币来运行。现在是时候引入一个更深层的概念...

笔阁
4分钟前
0
0
PHP - 利用P3P实现跨域

P3P是什么 P3P Platform for Privacy Preferences, 是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护。 P3P标准的构想是:Web 站点的隐私策略应该告之访问者该站点所收集的信息类型、...

hansonwong
5分钟前
0
0
传统SSM框架之微信授权登陆

1、jdbc.properties (下面瞎写的值) WEIXIN_APP_ID=wx5438496a99c8d26acbWEIXIN_APP_SECRET=d070fjcwiefhwr38942dw 2、获取配置属性 /** * @Author:Mujiutian * @Description:微信参......

木九天
5分钟前
0
0
以太坊(Ethereum)与以太(Ether)为什么容易混淆?

客观的来说,以太坊与以太这两个概念很容易混淆。 当我们听到以太坊Ethereum这个词时,我们通常会将它与加密货币(比如比特币)联系起来。虽然这个定义并不完全错误。但重要的是要理解以太坊...

geek12345
7分钟前
0
0
ROS实操笔记四 msg 和srv

msg: msg files are simple text files that describe the fields of a ROS message. They are used to generate source code for messages in different languages. srv: an srv file descr......

placido
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部