我们收到了有关 Kubernetes 集群中 kafka 内存使用率的警报,分析显示大部分内存都是页面缓存。我知道 kafka 使用大量页面缓存来提高 IO 性能,并且读取/写入在刷新到磁盘之前会被缓存。我正在尝试寻找微调此页面缓存的方法,许多文章都直接更新 vm.dirty_ratio 和 vm.dirty_background_ratio 内核参数,以便尽早将数据从内存刷新到磁盘。
当我检查时,我发现脏缓存似乎已经很低了,这些参数不需要更新。
cat /proc/meminfo|grep Dirty Dirty:70416 kB
cat /proc/vmstat | egrep “dirty|writeback” nr_dirty 24873 nr_writeback 0 nr_writeback_temp 0 nr_dirty_threshold 34518467 nr_dirty_background_threshold 11506155
关于还可以做些什么来微调页面缓存,还有什么想法吗?
答案1
我认为您有点误解了 Linux 系统中页面缓存的工作方式。
内存缓存已满是正常现象,事实上,对于任何大量读写磁盘的系统(kafka、elasticsearch、数据库)来说,这都是非常需要的。页面缓存已满时,您不应该发出警报,因为这不是有害的东西,也不会给系统带来任何麻烦。事实恰恰相反。
脏页仅与写入磁盘有关。即使脏页被刷新(写入)到磁盘,也并不意味着它们会离开页面缓存。它们只是被标记为干净(= 最新)。
在页面缓存中,数据只能被替换(通过脏页机制)或添加新的数据。
互联网上已经多次解释过细节。例如在这个资源上:https://www.linuxatemyram.com/
TLDR:禁用页面缓存已满时触发的警报 - 这是健康 Linux 系统的正常和期望行为,您绝对希望它尽可能满。这不是一个真正的问题,也不会严重影响您的系统性能。恰恰相反。缓存已满意味着您正在充分利用 Linux 系统的资源。