记一次springboot服务凌晨无故宕机问题的解决

表述

在一次服务更新后发现每天凌晨0点3秒服务准时挂,开始的时候认为是maven依赖中存在system.exit(3)类似这样的代码,但是我想了下这个代码很多客户都有用到但是只有这一个客户出现了问题,而且另外一个服务没有更新在此前几个月都是没问题的 这几天也是一样无故挂了。

环境

windows服务器

排查

1、初步怀疑是内存泄漏问题,在启动脚本中加入 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump.log,第二天起来一看还是挂了没有出现dump日志说明不是内存泄漏

2、白天几千几万的请求量都没有挂,凌晨时候星星两两的请求量甚至没有请求却挂了

3、服务准时0点3秒挂,后续我写了个脚本加入执行计划每日凌晨1点检查服务并启动,发现有写脚本的服务还是0点3秒挂而另外一个服务变成1点10几分左右挂了

4、有怀疑可能是logback的问题,日志生成规则是按日期备份的,可是每个客户都是这样的配置就这个客户有问题所以暂时排除这个可能了

临时解决

1、暂时给几个服务的启动脚本加入到执行计划中每日凌晨检查并启动,没有找到好的解决方案也不知道是什么问题,希望知道的大佬告知一下感激不尽。

附上执行计划检查脚本

