数据库线程池引发的系统磁盘100%问题
平台某系统凌晨3:00突发告警,系统磁盘使用率超过门限,很快达到100%,主系统功能不可用,整个集群出现同样的问题,运维同事紧急介入,压缩日志,重启系统,系统回复正常
问题描述
究竟是什么问题引发的磁盘使用率100%呢?经过排查,基本定位为日志文件导致,日志把系统磁盘给打爆了,为什么日志会突然间暴增了?而近期系统没有发版,而且凌晨3:00,系统使用率并不高?系统bug?被黑产攻击?爬虫?带着这些问题,我们来一步步分析。
分析日志
既然是日志文件导致的,按我们就分析一下日志文件,看看问题出现在哪里,首先看下系统监控,确定一下时间点:
从图中可以看到大概3:00左右系统出现问题,从日志分析看是quartz定时器连接数据库出现了问题
为什么quartz连接不上数据库会导致输出大量日志呢?这里我们根据日志输出的异常信息仔细分析一下,参考上图红框里面的栈信息,quartz连接数据库的操作是由QuartzSchedulerThread线程来发起的,我们去代码中一探究竟,流程如下:
QuartzSchedulerThread->acquireNextTriggers->executeInNonManagedTXLock->rollbackConnection
/**
* <p>
* The main processing loop of the <code>QuartzSchedulerThread</code>.
* </p>
*/
@Override
public void run() {
boolean lastAcquireFailed = false;
while (!halted.get()) {
try {
// check if we're supposed to pause...
synchronized (sigLock) {
while (paused && !halted.get()) {
try {
// wait until togglePause(false) is called...