本文首发于 vivo互联网技术 微信公众号

链接:

作者:Yang Yijun

本文主要描述Linux Page Cache优化的背景、Page Cache的基本概念、列举之前针对Kafka的 IO 性能瓶颈采取的一些解决方案、如何进行Page Cache相关参数调整以及性能优化前后效果对比。

一、优化背景

当业务快速增长,每天需要处理万亿记录级数据量时。在读写数据方面,Kafka 集群的压力将变得巨大,而磁盘 IO 成为了 Kafka 集群最大的性能瓶颈。

当出现入流量突增或者出流量突增情况,磁盘 IO 持续处于被打满状态,导致无法处理新的读写请求,甚至造成部分broker节点雪崩而影响集群的稳定。

如下图所示,磁盘 IO 被持续打满:

这严重的影响了集群的稳定,从而影响业务的稳定运行。对此,我们做出了一些针对性的优化方案:

对Linux操作系统的Page Cache参数进行优化;【本文主要讲解内容】

对kafka集群用户的出入流量进行限制,避免出入流量突增给磁盘IO带来的压力;【本文对此方案不做讲解】

按业务对集群进行资源组隔离(集群broker的物理隔离),避免不同业务间因为共享磁盘IO相互影响;【本文对此方案不做讲解】

对Kafka集群broker节点服务参数进行优化;【本文对此方案不做讲解】

改造Kafka副本迁移源码,实现增量并发副本迁移,减少副本迁移给集群broker节点磁盘IO带来的压力;【本文对此方案不做讲解】

开发一套Kafka集群自动负载均衡服务,定期对集群进行负载均衡;【本文对此方案不做讲解】

采用IO性能更好的SSD固态硬盘替换普通的机械硬盘;进行磁盘RAID让broker内部多块磁盘间IO负载更加均衡【本文对此方案不做讲解】

改造Kafka源码,对Kafka集群单个broker及单个topic进行出入流量限制,实现流量对最细粒度控制;当单个broker流量突增时可以对其进行上限限制,避免节点被异常流量打挂;【本文对此方案不做讲解】

改造Kafka源码,修复副本迁移任务启动后不可手动终止的缺陷,实现当因迁移导致负载过高却无法停止的问题;【本文对此方案不做讲解】

机房网络带宽的竞争也将间接的影响到follower同步leader的数据,最终将导致follower同步拉取历史数据而增加IO负载,因此需要对网络带宽进行优先级打标,当有竞争时提高Kafka集群的优先级,避免kafka集群的broker和其他大量消耗网络带宽的业务共用机房交换机。【本文对此方案不做讲解】

以上只是列举了几点主要的优化方案,还有一些其他的内容这里不再赘述。本文我们主要来讲解一下

Linux操作系统的Page Cache参数调优。

二、基本概念

1、什么是Page Cache?

Page Cache是针对文件系统的缓存,通过将磁盘中的文件数据缓存到内存中,从而减少磁盘I/O操作提高性能。

对磁盘的数据进行缓存从而提高性能主要是基于两个因素:

磁盘访问的速度比内存慢好几个数量级(毫秒和纳秒的差距);

被访问过的数据,有很大概率会被再次访问。

文件读写流程如下所示:

2、读Cache

当内核发起一个读请求时(例如进程发起read()请求),首先会检查请求的数据是否缓存到了Page Cache中。

如果有,那么直接从内存中读取,不需要访问磁盘,这被称为cache命中(cache hit);

如果cache中没有请求的数据,即cache未命中(cache miss),就必须从磁盘中读取数据。然后内核将读取的数据缓存到cache中,这样后续的读请求就可以命中cache了。

page可以只缓存一个文件部分的内容,不需要把整个文件都缓存进来。

3、写Cache

当内核发起一个写请求时(例如进程发起write()请求),同样是直接往cache中写入,后备存储中的内容不会直接更新(当服务器出现断电关机时,存在数据丢失风险)。

内核会将被写入的page标记为dirty,并将其加入dirty list中。内核会周期性地将dirty list中的page写回到磁盘上,从而使磁盘上的数据和内存中缓存的数据一致。

当满足以下两个条件之一将触发脏数据刷新到磁盘操作:

数据存在的时间超过了dirty_expire_centisecs(默认300厘秒,即30秒)时间;

脏数据所占内存 > dirty_background_ratio,也就是说当脏数据所占用的内存占总内存的比例超过dirty_background_ratio(默认10,即系统内存的10%)的时候会触发pdflush刷新脏数据。

4、Page Cache缓存查看工具

我们如何查看缓存命中率呢?在这里我们可以借助一个缓存命中率查看工具 cachestat。

(1)下载安装

