io wait linux,另辟蹊径-诊断工具之 IO wait

导读

最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端、本机都没问题,但是没想到上了第二份日志之后,问题来了:

1、问题:

集群中的某台机器 top 看到负载巨高,集群中的机器硬件配置一样,部署的软件都一样,却单单这一台负载有问题,初步猜测可能硬件有问题了。

同时,我们还需要把负载有异常的罪魁祸首揪出来,到时候从软件、硬件层面分别寻找解决方案。

6497ee66cc08a18bac2e86c1da03f3a0.png

2、排查:

从 top 中可以看到 load average 偏高,%wa 很高,%us 偏低:

9ca55f4193c51c8b31c4721812d942ba.png

从上图我们大致可以推断 IO 遇到了瓶颈,下面我们可以再用相关的 IO 诊断工具,具体的验证排查下。

常用组合方式有如下几种:

•用vmstat、sar、iostat检测是否是CPU瓶颈

•用free、vmstat检测是否是内存瓶颈

•用iostat、dmesg 检测是否是磁盘I/O瓶颈

•用netstat检测是否是网络带宽瓶颈

2.1 vmstat

vmstat命令的含义为显示虚拟内存状态(“Virtual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。

a84febd8db9b653027690be96b87dd1c.png

它的相关字段说明如下:

Procs(进程)

•r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)

•b: 等待IO的进程数量,也就是处在非中断睡眠状态的进程数,展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了

Memory(内存)

•swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。

•free: 空闲物理内存大小。

•buff: 用作缓冲的内存大小。

•cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap(交换区)

•si: 每秒从交换区写到内存的大小,由磁盘调入内存。

•so: 每秒写入交换区的内存大小,由内存调入磁盘。

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(输入输出)

(现在的Linux版本块的大小为1kb)

•bi: 每秒读取的块数

•bo: 每秒写入的块数

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统)

•in: 每秒中断数,包括时钟中断。

•cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU

(以百分比表示)

•us: 用户进程执行时间百分比(user time)。us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

•sy: 内核系统进程执行时间百分比(system time)。sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

•wa: IO等待时间百分比。wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

•id: 空闲时间百分比

从 vmstat 中可以看到,CPU大部分的时间浪费在等待IO上面,可能是由于大量的磁盘随机访问或者磁盘的带宽所造成的,bi、bo 也都超过 1024k,应该是遇到了IO瓶颈。

2.2 iostat

下面再用更加专业的磁盘 IO 诊断工具来看下相关统计数据。

c4c73d3b6f96ea5a7e445ebd2ae0a359.png

它的相关字段说明如下:

•rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s

•wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s

•r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s

•w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s

•rsec/s: 每秒读扇区数。即 delta(rsect)/s

•wsec/s: 每秒写扇区数。即 delta(wsect)/s

•rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)

•wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算)

•avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)

•avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。

•await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)

•svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)

•%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)

可以看到两块硬盘中的 sdb 的利用率已经 100%,存在严重的 IO 瓶颈,下一步我们就是要找出哪个进程在往这块硬盘读写数据。

2.3 iotop

da222c92017c3a971e2d8c735e5c66e3.png

根据 iotop 的结果,我们迅速的定位到是 flume 进程的问题,造成了大量的 IO wait。

但是在开头我已经说了,集群中的机器配置一样,部署的程序也都 rsync 过去的一模一样,难道是硬盘坏了?

这得找运维同学来查证了,最后的结论是:

Sdb为双盘raid1,使用raid卡为“LSI Logic / Symbios Logic SAS1068E”,无cache。近400的IOPS压力已经达到了硬件极限。而其它机器使用的raid卡是“LSI Logic / Symbios Logic MegaRAID SAS 1078”,有256MB cache,并未达到硬件瓶颈,解决办法是更换能提供更大IOPS的机器,比如最后我们换了一台带 PERC6/i 集成RAID控制器卡的机器。需要说明的是,raid信息是在raid卡和磁盘固件里面各存一份,磁盘上的raid信息和raid卡上面的信息格式要是匹配的,否则raid卡识别不了就需要格式化磁盘。