@echo off
echo 正在检测启动服务…请不要关闭该窗口
D:
cd “D:\写上服务的目录”
:ks
set num=0
for /f %%i in (‘netstat -ano^| find “:服务的端口”') do set /a num=%num%+1
echo %num%
if %num% == 0 (
echo “开始启动服务”
call D:\aaa.bat
) else (
echo “无需启动服务”
)

其中D:\aaa.bat 是服务的启动脚本 这里也可以直接写上java -jar springboot服务.jar类似这样的代码

最终解决

经昨晚12点时候录屏服务器后看后终于找到了问题所在,控制台没有丝毫的报错信息直接程序崩溃,这就是windows服务器的不足之处,如果此时服务器是Linux的话 会在项目目录底下记录崩溃的Jvm日志。思考之后发现果真竟然是logback的锅,找到原因:

1、因为logback配置中没有加入maxFileSize的配置,导致日志文件大小有几个G

2、服务器本身性能配置一般

3、logback采用的是zip压缩按日备份的

4、压缩文件是很耗CPU的,文件越大CPU占用越多,如果文件很大就会导致压缩到一半程序崩溃,这里就是出现了这种情况导致压缩到一半没成功,tmp临时文件也没有被删除

5、没有出现该问题的几个客户是因为日志文件都没有达到这种级别的量,其次其他几个客户的服务器性能都是很OK的

解决方法就是在加入maxFileSize配置 建议值是128M。值越大对服务器的性能要求就越高,我这边因为服务器性能一般保险起见设置128M

补充知识:Springboot启动即挂掉问题

提示说明端口8080被占用

将端口改为其他端口号即可

以上这篇记一次springboot服务凌晨无故宕机问题的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Jvm调优和SpringBoot项目优化的详细教程

    一.Jvm调优. 参考文章 1.先看一下未设置JVM参数的情况,默认情况下,没有设置任何Jvm参数. idea中安装VisualVM监控jvm的图文教程 2.设置Jvm参数. 配置参数: 关于这些设置的JVM参数是什么意思,参考Jvm调优. -XX:MetaspaceSize=128m (元空间默认大小) -XX:MaxMetaspaceSize=128m (元空间最大大小) -Xms1024m (堆最大大小) -Xmx1024m (堆默认大小) -Xmn256m (新生代大小) -Xss256

  • Springboot异常错误处理解决方案详解

    1.在有模板引擎的情况下: springboot会默认找 templates/error/错误状态码.html,所以我们要定制化错误页面就可以到templates/error下创建一个[对应错误状态码.html]html文件,当发生此状态码的错误springboot就会来到对应的页面. 同时如果我们想让400-499之间的错误都去同一个错误页面,那我们可以在templates/error下创建一个4xx.html.同理500-599的错误可以用5xx.html. 注意:springboot会优先

  • 解决SpringBoot框架因post数据量过大没反应问题(踩坑)

    此处网上最多的做法是需要修改tomcat的参数配置大致如下: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443" URIEncoding="UTF-8" maxThreads="3000" compression="on" compress

  • 记一次springboot服务凌晨无故宕机问题的解决

    表述 在一次服务更新后发现每天凌晨0点3秒服务准时挂,开始的时候认为是maven依赖中存在system.exit(3)类似这样的代码,但是我想了下这个代码很多客户都有用到但是只有这一个客户出现了问题,而且另外一个服务没有更新在此前几个月都是没问题的 这几天也是一样无故挂了. 环境 windows服务器 排查 1.初步怀疑是内存泄漏问题,在启动脚本中加入 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump.log,第二天起来一看

  • 使用spring-boot-admin对spring-boot服务进行监控的实现方法

    spring-boot-admin,简称SBA,是一个针对spring-boot的actuator接口进行UI美化封装的监控工具.他可以:在列表中浏览所有被监控spring-boot项目的基本信息,详细的Health信息.内存信息.JVM信息.垃圾回收信息.各种配置信息(比如数据源.缓存列表和命中率)等,还可以直接修改logger的level. 官网:https://github.com/codecentric/spring-boot-admin 使用指南:http://codecentric.

  • SpringBoot服务端数据校验过程详解

    这篇文章主要介绍了SpringBoot服务端数据校验过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功能模块,这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证.为什么这么说呢?往往我们在编写程序的时候都会感觉后台的验证无关紧要,毕竟客户端已经做过验证了,后端没必要在浪费资源对数据进行验证了,但恰恰是这种思维最为容易

  • SpringBoot服务开启后通过端口访问无反应的解决

    SpringBoot入门Demo,一次深夜踩坑记录. springboot小项目开启后,访问端口无反应. 首先看我的项目目录: 项目的pom文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema

  • SpringBoot服务上实现接口限流的方法

    Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面. 在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数:或者按照某种规则进行限流,如限制ip的单位时间访问次数等. 之前我们已经讲过接口限流的工具类ratelimter可以实现令牌桶的限流,很明显sentinel的功能更为全面和完善.来看一下sentinel的简介: https://github.com/spring-cloud-incubator/spring-cloud-alibab

  • 基于SpringBoot服务端表单数据校验的实现方式

    SpringBoot服务端表单数据校验 (SpringBoot高级) 一.实现添加用户功能 1 创建项目 2 修改POM文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http:

  • 为SpringBoot服务添加HTTPS证书的方法

    HTTPS是HTTP的安全版本,旨在提供数据传输层安全性(TLS).当你的应用不使用HTTP协议的时候,浏览器地址栏就会出现一个不安全的提示.HTTPS加密每个数据包以安全方式进行传输,并保护敏感数据免受窃听者或黑客的攻击. 您可以通过在Web应用程序上安装SSL证书来实现HTTPS,互联网上受信任的证书通常是需要(CA)颁发的证书.为了学习目的,您也可以使用自签名证书,比如:使用Java Keytool生成自签名证书. 一.自签名证书 您可以使用位于JDK bin文件夹下的Keytool生成证

  • Springboot服务Docker化自动部署的实现方法

    还在手动将springboot项目打包,然后上传服务器,手动执行启动命令将项目启动吗?你out了!通过Docker配置DockerMaven插件,快速部署,一键将springboot服务器部署到服务器,一键启动,告别传统部署方式,实现自动化运维的第一步,心动吗?快来一起看看~ 微服务部署方式 (1)手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器. (2)通过Maven插件自动部署. 对于数量众多的微服务,手动部署无疑是非常麻烦的做法,

  • 聊一聊SpringBoot服务监控机制

    前言 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的. 就目前而言,大部分微服务应用都是基于 SpringBoot 来构建,所以了解 SpringBoot 的监控特性是非常有必要的,而 SpringBoot 也提供了一些特性来帮助我们监控应用. 本文基于 SpringBoot 2.3.1.RELEASE 版本演示. SpringBoot 监控 SpringBoot 中的监控可以分为 H

  • SpringBoot服务监控机制原理解析(面试官常问)

    前言 任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的. 就目前而言,大部分微服务应用都是基于 SpringBoot 来构建,所以了解 SpringBoot 的监控特性是非常有必要的,而 SpringBoot 也提供了一些特性来帮助我们监控应用. 本文基于 SpringBoot 2.3.1.RELEASE 版本演示. SpringBoot 监控 SpringBoot 中的监控可以分为 H

随机推荐