(2)启动执行

(3)输出内容说明

5、如何回收Page Cache

执行脚本:echo 1 > /proc/sys/vm/drop_caches 这里可能需要等待一会,因为有应用程序正在写数据。

回收前:

回收后:

缓存回收后,正常情况下,buff/cache应该是0的,我这里之所以不为0是因为有数据正在不停的写入。

三、参数调优

备注:不同硬件配置的服务器可能效果不同,所以,具体的参数值设置需要考虑自己集群硬件配置。

考虑的因素主要包括:CPU核数、内存大小、硬盘类型、网络带宽等。

1、如何查看Page Cache参数

执行命令 sysctl -a|grep dirty

2、操作系统Page Cache相关参数默认值

3、如果系统中cached大量数据可能存在的问题

缓存的数据越多,丢数据的风险越大。

会定期出现IO峰值,这个峰值时间会较长,在这期间所有新的写IO性能会很差(极端情况直接被hang住)。

后一个问题对写负载很高的应用会产生很大影响。

4、如何调整内核参数来优化IO性能?

(1)

vm.dirty_background_ratio参数优化

当cached中缓存当数据占总内存的比例达到这个参数设定的值时将触发刷磁盘操作。

把这个参数适当调小,这样可以把原来一个大的IO刷盘操作变为多个小的IO刷盘操作,从而把IO写峰值削平。

对于内存很大和磁盘性能比较差的服务器,应该把这个值设置的小一点。

(2)

vm.dirty_ratio参数优化

对于写压力特别大的,建议把这个参数适当调大;对于写压力小的可以适当调小;如果cached的数据所占比例(这里是占总内存的比例)超过这个设置,

系统会停止所有的应用层的IO写操作,等待刷完数据后恢复IO。所以万一触发了系统的这个操作,对于用户来说影响非常大的。

(3)

vm.dirty_expire_centisecs参数优化

这个参数会和参数vm.dirty_background_ratio一起来作用,一个表示大小比例,一个表示时间;即满足其中任何一个的条件都达到刷盘的条件。

为什么要这么设计呢?我们来试想一下以下场景:

如果只有参数 vm.dirty_background_ratio ,也就是说cache中的数据需要超过这个阀值才会满足刷磁盘的条件;

如果数据一直没有达到这个阀值,那相当于cache中的数据就永远无法持久化到磁盘,这种情况下,一旦服务器重启,那么cache中的数据必然丢失。

结合以上情况,所以添加了一个数据过期时间参数。当数据量没有达到阀值,但是达到了我们设定的过期时间,同样可以实现数据刷盘。

这样可以有效的解决上述存在的问题,其实这种设计在绝大部分框架中都有。

(4)

vm.dirty_writeback_centisecs参数优化

理论上调小这个参数,可以提高刷磁盘的频率,从而尽快把脏数据刷新到磁盘上。但一定要保证间隔时间内一定可以让数据刷盘完成。

(5)vm.swappiness参数优化

禁用swap空间,设置vm.swappiness=0

5、参数调优前后效果对比

(1)写入流量对比

从下图可以看出,优化前写入流量出现大量突刺,波动非常大,优化后写入流量更加平滑。

(2)磁盘IO UTIL对比

从下图可以看出,优化前IO出现大量突刺,波动非常大,优化后IO更加平滑。

(3)网络入流量对比

从下图可以看出,优化前后对网络入流量并无影响。

四、总结

这里不同机型,不同硬件配置可能最终优化效果也不一样,但是参数变化的趋势应该是一致的。

1、当vm.dirty_background_ratio、vm.dirty_expire_centisecs变大时

出入流量抖动变大,出现大量突刺;

IO抖动变大,出现大量突刺,磁盘有连续打满的情况;

出入流量平均大小不受影响;

2、当vm.dirty_background_ratio、vm.dirty_expire_centisecs变小时

出入流量抖动变小,趋于平滑稳定,无突刺;

磁盘IO抖动变小,无突刺,磁盘IO无打满情况;

出入流量平均大小不受影响;

3、当vm.dirty_ratio变小(低于10)

出入流量隔一段时间出现一个明显的波谷;这是因为cache数据量超过vm.dirty_ratio设定的值将阻塞写请求,进行刷盘操作。

4、当vm.dirty_ratio变大时(高于40),出入流量无明显的波谷,流量平滑;

5、当以下三个参数分别为对应值时,出入流量非常平滑,趋于一条直线;

vm.dirty_background_ratio=1

vm.dirty_ratio=80

vm.dirty_expire_centisecs=1000

6、如下图所示,整个调整过程平均流量不受影响

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览12588 人正在系统学习中