IOPS本质上取决于磁盘本身,但是又很多提升IOPS的方法,加硬件cache、采用RAID阵列是常用的办法。如果是DB那种IOPS很高的场景,现在流行用SSD来取代传统的机械硬盘。

不过前面也说了,我们从软硬件两方面着手的目的就是看能否分别寻求代价最小的解决方案:

知道硬件的原因了,我们可以尝试把读写操作移到另一块盘,然后再看看效果:

e80deb72a6074d2cea2594ff2436ca79.png

3、最后的话:另辟蹊径

其实,除了用上述专业的工具定位这个问题外,我们可以直接利用进程状态来找到相关的进程。

我们知道进程有如下几种状态:

•D uninterruptible sleep (usually IO)

•R running or runnable (on run queue)

•S interruptible sleep (waiting for an event to complete)

•T stopped, either by a job control signal or because it is being traced.

•W paging (not valid since the 2.6.xx kernel)

•X dead (should never be seen)

•Z defunct ("zombie") process, terminated but not reaped by its parent.

其中状态为 D 的一般就是由于 wait IO 而造成所谓的”非中断睡眠“,我们可以从这点入手然后一步步的定位问题:

6f43a13b238267f6dfb25656978b2606.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle第二天

Oracle第二天 整体安排(3天) 第一天:Oracle的安装配置(服务端和客户端),SQL增强(单表查询)。 第二天:SQL增强(多表查询、子查询、伪列-分页)&…

linux搭建虚拟化平台报告,部署KVM虚拟化平台------搭建(示例代码)

一 、部署KVM虚拟化平台hyper-v是windows中的虚拟化1、KVM模块直接整合在Linux内核中,kvm是内核模块,虚拟机与kvm模块之间为管理工具2、KVM组成1.KVM Driver---虚拟机创建---虚拟机内存分配---虚拟CPU寄存器读写---虚拟CPU运行2.QEMU (经过简化与修改)--…

linux 选择文件指定的行数据类型,06练习题

1.如何删除一个非空子目录/tmp? BA. del /tmp/*B. rm -rf /tmpC. rm -Ra /tmp/*D. rm -rf /tmp/*2.存放linux默认系统日志文件是 BA./var/log/dmesg #系统启动时日志B./var/log/messages #系统日志C./var/log/secure #登录相关 安全3.用命令ls -l显示出来文件txt的描…

C#多线程编程

C#多线程编程 一、使用线程的理由 1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。 2、可以使用线程来简化编码。 3、可以使用线程来实现并发执行。 二、基本知识 1、进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程…

《DSP using MATLAB 》示例Example6.3

代码: C0 0; B1 [2 4; 3 1]; A1 [1 1 0.9; 1 0.4 -0.4]; B2 [0.5 0.7; 1.5 2.5; 0.8 1]; A2 [1 -1 0.8; 1 0.5 0.5; 1 0 -0.5]; [b1, a1] par2dir(C0, B1, A1)[b2, a2] par2dir(C0, B2, A2)b conv(b1, b2) % Overall direct form numerator a conv(a1…

简单说明c语言程序步骤,C语言的入门简介和三个简单的C语言程序详细说明

学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成…

java入门,学习笔记

编译 通过javac编译java程序,会编译出一个后缀为class的文件,我们再通过java虚拟机(jvm)执行编译后的java程序。 在java中始终有一个main函数,它作为程序的入口,程序从这个入口开始执行一直到结束。 public…

linux命令之ifconfig详细解释

依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置。 1.命令格式: ifconfig [网络设备] [参数] 2.命令功能: ifconfig 命令用来查看和配置网…

loadrunner controller:实时查看VUser的运行情况

1) 如下图,在Run标签页,点击“Vusers...”打开Vuser窗口; 2) 如下图选中一个Vuser点击按钮可以打开Run-Time Viewer窗口,RTV窗口页面显示的就是该Vuser当前的操作; 3) 如下图所示,…

【二色汉诺塔 】

/* 二色汉诺塔 */#include <stdio.h>void hanoi(int disks, char sources, char temp, char target) {if(disks 1){printf("move disk from %c to %c \n", sources, target);printf("move disk from %c to %c \n", sources, target);}else{hanoi(d…

