logstash 吞吐量优化_1002-谈谈ELK日志分析平台的性能优化理念

在生产环境中,我们为了更好的服务于业务,通常会通过优化的手段来实现服务对外的性能最大化,节省系统性能开支;关注我的朋友们都知道,前段时间一直在搞ELK,同时也记录在了个人的博客篇章中,从部署到各个服务应用的采集都做了详细的介绍,但是并没有关于ELK方面的优化,那么,我们对于这些日志分析平台,我们如何去优化呢?优化的手段又有哪些呢?下面请听我娓娓道来~

【ES优化】

ES在前面的部署环节(https://www.cnblogs.com/bixiaoyu/p/9460554.html)已经简单了提到调优,但是不全;Elasticsearch作为数据持久化存储环节,主要就是接受采集端发送过来的数据,执行写磁盘,建立索引库,最后将结构化的数据存储到ES集群上,这是ES所需要完成的工作

1.1:JVM内存的优化

首先我们需要了解什么是jvm内存?作用是什么?

jvm内存其实就是java内存堆,也是jvm需要管理的最大的一块内存空间,主要就是存放各种类型的实例对象;在java中,堆的概念被划分为,新生代和老年代,这样更有利于jvm管理内存堆中的对象,分配和回收

我们设置堆内存主要就是创建实例对象,让所有对象实例和数据都在堆上进程分配,可以动态的分配内存大小;

-Xms1g     #设置堆最小的内存

-Xmx1g    #设置堆最大的内存

如何设置最合理呢?

首先我们要知道堆内存设置的越大,ES可用的堆就越大,同时呢,可用的缓存空间就越大,但是不能无限大,因为这样会浪费大量的内存,太多的堆内存可能会系统垃圾回收机制异常;

优化准则:

将最小堆(xms)和最大堆(xmx)设置为相同值即可,这样可以防止内存堆运行的有所变动;

内存堆的值不要超过系统物理内存的50%(可以等于实际物理内存的一半),以确保有足够的物理内存给内核文件系统使用;

ES堆内存大小为什么不能超过物理 内存的50%?

除了堆内存设置过大会造成资源浪费之后,还有一个原因,

堆内存对于ES来说是个不可缺少的部分,能够对提高数据的执行效率,还有一个内存使用者,那就是是-lucene

Lucene是一个开源的全文检索引擎工具 ,而我们的ES底层是基于Lucene来实现的丰富的检索功能;Lucene的性能依赖于操作系统之间的交互,如何说我们把可用的内存都给了ES的话,那么Lucene还有剩余的内存空间吗?这将会严重的影响性能;因此,我们最多只能将50%的可用内存资源分配给ES堆内存,剩下的50%留给Lucene了

ps:这里注意一下,我们的Luceen使用的是物理内存剩余的50%,它并不使用堆内存;切记不要与ES堆内存混淆

1.2:ES所在操作系统的内存优化

可通过禁用swap·分区,如果是混合服务器的话可通过减低swap分区的使用积极性;

/dev/mapper/centos-swap swap swap defaults 0 0    #进入/etc/fstab/.将其注释,永久生效;临时生效直接swapoff -a即可

降低swao分区使用积极性,这句话是什么意思呢?首先我们要知道,系统的内存使用空间到达一定的阀值时候,便会占用swap空间,这个时候我们是可以控制这个阀值的;swappiness=0表示最大限度使用物理内存,也就是说,当物理内存使用100%之后,才去使用swap交换分区;

如何设置呢?

比如说,我们现在需要设置系统内存大小阀值,当物理内存使用90%的时候,只剩10%的物理内存,再去使用swap空间

100-10=90%

# vim /etc/sysctl.conf

vm.swappiness = 10

#修改之后执行sysctl -p生效

#cat /proc/sys/vm/swappiness

10

1.3:·硬件优化(硬盘类型/raid类型)

服务器硬盘选用SSD硬盘,配置成raid 0阵列以获得更佳的IO性能;

【Logstash优化】

logstash.yml配置优化:

1)pipline.workers:控制output或filter插件的工作线程数(只能设置为正整数),因为logstash中的grok正则及其消耗系统计算字眼,同时filte也会存在瓶颈,此时增加工作线程,以提高性能

2)pipeline.batch.size:批量执行event的最大值,该值用于input批量处理事件值,再打包发送给filter和output.可以提高性能,但是会增加额外的内存开销

3)pipeline.batch.delay:批量处理事件的最大等待值(input需要按照batch处理的最大发送到消息队列,需要设置一个超时事件)

Logstash同样运行在JVM内存中,关于jvm内存的配置原则不在述说和,和上述ES一样;

堆内存一般要求初始值和最大值设置一致,防止动态调整堆内存大小的消耗;jvm内存的分配设置太大会拖慢系统,浪费资源,设置太小的话Logstash无法启动

