首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

线上问题排查——磁盘满

编程知识
2024年08月14日 13:52

现象

群里反馈管理后台登录不上了,我一访问,整个界面空白,没有提示,打开 F12,发现控制台提示 js、css 等静态资源报 net::ERR_HTTP2_PROTOCOL_ERROR,客户端可以下载到服务端资源,第一次碰到这个,StackOverflow 走起

net::ERR_HTTP2_PROTOCOL_ERROR 是关于什么的?

可能出现的问题非常多,包括磁盘满、nginx 配置问题、请求头问题、浏览器问题、cdn 问题。因为这个服务没有更新过,也没人动过配置,所以不太可能是 nginx、服务的问题,另外每次下载 js 文件,似乎都不是完整的,虽然服务器都有做出响应。

所以初步判断是服务器出了问题,但是没有配置 ssh,登录阿里云后台的手机也在公司,没办法看到服务器监控。

此时发现多刷新几次,利用浏览器的本地缓存,首页还是能访问出来的,但是登录功能无法响应,如果填了错误的验证码,可以立马返回错误信息。说明 MySQL 写受到了影响,基本上可以是断定服务器的磁盘、内存问题。

第二天到了公司看控制台监控,好家伙磁盘占用 99%

刷新了一下管理后台,响应非常非常的慢;先清理空间再验证是否这个问题

解决

列出所有挂载的文件系统,并显示每个文件系统的总空间、已用空间、可用空间和使用率。

df -h

#Filesystem      Size  Used Avail Use% Mounted on
#udev             16G     0   16G   0% /dev
#tmpfs           3.1G  724K  3.1G   1% /run
#/dev/vda1        99G   94G  343M 100% /
#tmpfs            16G     0   16G   0% /dev/shm
#tmpfs           5.0M     0  5.0M   0% /run/lock
#tmpfs            16G     0   16G   0% /sys/fs/cgroup
#tmpfs           3.1G     0  3.1G   0% /run/user/0

这时候要注意了,如果直接从根目录递归查找,会消耗大量的 CPU 和 IO 资源,可能会导致服务器变得非常慢,甚至暂时无法响应,所以要一层一层来