c语言凸包算法,基于C语言的凸包算法实现

基于C语言的凸包算法实现非计算机专业&#xff0c;代码有些的不好的地方&#xff0c;大佬轻喷^ _ ^根据要求&#xff0c;需要使用C语言实现凸包算法——Graham扫描法&#xff0c;本文将从算法理解、实现思路、遇到的问题及其解决方案三个方面来阐述实现过程。算法理解凸包算法G…

VS Code 使用小技巧

所有插件查找地址&#xff08;https://marketplace.visualstudio.com/&#xff09; 编码快捷方式&#xff08;http://docs.emmet.io/cheat-sheet/&#xff09; 安装插件出现 错误unable to verify the first certificate &#xff08;无法确认第一证书&#xff09;   解决方…

android 怎么自定义任务栈,Android中的Activity详解--启动模式与任务栈

目录Activity生命周期任务栈启动模式Intent FlagtaskAffinity属性1.Activityactivity的简单介绍就不写了&#xff0c;作为最常用的四大组件之一&#xff0c;肯定都很熟悉其基本用法了。2.生命周期首先&#xff0c;是都很熟悉的一张图&#xff0c;即官方介绍的Activity生命周期图…

SQL Server--疑难杂症之坑爹的Windows故障转移群集

-- 估计是春节前最后一次写博客&#xff0c;也估计是本年值班最后一次踩雷&#xff0c;感叹下成也SQL SERVER&#xff0c;败也SQL SERVER。 -- 场景描述&#xff1a; 操作系统版本 &#xff1a;Windows Server 2012 数据中心版本 数据库版本 &#xff1a;SQL SERVER 2012 企业版…

android handle 阻塞,Android全面解析之Handler机制:常见问题汇总

主线程为什么不用初始化Looper&#xff1f;答&#xff1a;因为应用在启动的过程中就已经初始化主线程Looper了。每个java应用程序都是有一个main方法入口&#xff0c;Android是基于Java的程序也不例外。Android程序的入口在ActivityThread的main方法中&#xff1a;// 初始化主线…

UML中的6大关系(关联、依赖、聚合、组合、泛化、实现)

UML定义的关系主要有六种&#xff1a;依赖、类属、关联、实现、聚合和组合。这些类间关系的理解和使用是掌握和应用UML的关键&#xff0c;而也就是这几种关系&#xff0c;往往会让初学者迷惑。这里给出这六种主要UML关系的说明和类图描述&#xff0c;一看之下&#xff0c;清晰明…

性能调优-硬盘方面,操作系统方面,文件系统方面

硬盘对数据库性能的影响 传统机械硬盘 当前大多数数据库使用的都是传统的机械硬盘。机械硬盘的技术目前已非常成熟&#xff0c;在服务器领域一般使用SAS或SATA接口的硬盘。服务器机械硬盘开始向小型化转型&#xff0c;目前已经有大量2.5寸的SAS机械硬盘。 机械硬盘有两个重要的…

chrome Android 80,Chrome OS 80将为Chromebook带来侧载Android应用的支持

如需体验这项功能&#xff0c;需在启动 Crostini 容器时加上一行特殊的命令 —— 从 Chromebook 命令行启动时&#xff0c;请加上 –enable-features ArcAdbSideloading 。最终&#xff0c;我们希望这回成为一项明示的标记(flags)功能。如变更日志所述&#xff0c;用户可通过托…

android 日历仿IOS,基于Android week view仿小米和iphone日历效果

前言最近由于项目需求&#xff0c;要做一个仿小米日历的功能&#xff0c;下面显示一天的日程&#xff0c;header以周为单位进行滑动&#xff0c;github上找了很久也没有找到合适的&#xff0c;但找到一相近的开源项目Android-week-view&#xff0c;它不是我们项目所需要的效果&…

1、管理员登录中间件和注销

1、根据session去判断用户是否登录&#xff0c;登录后才可以进index首页&#xff0c;否则返回login页面&#xff0c;借助中间件 (1)修改路由 Route::group([middleware > [web,admin.login],prefix>admin,namespace>Admin], function () { //注册一个中间件admin.logi…