【Kafka的性能优化】

既然我们在ELK中用到了Kafka,那么优化也是必须的,先来回顾一下,kafka是一个高吞吐分布式消息系统,并且提供了持久化,高性能主要表现在以下两点:

第一,磁盘的连续读写性能远远高于随机读写

第二:拆分一个topic主题分配多个partition分区,这样可以提供并发和吞吐量;

另外,我们的kafka消息读写为什么这么高效?原因何在?

我们要知道linux系统内核为文件设置一个缓存机制,所有对文件读写的数据内容都会存在着缓存中,称之为:page cache(页缓存)

缓存 机制:

当一个文件发生读操作时,系统会先去page cache页缓存中读取,如果找到,便会直接返回,没有缓存中没有需要读取的数据内容,那么会去磁盘中读取,此时系统写入一份到缓存中。,最终返回数据;

当有写操作时,亦是如此,数据会首先写入缓存并进行标识,等待批量保存到文件系统,减少了磁盘的操作次数和系统额外开销

我们的kafka就是依赖于这种机制,数据的读写交互便是在缓存中完成接力,不会因为kafka写入磁盘数据影响吞吐量,这就是为什么kafka非常高效的根本原因

降低文件系统页面缓存

主要针对于下面两个参数

vm.dirty_background_ratio:  #指定了当文件系统缓存页数量达到系统内存的百分比阀值的时候,便会触发pdflush/flush/kdmflush后台运行写进程,将一定的缓存数据写入磁盘中

vm.dirty_ratio:             #指定了当文件系统缓存页熟练达到系统设定的百分比阀值时候,为了保证避免数据丢失,系统不得不开始处理缓存页面,在这个过程中,可能很多应用会因为系统刷新内存数据,导致应用IO进程阻塞;这个时候呢,系统就会转入同时处理页缓存和堵塞应用

ps:建议将vm.dirty_background_ratio设置为5%,vm.diry_ratio设置为10%;根据不同环境,需要进行测试而定

topic的拆分:

kafka读写单位是partition,将一个topic分配到多个partition可以提高系统的吞吐量,但前提是将不同的partition分配到不同的磁盘上,如果多个partition位于一个磁盘上就会出现多个进程同时对磁盘上多个文件进行读写,这样造成了磁盘的频繁调度,破坏了磁盘读写的连续性

如何实现将不同的partition分配到不同的磁盘上呢?

我们可以将磁盘上的多个目录配置到broker的log.dirs上

# vim /usr/local/kafka/config/server.properties

log.dirs=/disk1/logs,/disk2/logs/,/disk3/logs#kafaka在新建partition时,会将partition分布在paritition最少的目录上面,因此,不能将同一个磁盘上的多个目录设置到logs.dirs上

kafka配置参数优化:

num.network.threads=3  #broker处理消息的最大线程数

num.io.threads=8     #broker处理磁盘IO的线程数

一般num.network.threads主要就是处理网络IO,读写缓冲区数据,基本没有IO等待,配置线程数量为CPU核数n+1

num.io.threads主要进行磁盘IO操作,高峰期可以能有些等待,因此配置较大一点,配置线程数量为CPU核数的2~3倍即可

日志保留策略优化:

kafka被打量的写入日志消息后,会生成打量的数据文件,也就是日志消息,这样会占用大量的磁盘空间。

减少日志保留时间,通过log.retention.hours设置,单位是小时

log.retention.hours=72    #保留日志数据的时间范围,过后便会删除

段文件大小优化

段文件配置大小为1GB,这样有利于快速的回收磁盘空间,重启kafka加载也会更快,如果说文件过小,那么文件数量就会较多,kafka启动的时候回单线扫描(log.dir)下的所有文件,文件较多启动较慢,会影响性能,

log.segment.bytes=1073741824    #段文件最大大小,超过该阀值,会自动创建新的日志段

Logs数据文件写盘策略优化

为了大幅度提高producer写入吞吐量,需要制定定期批量写入文件磁盘的计划

每当producer写入10000条消息事,便会将数据写入磁盘,

#log.flush.interval.messages=10000   #强行将数据刷新到磁盘之前所能接受的消息数

#log.flush.interval.ms=1000  #在强制刷新之前,消息可以停留在日志中最长的时间(单位毫秒,每间隔1秒时间,刷数据到磁盘中)

【Filebeat优化】

还记得我们为什么要使用filebeat采集日志数据吗?那是因为Logstash功能虽然强大,但是它依赖于java,在海量日志环境中,logstash进程会消耗更多的系统资源,这将严重的影响业务系统的性能,而我们说的filebeat是基于go语言,没有任何依赖,配置简单,占用系统资源少,比logstash更加的轻量级;但是有点还是需要注意。在日志量比较大的情况下或者日志异常突发时,filebeat也会占用大量的系统内存开销,所以说这方面的优化,也是至关重要的