# /* 换成对应的目录即可
du -sh /* | sort -rh | head -n 10

最终找出了两个目录,nacos 的 access 日志 和 MySQL binlog 日志,总计 80G 空间,其中大部分都是七天前的,可处理

对于 nacos 的日志,直接删了之前的就好。而 MySQL 的 binlog 文件,建议从控制台执行命令

# 删除 七天前的 binlog
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY;

最终,处理了 40% 的空间

验证

多次强制刷新前端页面,静态资源和接口的响应速度也变快了。

接下来看一下昨天的日志,MySQL 除了写数据时获取不到锁,没有其他报错

包括 nginx 日志, /var/log/syslog 系统日志,/var/log/mysql/error.log 提示空间不足

2024-08-13T02:27:02.537301Z 1256492 [ERROR] [MY-000035] [Server] Disk is full writing './binlog.000556' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs.
2024-08-13T02:37:02.571302Z 1256492 [ERROR] [MY-000035] [Server] Disk is full writing './binlog.000556' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs.
2024-08-13T02:47:02.605275Z 1256492 [ERROR] [MY-000035] [Server] Disk is full writing './binlog.000556' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs.
2024-08-13T02:57:02.640862Z 1256492 [ERROR] [MY-000035] [Server] Disk is full writing './binlog.000556' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs.
2024-08-13T03:07:02.674508Z 1256492 [ERROR] [MY-000035] [Server] Disk is full writing './binlog.000556' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs.
2024-08-13T03:17:02.710238Z 1256492 [ERROR] [MY-000035] [Server] Disk is full writing './binlog.000556' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs.

除了页面实际上变快了,没有其他日志信息进一步确认

后续工作

由于日志问题导致磁盘空间不足,需要启用定时器或者自带工具进行定时清理

nacos access 日志

对于 nacos 没有提供对 access log 没有提供大小、分割配置,只有开关,而线上不建议关闭,所以需要编写 shell 脚本,加入定时器中

生产环境编写定时任务Crontab, 将脚本放到/etc/cron.daily 目录,赋予可执行权限

#!/bin/bash

logFile="/data/nacos/bin/logs/nacos_del_access.log"
# 保留14天日志
date=`date -d "$date -14 day" +"%Y-%m-%d"`
# 具体位置可调整
delFilePath="/data/nacos/bin/logs/access_log.${date}.log"

if [ ! -f "${logFile}" ];then
	echo 'access log文件打印日志频繁. /etc/cron.daily/nacosDelAccessLogs.sh 会定时删除access日志文件' >>${logFile}
fi
# 日志文件存在, 则删除
if [  -f "${delFilePath}" ];then
	rm -rf ${delFilePath}
	curDate=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
	echo '['${curDate}'] 删除文件'${delFilePath} >>${logFile}
fi

MySQL binlog

建议保留七天或十四天,使用 MySQL 自带配置即可

# 我的默认配置三十天
# -- binlog_expire_logs_seconds	2592000
# SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
SET GLOBAL binlog_expire_logs_seconds = 604800;

show VARIABLES like 'expire_logs_days';
set global expire_logs_days = 7;
之前是使用这两个命令,新版 MySQL 被废弃了

永久生效,my.conf,需要重启

[mysqld]
binlog_expire_logs_seconds = 604800

后面添加日志,需要进行管理和轮换日志文件,可以考虑使用 logrotate

参考:

  1. https://stackoverflow.com/questions/58215104/whats-the-neterr-http2-protocol-error-about
  2. https://blog.csdn.net/wtzvae/article/details/107212870
  3. https://blog.51cto.com/haibo0668/5486115
  4. https://blog.csdn.net/mr_wanter/article/details/112515814
这是一段防爬代码块,我不介意文章被爬取,但请注明出处
console.log("作者主页:https://www.cnblogs.com/Go-Solo");
console.log("原文地址:https://www.cnblogs.com/Go-Solo/p/18358836");
From:https://www.cnblogs.com/Go-Solo/p/18358836
本文地址: http://www.shuzixingkong.net/article/1096
0评论
提交 加载更多评论
其他文章 简历模版免费使用 简历模版
分享一个简历制作平台。 免费的word模版/简历模版 链接地址 https://www.xyjianli.com https://www.xyjianli.com/list https://www.xyjianli.com/wordResume 简历的重要性:开启职业生涯的钥匙 在当今竞争
开关资源新方法:Try- with-resources
JDK7新特性:Try- with-resources try-with-resources 是 JDK 7中引入的一种新的异常处理机制,它主要用于自动管理资源,能够很容易地关闭在 try-catch 语句块中使用的资源。确保资源在不再需要时能够被正确关闭。这种机制简化了资源管理,使得资源的释放更加
开关资源新方法:Try- with-resources 开关资源新方法:Try- with-resources 开关资源新方法:Try- with-resources
centos7安装docker详细教程
一、准备工作 1、系统要求 docker要求centos的内核版本不低于3.10。centos7满足最低内核要求。 检查当前的内核版本 [root@zspc /]# uname -r 3.10.0-1160.el7.x86_64 可以看到我当前的内核版本为3.10,符合最低内核要求。 2、卸载旧版本
再升级!MoneyPrinterPlus集成GPT_SoVITS
MoneyPrinterPlus现在可以和大名鼎鼎的GPT_SoVITS集成了,让money printer快人一步
再升级!MoneyPrinterPlus集成GPT_SoVITS 再升级!MoneyPrinterPlus集成GPT_SoVITS 再升级!MoneyPrinterPlus集成GPT_SoVITS
kubernetes负载感知调度
背景 kubernetes 的原生调度器只能通过资源请求来调度 pod,这很容易造成一系列负载不均的问题, 并且很多情况下业务方都是超额申请资源,因此在原生调度器时代我们针对业务的特性以及评估等级来设置 Requests/Limit 比例来提升资源利用效率。 在这种场景下依然存在很多问题: 节点负载
kubernetes负载感知调度 kubernetes负载感知调度
什么是依赖倒置原则
依赖倒置原则(Dependency Inversion Principle, DIP)是面向对象设计原则之一,它是SOLID原则中的"D"。依赖倒置原则的核心思想是高层策略性业务规则不应该依赖于低层的具体实现细节,而两者都应该依赖于抽象。 依赖倒置原则主要包含两个基本点: 抽象不
使用Django-Channels实现websocket通信+大模型对话
前言 最近一直在做这个大模型项目,我选了 Django 作为框架(现在很多大模型应用都用的 FastAPI,不过我已经用习惯 Django 了) 之前使用 AspNetCore 作为后端的时候,我先后尝试了 Blazor Server,WebAPI SSE(Server Sent Event)等方案
使用Django-Channels实现websocket通信+大模型对话 使用Django-Channels实现websocket通信+大模型对话
JVM 参数配置
JVM 参数设置入门案例 JVM 的内存参数众多,但是在实际应用中主要关注堆内存的大小设置及堆内存中新生代和老年代的大小设置,下面看一个简单的 JVM 启动参数设置案例: java -server -Xms3g -Xmx3g -XX:NewSize=1g -XX:MetaspaceSize=128m