08 | 最最最重要的集群参数配置(下)
08 | 最最最重要的集群参数配置(下)
讲述:胡夕
时长11:00大小10.05M
Topic 级别参数
JVM 参数
操作系统参数
小结
开放讨论
赞 31
提建议
精选留言(78)
- 丰富2019-06-20G1是jdk9中默认的,jdk8还是需要显式指定的
作者回复: 嗯嗯,笔误了。多谢纠正 :)
共 3 条评论90 - saup0072019-06-21修改 Topic 级 max.message.bytes,还要考虑以下两个吧? 还要修改 Broker的 replica.fetch.max.bytes 保证复制正常 消费还要修改配置 fetch.message.max.bytes
作者回复: 是的,您考虑得很全面:)
共 4 条评论74 - Hello world2019-06-20老师说的无脑配置给jvm heap 6G大小,这应该也看机器的吧,现在机器的内存也越来越大,我们这的机器都是64G 内存,配了16G的heap,老师觉得可以优化吗
作者回复: 虽然无脑推荐6GB,但绝不是无脑推荐>6GB。一个16GB的堆Full GC一次要花多长时间啊,所以我觉得6GB可以是一个初始值,你可以实时监控堆上的live data大小,根据这个值调整heap size。只是因为大内存就直接调整到16GB,个人觉得不可取。 另外堆越小留给页缓存的空间也就越大,这对Kafka是好事啊。
共 6 条评论44 - 赌神很低调2019-06-24胡老师,kafka认为写入成功是指写入页缓存成功还是数据刷到磁盘成功算成功呢?还是上次刷盘宕机失败的问题,页缓存的数据如果刷盘失败,是不是就丢了?这个异常会不会响应给生产者让其重发呢?
作者回复: 写入到页缓存即认为成功。如果在flush之前机器就宕机了,的确这条数据在broker上就算丢失了。producer端表现如何取决于acks的设定。如果是acks=1而恰恰是leader broker在flush前宕机,那么的确有可能消息就丢失了,而且producer端不会重发——因为它认为是成功了。
共 6 条评论31 - aoe2019-06-20ulimit -n这个参数说的太好了!如果不设置,单机在Centos7上几百的并发就报“Too many open files”了。网上搜索后设置成65535,用JMater压测单机也只能支撑到1000左右的并发,原来这个值可以设置到1000000!《Kafka权威指南》上说Kafka单机可以轻松处理300万并发;《响应式架构:消息模式Actor实现与Scala、Akka应用集成》上说Scala用Actor单机可以处理5000万并发。请问胡老师有没有推荐的Linux方面的书籍,可以详细解答ulimit -n参数、如何知道单台Linux机器可以处理的连接数上线? 我在mac笔记本上用Go开启了10万个goroutine,压测服务器,结果得到异常“Too many open files”,后来也修改了ulimit -65535,但也只能保证1万左右的请求正常,请问Mac上也是只要设置ulimit -n参数就可以将请求的连接数提升到上限吗?展开共 6 条评论29
- cricket19812019-06-21kafka streams或者ksql的性能参数调优有什么建议和参考资料吗?
作者回复: Kafka Streams的性能调优建议:https://www.confluent.io/blog/optimizing-kafka-streams-applications KSQL本专栏不会涉及,目前我也给不出相应的建议,因为我。。。。我也不会😳
24 - 小头针2019-06-26胡老师,在本课程最后留的问题,又成功的引起了我的注意,我曾经因为kafka假死,不知原因为何,而尝试过设置Broker的内存为(32G/256G),然而进程假死更加频繁(后面检测是那个版本存在线程死锁)。后来还是设置为16G了。当然我这真真的是无脑设置。我也看到了评论了胡老师的建议,很值得参考。 另外,胡老师在这节课里,讲到了页缓存,我想请问一下这个页缓存它存在的意义和作用,以及它在整个过程中的机制又是怎样的呢?展开
作者回复: 页缓存属于磁盘缓存(Disk cache)的一种,主要是为了改善系统性能。重复访问磁盘上的磁盘块是常见的操作,把它们保存在内存中可以避免昂贵的磁盘IO操作。 既然叫页缓存,它是根据页(page)来组织的内存结构。每一页包含了很多磁盘上的块数据。Linux使用Radix树实现页缓存,主要是加速特定页的查找速度。另外一般使用LRU策略来淘汰过期页数据。总之它是一个完全由内核来管理的磁盘缓存,用户应用程序通常是无感知的。 如果要详细了解page cache,可以参见《Understanding the Linux Kernel》一书的第15章
共 5 条评论19 - theivanxu2019-06-20最近环境中有一台3G堆内存的节点在某个topic handle request的时候一直OOM,调整到5G重启后恢复正常,很想知道如何评判堆内存大小设置的标准。
作者回复: 没有通用的标准,只有一个最佳实践值:6GB。最好还是监控一下实时的堆大小,特别是GC之后的live data大小,通常将heapsize设置成其1.5~2倍就足以了
16 - 张振宇2019-11-19老师,怎么能限制消费者的消费速度,或者限制消费带宽啊,
作者回复: 这是我之前写的,可以参考下:https://www.cnblogs.com/huxi2b/p/8609453.html
共 3 条评论13 - 张洋2020-05-11老师我想问下,写入到pageCache 根据配置的时间‘脏数据’Flush到磁盘,kafka 把数据同步到磁盘只在这个地方做吗。意思是:只有每次‘判断’的脏数据才入盘吗,其他的数据呢?
作者回复: Kafka其实只是把数据写入到pagecache中,后面的刷盘是由os完成的,什么时候刷,刷那些数据都是由os决定
9 - 王晨光2020-04-13老师,kafka消费段,过一段时间jvm内存就会超过设置上线,有什么好的思路调整吗
作者回复: OOM的问题首先看下到底是那OOM的问题可以这样排查: 1. 到底是哪部分内存。大部分是堆溢出 2. 如果是heap溢出,主要看stacktrace,看看到底是哪段代码导致的 3. 再看导致的原因,到底是内存泄露还是内存溢出。这两者是有区别的。前者是程序写的有问题,后者是程序确实需要这么多内存,那么只能增加heap size 不管怎么样,你可以先增加一下heap size试试,如果还是OOM,那么很有可能出现了内存泄露
9 - 刘朋2019-06-20系统会根据LRU算法定期将页缓存上的 脏 数据落盘到物理磁盘上. 这个定期就是由提交时间来确定的,默认是5秒. 这个时间如何设置? 是内核参数吗?
作者回复: 不算内核参数,是文件系统的参数。你可以查询一下文件系统手册。比如ext4就是commit=Nseconds这样设置
9 - Xiao2019-06-20帅气的胡老师,后边是否会将Kafka数据丢失和消息重复的场景以以及解决思路!
作者回复: 会有的,后面有防止消息丢失和重复消费,到时候一起讨论哈
7 - 露娜2020-04-14swap设置成1,可以观测到Broker 性能开始出现急剧下降,从而进一步调优和诊断问题。这个地方的意思是观测运维指标,发现Kafka性能下降然后被kill。基本可以推断是出发了OOM Killer 是吗?
作者回复: 这里想表达的意思是,如果swap=0,内存不足时oom killer触发可能直接将broker进程杀死。而如果设置swap为一个比较小的值,在oom killer触发前你至少有一段时间观察到broker性能变差,给你监控和调优都留了一些时间
5 - 钱2019-08-13胡老师或者其他同学,初学kafka有些概念没完全弄明白,请帮忙解答一下,多谢。 1:broker的本质是什么?启动一个kafka应用程序的进程就相当于一个broker在跑了嘛?还是说可以通过设置会存在多个broker在跑? 2:broker和topic的关系是怎么样的?目前我确定的是一个kafka集群中topic一定是一个唯一的,但肯定会有多个broker,是不是说启一台kafka服务器就是一个broker在跑,多个一块构成一个集群?还是说一台服务器可以跑多个kafka程序也有多个broker在跑,也能构成一个集群,只是比较脆弱? 3:分区的底层数据结构是什么?队列?数组还是列表?还是说分区这一次还不够底层和具体的数据结构关系不大? 请老师帮忙解答一下,学到目前还不太明确一个消息从生产出来到消费掉,都经历了那些关键的路程,感觉理解其他的越发困难了,如果方便也请老师大致勾画一下一个消息的生命轨迹,其中那些是关键的转变? 多谢啦!展开
作者回复: 1. Broker是Kafka集群的服务器。启动集群就是指启动若干个Broker进程 2. Topic在一个Kafka集群上可能有很多个,Topic数据的确保存在Broker上,但它们之间没有什么关系。1台Broker也可以对外提供服务,只是如你所说:很脆弱。 3. 分区下面是副本,副本的存储结构是日志(log)。每条消息写入分区时,其实是写入副本的日志文件中
共 2 条评论4 - bunny2019-06-20胡老师,这个参数retention.bytes应该是指使用的磁盘空间吧,而且是针对于单个分区的;之前遇到过kafka将磁盘写满的情况,导致broker不可用,请问有什么好的预防措施和监控手段么?
作者回复: 这是topic级别的参数,控制每个分区能占用的最大磁盘空间。设置它就好了~~ 监控的话,好像没有现成的JMX指标。我之前写过一个方法可以监控磁盘占用,你不妨一试:https://www.cnblogs.com/huxi2b/p/7929690.html
共 2 条评论4 - poettian2020-03-27请教老师一个问题,我在使用 kafka 客户端应用时,有时会需要 broker list 这个参数,在我的集群有三个broker 的情况下,我发现 只填一个 和 三个都填上 都可以用,这个有什么区别吗?网上搜了一圈也没搜着
作者回复: 确实只需要写1个就可以,因为Kafka能够通过这1个找到集群所有的Broker。当然最好还是多写几个
3 - 云师兄2019-09-19设置堆大小为6g(较大)时候,文章说是broker提交时候大量bytebuf,kafka如果使用zero copy,也要设置大堆值吗
作者回复: zero copy和heap size并无直接的关联。
共 2 条评论3 - miwucc2019-09-15上了6g内存确实g1最好。4g cms,3g以下就pg共 2 条评论3
- King Yao2019-07-05多个日志段文件?这个没太理解,老师能详细说下吗,谢谢。
作者回复: 路径下有多个.log文件才有可能删除消息,如果只有一个.log文件是不会开启的,即使满足条件也不行。
3