内存优化,Filebeat内存收到两种模式的限制,一种是内存模式,第二种是文件缓存模式,任选其一即可

queue.mem:

events:4096#表示队列可以存储的事件数量。默认值是4096个事件。

flush.min_events:512#发布所需的最小事件数量。 默认值是0,表示可以直接输出发布事件,而无需额外的等待时间。 如果设置为非0,必须等待,在满足指定的事件数量后才能输出发布事件。

flush.timeout: 5s #表示最早的可用事件在队列中等待的最长时间,超过这个时间,立即输出发布事件,默认值是0s,表示立即可以输出发布事件

配置含义:该队列能够存储4096个事件数量,如果超过512个可用的事件则在队列中等待5秒之后,将事件转发至output输出

文件缓存模式调优

此模式可以限制最大的使用内存

ueue.spool:

file:

path:"${path.data}/spool.dat"#Spool file的路径

size: 512MiB #Spool file的大小,也就是缓冲区的大小。

page_size: 16KiB #文件的页面大小。默认值为4096(4KiB)。

write:

buffer_size: 10MiB #写缓冲区大小。一旦超过缓冲区大小,就刷新写缓冲区。

flush.timeout: 5s #写缓冲区中最旧事件的最长等待时间。如果设置为0,则在write.flush.events或write.buffer_size满足时写入缓冲区仅刷新一次。

flush.events:1024 #缓冲事件的数量。一旦达到上限,就刷新写缓冲区。

文件系统资源的优化:

fliebeat对日志的采集有一个弊端,那就是只要发现日志就会坚持把日志收集完,否则的话就会永久锁住文件句柄不放手,就算日志文件被删除,也不会放手,这就导致了文件系统大量的文件句柄被filebeat占用,导致收集日志异常,故此对其进行优化

1)close_inactive:1m   #表示没有新日志采集后,多长时间关闭文件句柄;(也就是说无数据采集时候,等待多长时间便会自动关闭文件句柄),这里设置1分钟

2)close_timeout:3h    #限定的数据传输时间,这里是指传输了三小时就强行关闭文件句柄,该配置解决了文件句柄耗尽的问题,但也存在着数据丢失的风险,需要综合考虑

3)clean_inactive:72h   #表示多久会清理一次文件描述符在registry文件,默认值0表示不清理,如果不清理,registry会变大,带来性能问题

4)ignore_older:70h    #设置了clean_inactive,就需要设置ignore_older,并且保证该值小于clean_inactive

[小结]

关于ELK综合方面的优化,也就介绍这么多了,其实ELK的优化方面很少,我个人觉得已经足够了,主要就是针对不同的环境和业务需求进行调参,调整适合自己的才是最好的,当然前提是你要知参数的各个含义;优化也是一个综合的技术,

无论什么服务,我们能做到的优化点无非就是硬件,系统以及服务配置的调参;逐步测试,一步步达到最优的状态;这是进行优化的基本策略和思路(ps:本章可能还有很多优化策略没有写到,欢迎大佬填坑补充~)

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

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

相关文章

spark SQL(三)数据源 Data Source----通用的数据 加载/保存功能

Spark SQL 的数据源------通用的数据 加载/保存功能 Spark SQL支持通过DataFrame接口在各种数据源上进行操作。DataFrame可以使用关系变换进行操作,也可以用来创建临时视图。将DataFrame 注册为临时视图允许您对其数据运行SQL查询。本节介绍使用Spark Data Sou…

sqlserver日期函数

SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如:向日期加上2天 select dateadd(day,2,2004-10-15) --返回&#xff1a…

荣耀鸿蒙系统开机动画,荣耀赵明:鸿蒙系统首发设备欲屏蔽开机广告

来源:硅谷分析狮余承东表示8月9日会发布鸿蒙系统,而从他透露的一些细节看,鸿蒙系统将首先运用在智慧屏终端上,其配合大屏幕和自研芯片(麒麟AI芯片,鸿鹄智慧显示芯片,凌霄WIFI芯片),将实现生态上…

编写Maven插件的提示

最近,我花了很多时间来编写或为Maven开发插件。 它们简单,有趣且有趣。 我以为我会分享一些技巧,使他们在编写时变得更轻松。 提示1:将任务与Mojo分开 最初,您将把mojo的所有代码放入mojo的类(即&#xf…

oracle通信通道的文件结尾_ORA-03113:通信通道的文件结尾解决

提示ORA-03113:通信通道的文件结尾解决事情原由:oracle安装到win7下,以为都是直接sqlplus / as sysdba,使用数据库,但最近连接时频繁报错,提示ORA-03113:通信通道的文件结尾进程 ID &#xff1a…

Python_迭代器与生成器

迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter()…

JSOI 2009 BZOJ 1444 有趣的游戏

题面 题目描述 小阳阳发明了一个有趣的游戏:有n个玩家,每一个玩家均有一个长度为 l 的字母序列,任何两个玩家的字母序列不同。共有m种不同的字母,所有的字母序列都由这m种字母构成,为了方便,我们取大写字母…

html语言dl与ul,HTML中DL、UL、OL用哪个比较好

大家好~ 我是一枚正直纯洁的苦逼程序员!!!!!ul,ol,dl标签是CSS网页布局中常用的列表元素。 列表将具有相似特征或先后顺序的内容按照从上到下的顺序排列起来。1.ul标签:无序列表始于…

slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)