[转帖]linux设置page cache大小,Linux Page Cache调优在Kafka中的应用的更多相关文章

  1. Linux内核、 TCP/IP、Socket参数调优

    /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这 ...

  2. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

  3. Linux之(tomcat)服务之服务调优

    Tomcat调优原则: ● 增加连接数 ● 调整工作模式 ● 启用gzip压缩 ● 调整JVM内存大小 ● 作为web服务器时,与Apache或者Nginx整合 ● 合理选择垃圾回收算法 ● 尽量使用 ...

  4. Linux上TCP的几个内核参数调优

    Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优.光TCP的调优参数就有50多个.在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数.在此分享出来,希望对大家 ...

  5. Linux下安装、配置、授权、调优Mysql

    以前在linux已经安装了很多次的Mysql,但是时间间隔长了以后,安装步骤总是会遗漏,趁这次安装,做一下安装记录. 检查系统是否已经安装Mysql rpm -qa|grep -i mysql Mys ...

  6. Linux 进程级开启最大文件描述符 调优

    开启最大文件数 系统可以开启的最大文件描述符(可同时开启最多的文件数),最大开启65535,可根据需求进行调优. 查看系统当前可开启最大文件描述符数 ulimit -n [root@localhost ...

  7. Linux、Windows如何进行性能监控与调优

    1.Linux命令行工具 推荐:CentOS 7 1.1 top命令 top命令的输出如下: top命令的输出可以分为两部分:前半部分是系统统计信息,后半部分是进程信息.在统计信息中, 第1行是任务队 ...

  8. Linux服务器上MinIO生产部署的内核调优

    #!/bin/bash cat > sysctl.conf <<EOF # maximum number of open files/file descriptors fs.file ...

  9. LNMT(Linux+Nginx+MySQL+Tomcat)常见性能参数调优

  10. 简单记录五个Linux设置定时任务的步骤(自动化运维必备)

    这几天我们国庆节休息,但是作为运维工作的同学们是不是也不能闲着,担心工作中是不是有任务在执行中需要维护.于是,我们很多的运维工作都是用的自动化运维监控,如果有故障都会定时的处理和告警的.这个与我们的L ...

随机推荐

  1. Python——第五章:处理异常try、except、else、finally

    处理异常try 和 except 在 Python 中,try 和 except 语句用于处理异常(错误).通过使用这两个关键字,你可以编写代码来捕获和处理可能发生的异常,以保持程序的稳定性. try ...

  2. C#开源的一款友好的.NET SDK管理器

    前言 今天推荐一款由C#开源的.友好的.NET SDK管理器:Dots. 工具介绍 Dots 是一款 .NET SDK 管理器,可让您轻松安装.卸载和切换 .NET SDK.它是一款跨平台工具,可在 ...

  3. Spring WebFlux 简介

    本文基于 Spring Boot 2.6.0 基于之前提到的 Reactor 的出现,使得编写响应式程序成为可能.为此,Spring 的开发团队决定添加有关 Reactor 模型的网络层.这样做的话将 ...

  4. HDU 2709 Sumset DP 二进制

    原题链接 题意 给我们一个整数k,要求我们将k分成若干个二的整数幂(1, 2, 4, 8...)的加和形式,问我们所有的分法中,本质不同(即某个2的幂的数量不同)的形式有多少种,k最多为1000000 ...

  5. just_audio音频播放器

    代码 import 'package:flutter/material.dart'; import 'package:just_audio/just_audio.dart'; void main() ...

  6. tee 实现双通道输出

    ls -l|tee >(wc -l) >(wc -c) > /dev/null

  7. 全域Serverless化,华为云引领下一代云计算新范式

    本文分享自华为云社区<全域Serverless化,华为云引领下一代云计算新范式>,作者: 华为云PaaS服务小智 . 近日,华为开发者大会2023(Cloud)在东莞成功举办,期间&quo ...

  8. linux 账号管理 添加用户与修改用户权限与密码

    添加用户 useradd zhoulujun 修改用户密码 passwd  zhoulujun 修改用户组 usermod -g root  zhoulujun 记住这个几个就够了--

  9. Gartner 权威解读: SBOM 采用率将于2025年达到60%

    随着现代软件开发越来越依赖于第三方资源,针对软件供应链的恶意攻击数量也随之激增.据业内权威机构 Gartner 预计,软件物料清单 (SBOM) 的采用率在 2025 年将会达到 60%. Gartn ...

  10. Mongodb--用户/权限

    mongodb分为管理员用户和普通用户,并且还有个验证库,建立用户时use到的库(验证库),信息就存储在admin数据库下. 在使用用户时,要加上验证库才能登录,对于管理员用户,必须在admin下创建 ...