Kafka多维度调优

优化金字塔

应用程序层面

框架层面(Broker层面)

JVM层面

操作系统层面

应用程序层面:应当优化业务代码合理使用kafka,合理规划主题,合理规划分区,合理设计数据结构;

框架层面:在不改动源码的情况下,从kafka参数配置入手,结合业务体量和运行数据进行调优

JVM层面:在出现明显缓慢和可能的内存溢出的情况下,结合业务代码情况和服务器能力调优堆内存,非堆内存,GC方式等参数,非必要不更改过多参数

操作系统层面:在服务器操作系统层面调优尽量减少kafka程序运行限制,关注文件描述符限制,Selinux限制,JDK版本等情况

操作系统调优

文件系统的选择上,可选择XFS和EXT4,生产环境推荐XFS,具备高性能和高伸缩性优点,最新的报道显示具备多级缓存的ZFS针对高IO的kafka有不错的效果,但并未大规模验证

Swap空间参数设置:尽量设置小一点,修改/etc/sysctl.conf文件,增加vm.swappiness=,防止Linux OOM Killer线程随意杀线程

文件描述符:ulimit -n不能设置过小,在topic数量稍大时就会出现Too Many File Open报错情况

控制进程可以拥有的内存映射区域的最大数量:vm.max_map_count,设置过小会出现内存溢出情况

操作系统页缓存:由于Kafka存储数据时只要数据到来Page Cache页缓存就会返回Ack给生产者,并不会直接落盘,还需要等待触发或手动刷盘操作进行持久化刷盘,此时操作系统的Cached大小必须超过一个日志段大小,Broker上对应参数为log.segment.bytes,越大消费者在消费时有更大概率在缓存页命中,避免频繁IO从硬盘读取数据。

JVM层面调优

image

image

(1)堆内存参数设置:kafka本身并不占用过多堆内存,6-8G相对合适,在kafka-server-start.sh设置KAFKA_HEAP_OPTS参数即可;更精确可以查看KafkaServer-gc.log,关注Full GC之后堆上存活大小的总量,从而可以将堆内存设置为这个值的2-2.5倍,可以使用图上命令进行手动GC(2)GC选择器:博主kafka3.5.1版本的kafka集群使用openjdk11.0.X,默认G1收集器;在G1中Full GC是单线程运行,在生产环境中要尽量避免Full GC(3)JDK选择:至少JDK1.8,推荐JDK11,kafka3.0推荐至少使用JDK11

框架调优(Broker层面)
(1)版本适配:尽量保持客户端版本和Broker端版本一致或尽量适配,以避免版本之间不一致问题导致的性能优化损失,如零拷贝等特性(2)消息压缩方式:Broker端和Producer段的消息压缩方式应该保持一致,推荐lz4,第二选择gzip,如果设置得不一致会导致Broker付出大量额外的CPU性能用于解压和二次压缩(3)num.io.thread:Handler线程用于执行业务处理,Acceptor线程用于接收网络请求,Processor线程用于建立网络连接和分发网络请求,Handler线程才是执行业务请求处理的线程,由Broker参数num.io.thread决定,数量越大执行线程越多,处理速度更快(4)num.recovery.threads.per.data.dir:Broker重启后恢复线程数量,设置越大,追上数据进入ISR越快(5)num.network.thread:The number of threads that the server uses for receiving requests from the network and sending responses to the network,增加这个线程参数就是提高收发网络请求的速度(6)log.retention.bytes:日志保存时间,针对业务需求合理设置时间(7)message.max.bytes:针对消息集合打包的大消息体业务,需要设置更大的参数(8)num.replica.fetchers:副本数据同步线程,应当不超过cpu核数,通常设置为4-8即可

框架调优(Producer层面)
(1)消息发送确认机制:acks=all,通常情况下在生产环境设置为acks=1即Leader副本确认即可(2)批量发送消息大小:batch.size= 发送到同一个分区消息的批次大小限制(3)发送最大时延:linger.ms=,批量大小没有达到batch.size,最大允许时延

框架调优(Consumer层面)
(1)消息提交机制:如为保证消息不重复消费即手动提交消息(2)消息数据批量大小:fetch.min.bytes,如果时延不敏感追求吞吐量,可设置得大一点

应用程序层面调优

(1)保证业务代码健壮性,保证容器不会出现过多bug导致反复重启诱发Kafka集群Rebalance
(2)不要频繁创建Producer和Consumer,建立的连接要Close;
(3)合理创建线程池进行连接复用
(4)合理利用多线程进行推送,消费消息

文章转载自:付同學

原文链接:https://www.cnblogs.com/iamxiaofu/p/18243430

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SPI转四串口芯片CH9434的设计

一、CH9434的介绍 CH9434 是一款SPI转四串口转接芯片,提供四组全双工的9线异步串口,用于单片机/嵌入式系统扩展异步串口。CH9434包含四个兼容16C550的异步串口,最高支持4Mbps波特率通讯。最多支持25 路GPIO,提供半双工收发自动切换…

IO高级 -- 文件操作(Path、Paths、Files)