作用域HEi免费资源网在介绍slot前&#xff0c;需要先知道一个概念&#xff1a;编译的作用域。比如父组件中有如下模板&#xff1a;HEi免费资源网{{message}}这里的message就是一个slot&#xff0c;但是它绑定的是父组件的数据&#xff0c;而不是组件< child-component >的…

Java – JDK 8的远景

世界正在缓慢但肯定地发生变化。 经过更改后&#xff0c;Java有了JDK 7的全新外观&#xff0c;Java社区期待JDK 8&#xff08;可能还有JDK 9&#xff09;所带来的其余改进。 JDK 8的目标目的是填补JDK 7实施中的空白-该实施中剩下的部分难题&#xff0c;应该在2013年底之前为广…

CSS 学习路线(一)元素

元素(element) 类型:替换和非替换元素 替换元素(replaced element): 用来替换元素内容的部分并非由文档内容直接显示. eg:img input 非替换元素(nonreplaced element): 其内容由用户代理在元素本身生成的框显示. eg:绝大多数都是非替换元素 基本元素类型:块级(block-lev…

[urllib]urlretrieve在python3

python3下面要使用&#xff1a;urllib.request.urlretrieve()这种形式的调用 1 from urllib.request import urlretrieve 2 3 4 urlretrieve(url, path) 转载于:https://www.cnblogs.com/sigai/p/8178375.html

使用Gulp压缩CSS/JS

一、安装 1.安装gulp npm install -g gulp2.检查gulp 版本 gulp -v3.在项目文件夹下安装gulp npm install --save-dev gulp二、压缩JS 1.安装gulp-uglify模块 npm install gulp-uglify2.在项目根目录创建gulpfile.js文件 3.在gulpfile.js文件中写入代码 // 获取 gulpvar gulp …

android活动开始,android – 点击谷歌地图标记infoWindow开始活动

我建议使用HashMap或类似的东西.当您遍历对象列表并为它们创建标记时,还要将标记添加到列表中,使用对象的ID作为键,将标记作为值&#xff1a;private HashMap markerMap new HashMap();…for(MarkerObject obj : this.markerObjects){//If the marker isnt already being disp…

Hamcrest包含匹配器

与Hamcrest 1.2相比 &#xff0c;针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档。 例如&#xff0c;四个重载的contains方法具有更具描述性的Javadoc文档&#xff0c;如下面所示的两个比较屏幕快照所示。 尽管仅通过尝试就可以弄清楚“包含”匹配器…

华为cor—al10_cor al10是华为什么型号 cor al10是华为啥型号

cor al10是华为荣耀Play。外观方面&#xff0c;荣耀Play提供有星云紫&#xff0c;极光蓝&#xff0c;幻夜黑三种基础配色&#xff0c;以及幻夜黑与魅焰红的酷玩版配色&#xff1b;拍照方面&#xff0c;荣耀Play具有1600万AI双摄像头&#xff0c;前置摄像头为1600万像素&#xf…

函数 (四) 迭代器和生成器

一 迭代器 一 迭代的概念 #迭代器即迭代的工具&#xff0c;那什么是迭代呢&#xff1f;#迭代是一个重复的过程&#xff0c;每次重复即一次迭代&#xff0c;并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复&#xff0c;因而不是迭代print(>) l[1,2,3]…

进阶-JMS 知识梳理

JMS 一、 概述与介绍 ActiveMQ 是Apache出品&#xff0c;最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和协议&#xff0c;带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式…

android蓝牙pair,Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了

原标题&#xff1a;Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了 来源&#xff1a;cnBeta.COM蓝牙是一项应用非常广泛的无线技术&#xff0c;在无线音频配件、智能手表和智能家电中都广泛使用。不过蓝牙设备的配对体验并不优秀&#xff0c;而且无法实现跨平台的一致性…

用CSS让DIV上下左右居中的方法

例如 一个父div(w:100%;h:400px)中有一个子div(w:100px;100px;)。让其上下左右居中。 方法一&#xff08;varticle-align&#xff09; 理念 利用表格单元格的居中属性。 步骤 父div外层配置一个div&#xff0c;同时设置为表格元素 (display: table)&#xff0c;宽度为100%父…