作者回复: 嗯嗯,笔误了。多谢纠正 :)
作者回复: 是的,您考虑得很全面:)
作者回复: 写入到页缓存即认为成功。如果在flush之前机器就宕机了,的确这条数据在broker上就算丢失了。producer端表现如何取决于acks的设定。如果是acks=1而恰恰是leader broker在flush前宕机,那么的确有可能消息就丢失了,而且producer端不会重发——因为它认为是成功了。
作者回复: 会有的,后面有防止消息丢失和重复消费,到时候一起讨论哈
作者回复: 虽然无脑推荐6GB,但绝不是无脑推荐>6GB。一个16GB的堆Full GC一次要花多长时间啊,所以我觉得6GB可以是一个初始值,你可以实时监控堆上的live data大小,根据这个值调整heap size。只是因为大内存就直接调整到16GB,个人觉得不可取。
另外堆越小留给页缓存的空间也就越大,这对Kafka是好事啊。
作者回复: 嗯嗯 ,是的。记错了:( PS: 这是我今天第三次认错:)
作者回复: Kafka Streams的性能调优建议:https://www.confluent.io/blog/optimizing-kafka-streams-applications
KSQL本专栏不会涉及,目前我也给不出相应的建议,因为我。。。。我也不会😳
作者回复: Kafka 2.0已经不支持Java 7了,2.1版本开始初步支持Java 11,但不建议生产环境用11,所以还是使用Java 8吧。
性能方面,如果是Linux平台,性能的差异主要还是Java版本升级带来的差异吧,应该说影响不是太大。
作者回复: 嗯嗯 ,这点笔误了。Java 9默认的GC收集器才是G1。Java 8应该还是吞吐量收集器。
作者回复: 不算内核参数,是文件系统的参数。你可以查询一下文件系统手册。比如ext4就是commit=Nseconds这样设置
作者回复: 这是我之前写的,可以参考下:https://www.cnblogs.com/huxi2b/p/8609453.html
作者回复: 路径下有多个.log文件才有可能删除消息,如果只有一个.log文件是不会开启的,即使满足条件也不行。
作者回复: 页缓存属于磁盘缓存(Disk cache)的一种,主要是为了改善系统性能。重复访问磁盘上的磁盘块是常见的操作,把它们保存在内存中可以避免昂贵的磁盘IO操作。
既然叫页缓存,它是根据页(page)来组织的内存结构。每一页包含了很多磁盘上的块数据。Linux使用Radix树实现页缓存,主要是加速特定页的查找速度。另外一般使用LRU策略来淘汰过期页数据。总之它是一个完全由内核来管理的磁盘缓存,用户应用程序通常是无感知的。
如果要详细了解page cache,可以参见《Understanding the Linux Kernel》一书的第15章
作者回复: 我的意思是至少还有其他正常的副本可以使用。。。这个副本重启回来后会重新加载日志段,获取到当前末端位移,因此也能感知刚才为成功写入的消息并重新拉取之~~
作者回复: 有道理。这里给出的6GB一般对那些很多的生产服务器而言的。如果只有8GB的服务器,自然不建议分配这么大的heap size。
另外监控堆占用也是sizing的一个好办法,特别是监控Full GC之后的live data大小。
作者回复: 没有通用的标准,只有一个最佳实践值:6GB。最好还是监控一下实时的堆大小,特别是GC之后的live data大小,通常将heapsize设置成其1.5~2倍就足以了
作者回复: 最好确认下是否真的修改成功,比如是否是在/etc/security/limits.conf中修改的,这个才是永久生效的配置