我认为这是一个有趣的问题,所以这是一些挖掘的结果。
最佳猜测:k8s OOB 无法做到这一点,但有足够的工具可用,因此它可能是研究和开发可部署为 DaemonSet 的调优和策略应用程序的富有成果的领域。
发现:
应用程序可以使用 fadvise() 系统调用向内核提供有关应用程序需要哪些文件支持的页面以及哪些不需要并且可以回收的指导。
http://man7.org/linux/man-pages/man2/posix_fadvise.2.html
应用程序还可以使用 O_DIRECT 来尝试在执行 IO 时避免使用页面缓存:
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_cache_pressure 指导如何积极地使用 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 配置(专用与共享设备),可能会出现特定的调优模型,而那些可能推广到政策模型中。