Sentinel参数设置不当导致日志数量持续增长分析
Sentinel介绍
Sentinel是阿里巴巴开源的分布式限流平台,目前在Github有18.4k的star,Github地址:github.com/alibaba/Sen… 他主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性
问题描述
最近发现生产的Sentinel日志文件数量一直在增多,所以对Sentinel日志文件生成策略进行分析,发现在生成日志文件时,如果参数配置不合理,就会产生如下效果,具体原因请查看问题定位章节
问题定位
上图为Sentinel日志文件写入流程,在写入指标时,如果检测到文件不存在或文件大小超过50M就会创建文件,而在创建文件时首先会获取文件名称,而文件名称有以下两种策略
日志文件名称获取
如果
csp.sentinel.log.use.pid
为true,那么文件名称前缀会包含当前pid,格式为:应用名称-metrics.log.pidxxx
如果
csp.sentinel.log.use.pid
为false,生成文件名称前缀不包含pid,格式为:应用名称-metrics.log
有了文件前缀以后再拼接当前日期,就会返回以下两种格式的一种
应用名称-metrics.log.pidxxx.yyyy-MM-dd
应用名称-metrics.log.yyyy-MM-dd
删除多余文件
在获取文件名称以后,就会创建日志文件,在创建时首先会检查是否有多余的文件,如果文件数大于6个,那么会进行循环删除,直到剩下6个文件,具体代码如下,可以看到在删除文件时又调用了listMetricFiles
,所以需要具体查看listMetricFiles
逻辑是否有坑
//批量删除文件
private void removeMoreFiles() throws Exception {List<String> list = listMetricFiles(baseDir, baseFileName);if (list == null || list.isEmpty()) {return;}for (int i = 0; i < list.size() - totalFileCount + 1; i++) {String fileName = list.get(i);String indexFile = formIndexFileName(fileName);//删除指标文件new File(fileName).delete();...//删除以idx结尾的索引文件new File(indexFile).delete();..}}
查找历史文件
listMetricFiles
方法会根据文件前缀查找文件,如果开启了csp.sentinel.log.use.pid
为true,就可能导致返回的文件数量有变化
假设应用名称为sentinel-demo,pid为5687,那么文件前缀为sentinel-demo-metrics.log.pid5687,根据前缀查询会返回相关文件
但如果系统发布重启了,那么pid就会发生变化,这样就会查不到之前的文件,查找不到文件就没法删除,这样依次类推,就会产生大量文件
/*** 查找指标文件* baseDir 日志文件路径* baseFileName为文件前缀* @throws Exception*/public static List<String> listMetricFiles(String baseDir, String baseFileName) throws Exception {List<String> list = new ArrayList<String>();File baseFile = new File(baseDir);File[] files = baseFile.listFiles();if (files == null) {return list;}for (File file : files) {String fileName = file.getName();if (file.isFile()&& fileNameMatches(fileName, baseFileName)&& !fileName.endsWith(MetricWriter.METRIC_FILE_INDEX_SUFFIX)&& !fileName.endsWith(".lck")) {list.add(file.getAbsolutePath());}}Collections.sort(list, MetricWriter.METRIC_FILE_NAME_CMP);return list;}/*** fileName 本地文件名称* baseFileName 文件前缀,格式为一下两种,sentinel-demo为应用名称,5687为pid* sentinel-demo-metrics.log * sentinel-demo-metrics.log.pid5687*/public static boolean fileNameMatches(String fileName, String baseFileName) {if (fileName.startsWith(baseFileName)) {String part = fileName.substring(baseFileName.length());// part is like: ".yyyy-MM-dd.number", eg. ".2018-12-24.11"return part.matches("\\.[0-9]{4}-[0-9]{2}-[0-9]{2}(\\.[0-9]*)?");} else {return false;}}
参数说明
csp.sentinel.log.use.pid
日志文件包含pid
csp.sentinel.metric.file.total.count
日志文件保留数量,默认值为6
csp.sentinel.metric.file.single.size
单日志文件大小,默认为50M
总结
由于在系统启动时指定了csp.sentinel.log.use.pid
为true,所以日志文件名称会包含pid,但是由于系统重启pid会发生变化,所以在删除文件时根据文件前缀,没法查找到上一个pid的日志文件,因此就会产生大量的日志文件
修复方式
- 显示指定
csp.sentinel.log.use.pid
为false - 启动时不指定
csp.sentinel.log.use.pid
Sentinel参数设置不当导致日志数量持续增长分析相关推荐
- 爱快软路由ADSL/PPPoE之“间隔时长重拨“参数设置不当导致远程ssh连接频繁断线
一台使用一年左右的软路由最近不能上线,导致通过阿里云域名访问内网设备无法实现.后台查看发现wan口拨号不成功. 网络是电信宽带.电信宽带可以4次拨号,本人网络环境共有4台路由器,以前一直正常运行,现在 ...
- java eden区_从实际案例聊聊Java应用因为Eden区设置不当导致的慢GC问题
JVM的内存结构 在虚拟机中,不同的对象存活的时间是不一样的,为了区别出不同年龄的对象,更好的管理他们,目前主流的虚拟机采用都是分代算法. 在JVM中,会内存划分为三块,分别是新生代,老年代,以及持久 ...
- 使用SMARTFORM字段参数设置解决SMARTFORM中数量、金额字段显示问题
在SMARTFORM中,数量和金额类型的字段在显示的时候会和其他字段不在同一个水平面上,解决的方法:&ITAB-MENGE(C)& ,下面是SMARTFORM字段参数设置的几个注意事 ...
- 设置最大值_电机变频器参数设置不当会怎样
我们知道变频器驱动电机运行是需要设置参数的,包括变频器运行控制模式如启动.停止,频率给定的命令来源,变频器频率的上下限.加减速等等参数都要根据实际情况来正确的设置. 控制模式与接线方式的不统一造成的, ...
- Jdbc访问mysql查询聚合函数_JDBC连接参数设置对Oracle数据库的影响分析
一次数据库性能问题处理引发的JDBC参数设置思考 近期某环境下系统,出现大面积页面访问缓慢情况,每个页面交易响应时间2-5秒,严重超过平日访问阈值. 经排查分析,问题主要出现在数据库,生成AWR得到3 ...
- jvm 崩溃日志设置_JVM致命错误日志(hs_err_pid.log)分析(转载)
当jvm出现致命错误时,会生成一个错误文件 hs_err_pid.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证系统稳定.当出现cra ...
- java8 gc配置_基于JDK8的JVM参数设置和GC日志解读
一.在IDEA中设置程序的运行参数 Run -> Edit Configuration -XX:+PrintGCDetails -Xms30M -Xmx30M -Xmn10M -XX:Survi ...
- 线上MySQL死锁分析——索引设置不当导致的死锁
文章目录 1. 背景 2. MySQL InnoDB的锁机制 2.1 MySQL中的锁类型 2.2 行锁的加锁规则 2.3 死锁检测机制 3. 本文案例分析 3.1 分析InnoDB status日志 ...
- oracle加并行变慢,并行设置不当导致数据处理速度变慢
问题描述 系统迁移,由单节点4cpu服务器迁移到双节点rac,32颗cpu系统中,迁移后对特定数据新服务器的处理速度反而不如老服务器. 问题分析 出现两侧代码相同但执行结果相差很大的原因是表SAVE_ ...
最新文章
- 小白学数据分析-----回归分析在游戏人气分析的应用探索
- Winform中实现批量文件复制(附代码下载)
- 当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K
- 【问题记录】服务器部署项目时启动tomcat后报错 HTTP 错误 404.0- Not Found 您要找的资源已被删除、已更名或暂时不可用 解决方案···
- smpp客户端_SMPP Java示例(客户端)
- delphi10android保存数据,DELPHI XE5 Android – SDCard的SAVE / LOAD文件
- Bailian1835 POJ1835 宇航员【模拟】
- Java1009_疯狂java学习笔记1009---异常
- 使用qume启动虚拟机的时候出现:“启动域时出错: Requested operation is not valid: network ‘default‘ is not active”
- ac自动机 匹配最长前缀_【HDU】5069 Harry And Biological Teacher AC自动机fail指针建树dfs...
- 液晶显示器测试软件6,屏幕坏点检测工具(Datum pixel repair)
- 谈谈如何快乐地工作(上班),以及如何评价一个人的层次
- 我对 相对论 提出了一个 修正,名为 “K氏修正”
- 全志V3s学习记录(11)音频、视频使用总结
- 软件工程毕业设计课题(40)基于JAVA毕业设计JAVA电子商务购物商城系统毕设作品项目
- Flash制作大雪纷飞效果动画
- 修复打不开计算机管理,win10系统设备管理器打不开的修复技巧
- Linux找回用户密码
- UniPro助力半导体企业之低代码平台篇:高效协同快速响应
- SpringBoot Tomcat 配置https 且443端口也是https(若依为例对接微信小程序的https,小程序也可以访问)
热门文章
- 读书笔记:《爱的艺术》
- 32位系统最大只能支持4GB内存之由来
- 音频领域_DSP,专业词汇积累
- Android开发 给应用集成打开office文档的功能
- 私募股权公司Thoma Bravo对J.D. Power的收购全部完成
- 老年人计算机培训信息,铁四社区开展老年人计算机培训班
- Cython中“@cython.boundscheck\@cython.wraparound(False)”有什么用?
- cookies的时限是多少_cookie有效期限30天什么意思
- OpenCV-Python中的标量Scalar是什么
- Inconel 718实际有多厚 锻造注意事项