一、基础:File 1.1 构造方法: 1、 public File(String pathname) :通过给定的路径来创建新的 File实例。2、 public File(String parent, String child) :从父路径(字符串)和子路径创建新的 File实例。3、 public File(File pare…

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 水库大坝监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置(内置通信装…

【机器学习】鸢尾花分类:机器学习领域经典入门项目实战

学习机器学习,就像学习任何新技能一样,最好的方法之一就是通过实战来巩固理论知识。鸢尾花分类项目是一个经典的入门项目,它不仅简单易懂,还能帮助我们掌握机器学习的基本步骤和方法。 鸢尾花数据集(Iris Dataset&…

计算机游戏因为d3dcompiler_47.dll丢失无法启动怎么办?解决只要d3dcompiler_47.dll丢失无法启动游戏软件的方法

d3dcompiler_47.dll 是一个动态链接库文件,属于 Microsoft DirectX 的一部分,主要负责编译和运行 3D 图形程序。它是支持 Direct3D 功能的核心组件,Direct3D 是一种用于编程 3D 图形的 API,广泛应用于游戏和图形密集型应用程序中。…

html实现粘贴excel数据,在页面表格中复制

录入数据时&#xff0c;有时候需要把excel中的数据一条条粘贴到页面中&#xff0c;当数据量过多时&#xff0c;这种操作很令人崩溃。本篇文章实现了从excel复制好多行数据后,可在页面粘贴的功能 具体实现代码 <!DOCTYPE html> <html lang"en"> <head…

ArcGIS for js 4.x FeatureLayer 点选查询

示例&#xff1a; 代码如下&#xff1a; <template><view id"mapView"></view></template><script setup> import "arcgis/core/assets/esri/themes/light/main.css"; import Map from "arcgis/core/Map.js"; im…

11.QLoRA微调ChatGLM3-6B

实战 QLoRA 微调 ChatGLM3-6B 大模型 实战 PEFT 库 QLoRA ChatGLM3-6B 微调数据集 AdvertiseGen AdvertiseGen 数据集获取 使用ChatGLM3-6b Tokenizer处理数据 关于ig nore_label_id 的设置&#xff1a; 在许多自然语言处理和机器学习框架中&#xff0c; ig nore_label_id 被…

计算机网络实验(鲁东大学)-cisco-逃课

逃课脚本4-1第二关 以4-1 第二关为例 点开图形化界面&#xff0c;点开工具箱 点复制粘贴 把逃课代码复制粘贴进&#xff0c;点击保存 回到图形化界面&#xff0c;任意位置打开终端 点击shiftctrlv&#xff08;其他方式粘贴进终端也可&#xff09;后敲击回车&#xff0c;在…

[大模型]Phi-3-mini-4k-Instruct Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架&#xff0c;对 Phi-3-mini-4k-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件&#x…

sslh一键在一个端口上运行多个服务(KALI工具系列二十三)

目录 1、KALI LINUX 简介 2、sslh工具简介 3、信息收集 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 监听特定端口 4.2 配置SSH 4.3 配置apache 4.4 配置sshl 4.5 验证配置 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、…

基于线性核函数的SVM数据分类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于线性核函数的SVM数据分类算法matlab仿真&#xff0c;通过程序产生随机的二维数据&#xff0c;然后通过SVM对数据进行分类&#xff0c;SVM通过编程实现&#x…

[大模型]Phi-3-mini-4k-instruct langchain 接入

环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 。 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行演示。 创建工作…

RabbitMQ实践——配置Prometheus和Grafana报表

大纲 启用rabbitmq_prometheus插件安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动配置数据源 在《RabbitMQ实践——在Ubuntu上安装并启用管理后台》中我们已经安装成功RabbitMQ及其管理后台。在此基础上&#xff0c;我们将打通它和Prometheus、Gra…

PHP地方门户分类信息网站源码讯客分类信息系统源码(含手机版)

源码介绍 1.上传程序到网站根目录,访问http://域名/install/index.php 进行安装,不要直接打开网址&#xff0c;先直接安装; 2.安装完成后 后台恢复数据即可 默认帐号密码都是admin http://域名/admin/ 3.不要删除任何文件&#xff0c;因为删除文件或者修改代码可能造成错误 运…

渗透测试练习题解析 6 (CTF web)

1、[HCTF 2018]admin 1 考点&#xff1a;二次注入 先注册一个账号看看&#xff0c;注册 admin 会提示该用户名已存在&#xff0c;那我们就换一个用户名 观察页面功能&#xff0c;存在一个修改密码&#xff0c;开始的思路是想看看能否通过该密码功能抓包然后修改用户名为 admin …

键盘、鼠标、轴体选购指南

起因 买了块27寸的屏幕msi&#xff0c;一旦入坑爬不起来了。 这不是要配个键盘么。 鼠标的左键也不够灵敏&#xff0c;不知道是电池不足还是使用时间太久&#xff0c;也萌生换的念头。有一个重要原因也是跟电脑和鼠标垫整体不搭。 搜集信息 原本的一个键盘是ikbc国产牌子&am…

Intellij IDEA开发Android项目打包生成APK

在 IntelliJ IDEA 左上方中选择 “Build” -> “Generate Signed Bundle / APK…”选择“APK”——“Next”——“Create New…”&#xff08;Password随便填123456即可&#xff09; “Next”——选择release&#xff08;APK生成后默认存放在本项目的release文件夹里&#x…

【产品经理】订单处理2

本次讲解订单初始化成功到ERP系统过程中的后续环节。 一、根据客服备注更新订单信息 初始化订单过程中&#xff0c;若订单中的客服备注信息对订单进行更新&#xff0c;包括可能改收货信息、改商品、加赠品、指定快递等。 注意&#xff1a;更新订单的过程中要注意订单当前状…

Python | Leetcode Python题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution:def evalRPN(self, tokens: List[str]) -> int:op_to_binary_fn {"": add,"-": sub,"*": mul,"/": lambda x, y: int(x / y), # 需要注意 python 中负数除法的表现与题目不一…