记一次mysql磁盘io高的问题排查

记一次mysql磁盘io高的问题排查,第1张

现象是,系统里的java连接mysql超时了,

于是去mysql的机器,查看/var/log/messages日志,查对应的时间点的情况

发现mysql被阻塞了blocked for more than 120 seconds,mysql的io非常之高,用top查看系统的负载也到达了50的样子

用mpstat查看cpu情况

好明显,都在等io

用iostat查看io情况,%util的值,一直在80%,99%之间变化

以为磁盘有问题,用dd测下速看看

从上面的结果看,也还好,没问题

以为可能磁盘有坏道,用下面命令也扫了一遍,没问题

结果也没有坏的块,这个过程,很耗时。

用show processlist命令查看mysql正在忙着什么,一看,也没什么任务在执行的

想看看mysql,研究写哪个文件时,最耗时的

从上面结果来看,xxl_job是最耗时的。知道点眉目了,因为公司的定时任务是用的xxljob,定时任务里,有每几秒执行的任务,我猜它的日志记录一定很大,于是查看一下

我的天,这个表的记录有千万!!!这些记录,没做定时任务来清理,由于都是一些没用的记录,所以这个表的数据我全清了

清了之后,再用iostat查看

%util一下子就降下来了,用iotop查看mysql进程的io也下降了

cpu的iowait也下降了

定义一个事件,让mysql定时清理30天前的日志记录

记录一下,希望对有需要的朋友也起一点提示

1. MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然会CPU占用过高,所以可以用top命令查看MySQL所在服务器的cpu使用情况,从而分析是否有瓶颈;

2. show processlist查看MySQL当前的执行状态,查看是否有大量的Sleep或Locked状态;

Java中的IO方式主要分为3种:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)。

BIO

同步阻塞模式。在JDK1.4以前,使用Java建立网络连接时,只能采用BIO方式,在服务器端启动一个ServerSocket,然后使用accept等待客户端请求,对于每一个请求,使用一个线程来进行处理用户请求。线程的大部分时间都在等待请求的到来和IO *** 作,利用率很低。而且线程的开销比较大,数量有限,因此服务器同时能处理的连接数也很低。

NIO

BIO模式中,是“一个Socket一个线程”;而在NIO中则是使用单个或少量的线程来轮询Socket,当发现Socket上有请求时,才为请求分配线程。因此是“一个请求一个线程”。

具体实现就是把Socket通过Channel注册到Selector,使用一个线程在Selector中轮询,发现Channel有读写的事件,就可以分配给其他线程来处理(通常使用线程池)。

AIO

从JDK7开始支持AIO模式。通过AsynchronousServerSocketChannel中注册事件回调函数来处理业务逻辑。当IO *** 作完成以后,回调函数会被调用。如果传入AsynchronousChannelGroup,可以绑定线程池来处理事件。

关于JDK的实现,Windows平台基于IOCP实现AIO,Linux只有eppoll模拟实现了AIO。

附:关于IO经常提到Reactor/ Proactor模式。

这两个模式中都有两个角色:事件多路分离器(Event Demultiplexer)和事件处理器(Event Handler)。分离器负责对监听IO事件,并通知处理器;处理器负责对IO内容进行处理,完成对应的业务。

二者的差异,以读 *** 作为例(写 *** 作类似)。

Reactor中实现读:

1.        注册读就绪事件和相应的事件处理器。

2.        事件分离器等待事件。

3.        事件到来,激活分离器,分离器调用对应的处理器。

4.        处理器完成IO读 *** 作,处理读到的数据,注册新的事件,然后返还控制权。

Proactor中实现读:

1.        注册读完成事件和相应的事件处理器(包括缓冲区地址)。

2.        事件分离器等待 *** 作完成事件的同时, *** 作系统利用并行的内核线程执行实际的读 *** 作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读 *** 作完成。

3.        事件分离器呼唤处理器。

4.        事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步 *** 作,并将控制权返回事件分离器。

由此可见,两者的主要区别:Reactor中,由用户线程(事件处理器所在线程)完成IO的读写 *** 作;而在Proactor中,是由 *** 作系统完成IO读写 *** 作后,再通知事件处理器,用户线程只完成对数据的业务逻辑处理部分。

更多问题可以问远标教育中心的技术咨询。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/7661056.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存