我已经在Kubernetes上运行Kafka一段时间没有任何重大问题了;但是,我最近引入了一个cassandra pods集群,开始在kafka上出现性能问题。
尽管cassandra不像kafka那样使用页面缓存,但它确实会频繁地写入磁盘,这可能会影响内核的底层缓存。
我知道kubernetes pods是通过cgroups来管理内存资源的,cgroups可以通过设置kubernetes中的内存请求和限制来配置,但是我注意到cassandra对页面缓存的利用会增加kafka pods中的页面错误数,即使它们似乎没有在争夺资源(例如。,它们的节点上有可用的内存)。
在kafka中,更多的页错误会导致更多的磁盘写入,这会妨碍顺序io的好处,并影响磁盘性能。如果您使用类似aws的ebs卷,这将最终耗尽您的突发平衡,并最终导致整个集群的灾难性故障。
我的问题是,有没有可能隔离kubernetes中的页面缓存资源,或者让内核知道kafka pods拥有的页面在缓存中的保存时间应该比cassandra pods中的页面长?
1条答案
按热度按时间i1icjdpr1#
我认为这是一个有趣的问题,所以这是一个从一些挖掘发现张贴。
最佳猜测:k8s oob没有办法做到这一点,但是有足够的工具可用,因此它可以成为一个富有成效的领域,用于研究和开发可以部署为守护程序的调优和策略应用程序。
调查结果:
应用程序可以使用fadvise()系统调用为内核提供指导,指导应用程序需要哪些文件支持的页,哪些不需要,哪些可以回收。
http://man7.org/linux/man-pages/man2/posix_fadvise.2.html
应用程序在执行io时,也可以使用o\ U direct来尝试避免使用页缓存:
https://lwn.net/articles/457667/
有迹象表明,cassandra已经使用fadvise,试图优化以减少其页面缓存占用:
http://grokbase.com/t/cassandra/commits/122qha309v/jira-created-cassandra-3948-sequentialwriter-doesnt-fsync-before-posix-fadvise
三星最近(2017年1月)也进行了一些研究,在内核中修补了cassandra和fadvise,以更好地利用多流SSD:
http://www.samsung.com/us/labs/pdfs/collateral/multi-stream_cassandra_whitepaper_final.pdf
kafka支持页面缓存体系结构,尽管它似乎没有直接使用fadvise。内核提供的旋钮足以在专用主机上调谐kafka:
vm.dirty*用于指导何时将脏页写回磁盘
vm.vfs\u cache\u使用ram进行页面缓存的攻击性指南
内核对设备特定写回线程的支持可以追溯到2.6天:
https://www.thomas-krenn.com/en/wiki/linux_page_cache_basics
cgroups v1和v2侧重于基于pid的io调节,而不是基于文件的缓存调节:
https://andrestc.com/post/cgroups-io/
也就是说,旧的linux ftools实用程序集有一个简单的命令行旋钮示例,用于在特定文件上使用fadvise:
https://github.com/david415/linux-ftools
所以这里足够了。给定特定的kafka和cassandra工作负载(例如,读重与写重)、特定的优先级(kafka优于cassandra,反之亦然)和特定的io配置(专用与共享设备),可以使用特定的调优模型,这些模型可以概括为策略模型。