一次服务器IO占用率高的定位分析

背景:请事假在外中,听平台组同事反馈了一个问题,在往生产数据库中导入部分数据时会造成客户端的访问超时,初步定位是因为服务器磁盘占用IO过高,导数据时IO会飙升到100%,因此引起了不少数据库的慢查询操作导致客户端响应超时,无奈只好暂时停止了导入数据的脚本,同时也延误了针对这部分数据的生产测试工作。于是我第二天回到公司就投入了对这个问题的跟踪定位工作。



环境描述:

  • 操作系统

  • 文件系统

  • 数据库

首先我们数据库某最大表的数据也不过300w多条,对于MySQL来说还是能够正常处理的。而且客户端并发量也不过1K多,数据库的TPS也未过百,我先后使用了top,iostat监测到的IO利用率确实都已经达到极限了。最后使用iotop这个工具发现了一个吃IO的罪犯jbd2

Overview
The Journaling Block Device (JBD) provides a filesystem-independent interface for filesystem journaling. ext3, ext4 and OCFS2 are known to use JBD. OCFS2 starting from linux 2.6.28 and ext4 use a fork of JBD called JBD2.

可以知晓它的主要功能是向文件系统写日志。那么肯定是由于对文件系统的操作太频繁导致的IO压力过大,问题这是个系统进程,是系统问题还是?

目前我这台服务器上只有一个应用需要大量操作IO,那就是MySQL数据库,会不会由他导致的?怀着这个疑问我用google将mysql和jbd2联合作为关键字进行搜索,得到了这么一个线索sync_binlog,innodb_flush_log_at_trx_commit这两个mysql的配置项。顿时我仿佛想起了什么,于是翻到《高性能MySQL》这本书的第10章——复制的章节(从上面的环境描述中可以看到我使用了MySQL的主主复制)找到了对sync_binlog的说明

那么innodb_flush_log_at_trx_commit呢?

  • 如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
  • 如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.
  • 如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

由于我们的业务数据的特点,对数据可靠性并不如金融、订单系统那么高于是在权衡下就把sync_binlog设置为每500次刷新一次磁盘,而将innodb_flush_log_at_trx_commit设置为2,再用iotop等工具查看系统IO情况,大大降了下来。好吧,这个借刀杀IO的罪犯终于找到并被处理了。

后记:在这次处理问题的过程中有两个小插曲。

  1. 某领导找来几个人对此问题进行会诊,有猜测服务器资源不够的,有猜测脚本问题的,有猜测数据库本身效率底下的…我个人非常非常反感在没有经过性能和监控和数据的分析而凭空猜测问题的做法。我希望给所有靠凭空想象定位问题的人提个醒,请不要随意对自己不了解的问题定性,因为别人不会把你看做高手,只会对你视而不见。
  2. 在找出jbd2的问题之后,看到一些论坛解决方案说是由于linux内核的bug可以选择升级系统内核或者修改内核配置项来解决,也许是对的,但是即使能解决这个问题对我来说成本也很大。我希望大家遇到问题时在利用网络资源的同时结合自己的情况进行进一步分析再选择采用什么解决方案,适合自己的才是最好的

参考资料:
http://unix.stackexchange.com/questions/86875/determining-specific-file-responsible-for-high-i-o
http://serverfault.com/questions/363355/io-wait-causing-so-much-slowdown-ext4-jdb2-at-99-io-during-mysql-commit
http://blog.itpub.net/22664653/viewspace-1063134/

一次服务器IO占用率高的定位分析

时间: 2024-10-01 03:33:59

一次服务器IO占用率高的定位分析的相关文章

一次服务器CPU占用率高的定位分析

背景 通过性能监控发现上线服务器cpu某核占用率已经达到了100%,而且是由我们的某个核心服务导致的.幸亏由于我们的服务进程由多个相同worker(线程)调度承担的,所以除了CPU占用率高之外,并没有对服务造成影响.随着上次我们找到那个吃IO的罪犯,这次我们要追捕的是潜伏在团体中的特务,更加惊险刺激哟! 系统环境 用top命令很容易定位到是谁占用CPU最高. 以我们的这个业务进程(imDevServer)举例,为什么说这货是个潜伏者呢?因为这是个多线程的进程,我们要知道实际上占用cpu的最小单位

线上服务器CPU占用率高如何排查定位

环境 centos7 1核2GB Java8 模拟cpu占用高 新建一个名为jvm-learn的springboot项目 模拟代码如下 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; imp

[转帖]Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践

Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践 https://www.jianshu.com/p/d4e31301ba2e 一.问题描述 Linux服务器的配置是4核16G,将war包部署到tomcat后,启动tomcat,发现内存占用率不高,但是CPU一直高达100%:浏览器输入相关url也无法访问该项目,且tomcat的进程一直存在,程序的配置什么的都没问题啊,一头雾水......通过top命令查看服务器的性能状况如下: [[email prote

电脑公司win10系统cpu占用高怎么办| win10cpu占用率高解决办法

相信很多用户都安装了电脑公司win10纯净版系统了,因为win10系统对于硬件的要求并不是很高,硬件要求低了,但是为什么win10系统总是会遇到CPU占用率的问题呢?win10系统CPU占用率高怎么解决呢? 电脑公司win10系统CPU占用率高解决步骤: 1.按快捷键"win+R"快捷键,打开"运行"界面,输入"regedit"代码,如图1所示 2.在"注册表编辑器"界面中,依次展开"HKEY_LOCAL_MACHI

Java CPU占用率高分析

首先,通过top命令找出CPU占用率高的进程: 然后,通过ps -mp 2066 -o THREAD,tid,time命令找出执行时间最长的线程的TID 将有问题的TID转为16进制格式: printf "%x\n" TID 最后,通过jstack 2066 | grep --color -E '2ab7|2ab8' -A 30命令打印线程的堆栈信息: 这些信息对于我这个运维来说,简直是天书,所以,我只需将它们发给开发即可.

C++ 多线程编程解决CPU占用率高问题

在用C++进行多线程编程的时候,时常需要写一些类似于死循环的结构来执行代码,这些死循环如果没有经过处理一直开着,那么CPU的占用率就会居高不下的做着很多无用的操做.为解决这个问题我们可以通过在各线程中的适当位置添加Sleep函数来休眠该线程,使其少做这些无用的操作.经过这个处理,正常能压缩掉一半以上的CPU占用.C++ 多线程编程解决CPU占用率高问题

Linux下分析某个进程CPU占用率高的原因

  Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用  1.top 查到占用cpu高的进程pid 2.查看该pid的线程:top -H -p 9532 3.查看这个线程所有系统调用:strace -p 10017 不停循环输出Connection timed out,让开发查看问题 原文地址:https://www.cnblogs.com/chenjw-note/p/8370679.html

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running

线上Java程序导致服务器CPU占用率过高的问题排除过程

博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高. 2.CPU占用过高问题定位 2.1.定位问题进程 使用top命令查看资源占用情况,发现pid为14063的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8% [[