新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 软件技术 > 操作系统 > linux

Linux IO磁盘篇整理小记

时间:2019-08-13 10:28:43  来源:  作者:
作者:朱小厮
来源:https://www.jianshu.com/p/76ca793daf1d

一、概述

本篇起源于对Kafka的一个问题排查,大致的原因是达到磁盘性能瓶颈。在追踪问题的时候用到IOStat -x这命令,详细示例如下:

Linux IO磁盘篇整理小记

 

 

可以看到%idle(%idle小于70%说明IO压力已经比较大了)和%util的值都处于非正常状态。不过这里并不讲述Kafka的问题排查过程,反而是来讲述下IO指标的一些知识。每次遇到需要查看磁盘相关信息的时候,一些指标都会或多或少的遗忘,还要翻阅各种资料了解,故这里对相关的信息做一个相关的整理,在巩固相关知识点的同时也方便以后的查阅。

上面示例中的各个指标的含义分别为:

avg-cpu说明:

%user:在用户级别运行所使用的CPU的百分比。

%nice:带nice值(和进程优先级相关)的用户模式下运行所使用的CPU的百分比。

%system:在系统级别运行所使用CPU的百分比。

%iowait:CPU等待IO完成的时间百分比。(单个iowait指标值偏高并不能说明磁盘存在IO瓶颈,下面会有详述。)

%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间的百分比。

%idle:CPU空闲时间的百分比。(idle值高,表示CPU较空闲。)

device说明:

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

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

r/s:每秒完成的读IO设备的次数。即rio/s

w/s:每秒完成的写IO设备的次数。即wio/s

rsec/s:每秒读扇区数。即rsect/s(每个扇区大小为512B。)

wsec/s:每秒写扇区数。即wsect/s

avgrq-sz:平均每次设备IO操作的数据大小(扇区);平均单次IO大小。

avgqu-sz:平均IO队列长度。

await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间;平均IO响应时间(毫秒)。

svctm:平均每次设备IO操作的服务时间(毫秒)。

%util:一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比。

正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。await值的大小一般取决于svctm的值和IO队列的长度以及IO请求模式,如果scvtm比较接近await,说明IO几乎没有等待时间;如果await远大于svctm,说明IO请求队列太长,IO响应太慢,则需要进行必要优化。(可以看完下面一节再来回顾这段内容。)

如果%util接近100%,说明产生的IO请求太多,IO系统已经满负荷,该磁盘可能存在瓶颈。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 泛洪,如果avgqu-sz比较大,则说明有大量IO在等待。

二、相关原理

对于await, svctm以及%util等,光从概念上来说,比较晦涩,可以通过下图的磁盘IO流程来加深理解:

Linux IO磁盘篇整理小记

 

 

(此图来源于遗产流....重新画了一遍)

磁盘IO场景

1. 用户调用标准C库进行IO操作,数据流为:应用程序buffer->C库标准IObuffer->文件系统page cache->通过具体文件系统到磁盘。

2. 用户调用文件IO,数据流为:应用程序buffer->文件系统page cache->通过具体文件系统到磁盘。

3. 用户打开文件时使用O_DIRECT,绕过page cache直接读写磁盘。

4. 用户使用类似dd工具,并使用direct参数,绕过系统cache与文件系统直接写磁盘。

发起IO请求请的步骤简析(以最长链路为例)

写操作:

1. 用户调用fwrite把数据写C库标准IObuffer后就返回,即写操作通常是个异步操作。

2. 数据到C库标准IObuffer后,不会立即刷新到磁盘,会将多次小数据量相邻写操作先缓存起来合并,最终调用write函数一次性写入(或者将大块数据分解多次write调用)page cache。

3. 数据到page cache后也不会立即刷新到磁盘,内核有pdflush线程在不停的检测脏页,判断是否要写回到磁盘中,如果是则发起磁盘IO请求。

读操作:

1. 用户调用fread到C库标准IObuffer读取数据,如果成功则返回,否则继续。

2. 到page cache读取数据,如果成功则返回,否则继续。

3. 发起IO请求,读取到数据后缓存buffer和C库标准IObuffer并返回。可以看出,读操作是同步请求。

IO请求处理

1. 通用块层根据IO请求构造一个或多个bio结构并提交给调度层。bio结构描述对一个磁盘扇区读/写操作。

2. 调度器将bio结构进行排序和合并组织成队列且确保读写操作尽可能理想:将一个或多个进程的读操作合并到一起读,将一个或多个进程的写操作合并到一起写,尽可能变随机为顺序(因为随机读写比顺序读写要慢),读必须优先满足,而写也不能等太久。

IO调度算法

linux的IO调度器有时也称之为磁盘调度器,工作机制是控制块设备的请求队列,确定队列中那些IO的优先级更高以及何时下发IO到块设备,以此来减少磁盘寻到时间,从而提高系统的吞吐量。目前Linux共有如下几种IO调度算法:

1. NOOP

NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求。

假设有如下的io请求序列:

100,500,101,10,56,1000

NOOP将会按照如下顺序满足:

100(101),500,10,56,1000

2、CFQ

CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。

假设有如下的io请求序列:

100,500,101,10,56,1000

CFQ将会按照如下顺序满足:

100,101,500,1000,10,56

CFQ是默认的磁盘调度算法,对于通用服务器来说最好的选择。它视图均匀地分布对IO带宽的访问。CFQ为每个进程单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,各队列之间的调度使用时间片来调度,以此来保证每个进程都能被很好的分配到IO带宽。IO调度器每次执行一个进程的4次请求。在传统的SAS盘上,磁盘寻道花去了绝大多数的IO响应时间。CFQ的出发点是对IO地址进行排序,以尽量少的磁盘旋转次数来满足尽可能多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提高了。但是相比于NOOP的缺点是,先来的IO请求并不一定能被满足,可能会出现饿死的情况。

3、DEADLINE

DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:

FIFO(Read) > FIFO(Write) > CFQ

4、ANTICIPATORY

CFQ和DEADLINE考虑的焦点在于满足零散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每个读IO都设置了6ms的等待时间窗口。如果在这6ms内OS收到了相邻位置的读IO请求,就可以立即满足。 anticipatory 算法通过增加等待时间来获得更高的性能,假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流(相当于给随机读写变顺序读写),使用这个原理来使用读取写入的延时换取最大的读取写入吞吐量.适用于大多数环境,特别是读取写入较多的环境。

不同的磁盘调度算法(以及相应的IO优化手段)对Kafka这类依赖磁盘运转的应用的影响很大,建议根据不同的业务需求来测试选择合适的磁盘调度算法(以后的文章中会有相关的测试介绍)。

查看设备当前的IO调度器:cat /sys/block/{DEVICE-NAME}/queue/scheduler。其中{DEVICE-NAME}指的是磁盘设备的名称,即文章开头iostat -x中Device下方的vda,vdb等。

举例:

[root@hidden ~]# cat /sys/block/vda/queue/scheduler
noop anticipatory deadline [cfq]

修改当前的IO调度器: echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler。其中{SCHEDULER-NAME}取值为noop、anticipatory、deadline、cfq其中之一。

举例:

[root@hidden ~]# echo noop > /sys/block/vda/queue/scheduler 
[root@hidden ~]# cat /sys/block/vda/queue/scheduler
[noop] anticipatory deadline cfq

以上设置重启之后会失效,如果要想重启后配置仍然生效,需要在内核启动参数中将elevator={SCHEDULER-NAME}写入/boot/grub/menu.lst文件中。在修改这个文件之前最好先备份一份,然后将elevator={SCHEDULER-NAME}添加到文件末尾即可。

三、iowait

单独拎出iowait来说明是因为很多人对这个指标有一定的误区,包括笔者也经常把iowait和await混淆起来

。顾名思义,就是系统因为io导致的进程wait。再深一点讲就是:这时候系统在做IO,导致没有进程在干活,cpu在执行idle进程空转,所以说iowait的产生要满足两个条件,一是进程在等IO,二是等IO时没有进程可运行。

常用的top命令中也有iowait的指标展示(%wa就是%iowait),示例如下:

Linux IO磁盘篇整理小记

 

 

对 iowait 常见的误解有两个:1. 误以为 iowait 表示CPU不能工作的时间;2. 误以为 iowait 表示I/O有瓶颈问题。

iowait 的首要条件就是CPU空闲,既然空闲当然就可以接受运行任务,只是因为没有进程可以运行,CPU才进入空闲状态的。那为什么没有进程可以运行呢?因为进程都处于休眠状态、在等待某个特定事件:比如等待定时器、或者来自网络的数据、或者键盘输入、或者等待I/O操作完成,等等。iowait的升高并不能证明等待IO进程的数量增多了,也不能证明等待IO的总时间增加了。例如,在CPU繁忙期间发生的I/O,无论IO是多还是少,iowait都不会变;当CPU繁忙程度下降时,有一部分IO落入CPU空闲时间段内,导致iowait升高。再比如,IO的并发度低,iowait就高;IO的并发度高,iowait可能就比较低。所以iowait 所含的信息量非常少,它是一个非常模糊的指标,如果看到 iowait 升高,还需检查I/O量有没有明显增加,相应的一些指标有没有明显增大,应用有没有感觉变慢,如果都没有,就没什么好担心的。

Plus: 可以使用iotop命令来查找引起高iowait对应的进程。查看CPU使用率及负载的一些命令有:top、vmstat、mpstat、uptime等。



Tags:Linux   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
虚拟内存:第一层理解1. 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构2. 一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝...【详细内容】
2019-12-26   Linux  点击:(2)  评论:(0)  加入收藏
Vim作为使用最广泛的文本编辑器之一,在编程的世界中,一直流传着一个关于它的神秘问题,知道答案的人寥寥无几,却又难以启齿,那就是:怎么退出Vim?据说,很多程序员就算退休了,也没有退出...【详细内容】
2019-12-25   Linux  点击:(5)  评论:(0)  加入收藏
看日志报出的错误,"It is required that your private key files are NOT accessible by others",翻译就是需要私钥文件不能被其他人所访问。私钥是访问linux服务器的凭证,如果...【详细内容】
2019-12-24   Linux  点击:(8)  评论:(0)  加入收藏
SCP(安全复制,Secure Copy)是 Linux 和 Unix 之类的系统中的命令行工具,用于通过网络安全地跨系统传输文件和目录。-- Pradeep Kumar(作者)SCP( 安全复制(Secure Copy))是 Linux 和...【详细内容】
2019-12-13   Linux  点击:(1)  评论:(0)  加入收藏
密码管理器是创建唯一密码并安全存储它们的有用工具,这样你无需记住密码。了解一下适用于 Linux 桌面的最佳密码管理器。-- Ankush Das(作者)密码无处不在。网站、论坛、Web...【详细内容】
2019-11-03   Linux  点击:(0)  评论:(0)  加入收藏
原文地址:https://mp.weixin.qq.com/s/BmBM65_uO3zYND7KUVI56g作者:占小狼记得当初刚找工作时,面试官问了很多操作系统方面的知识: 你了解操作系统原理吗? Linux 环境会部署吗? 底...【详细内容】
2019-12-23   Linux  点击:(1)  评论:(0)  加入收藏
使用 GNOME 桌面可以让你在文字中轻松加入 emoji。-- Seth Kenlon(作者) emoji 是潜藏在 Unicode 字符空间里的有趣表情图,它们已经风靡于整个互联网。emoji 可以用来在社交媒...【详细内容】
2019-12-23   Linux  点击:(6)  评论:(0)  加入收藏
该脚本可防止来自 监控工具 的警报,因为我们会在填满磁盘空间之前删除旧的日志文件。-- Magesh Maruthamuthu(作者)磁盘使用率 监控工具能够在达到给定阈值时提醒我们。但它们...【详细内容】
2019-10-22   Linux  点击:(1)  评论:(0)  加入收藏
你可能不知道你使用过 Openbox 桌面:尽管 Openbox 本身是一个出色的窗口管理器,但它还是 LXDE 和 LXQT 等桌面环境的窗口管理器“引擎”,它甚至可以管理 KDE 和 GNOME。除了作为多个桌面的基础之外...【详细内容】
2019-12-20   Linux  点击:(8)  评论:(0)  加入收藏
如果您是Linux的新手,那么一些常见错误很可能会给您带来麻烦。提前了解它们,您就可以再逐渐熟悉Linux时避免出现重大问题。 1 从不同来源安装软件Linux 发行版一般都会有默认...【详细内容】
2019-12-20   Linux  点击:(6)  评论:(0)  加入收藏
转自 | talkwithtrend作者 | db2haodbshell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果。一、逻辑运算符1、逻辑卷标...【详细内容】
2019-12-17   Linux  点击:(13)  评论:(0)  加入收藏
本文是 24 天 Linux 桌面特别系列的一部分。GNOME 是大多数现代 Linux 发行版的默认桌面,它干净、简单、组织良好。-- Seth Kenlon(作者) GNOME 项目理所应当是 Linux 桌面的...【详细内容】
2019-12-17   Linux  点击:(10)  评论:(0)  加入收藏
0x00 宏的基本知识// object-like#define 宏名 替换列表 换行符//function-like#define 宏名 ([标识符列表]) 替换列表 换行符替换列表和标识符列表都是将字符串 token 化以...【详细内容】
2019-12-17   Linux  点击:(11)  评论:(0)  加入收藏
1. 首先查看网络连接数netstat -an或者 ss -s 进行统计,如果带上-p参数的话当连接数比较多的时候就会比较慢或者查看系统:/proc/net/sockstat:sockets: used 160TCP: inuse 0...【详细内容】
2019-12-17   Linux  点击:(6)  评论:(0)  加入收藏
假设你想要一个轻量级桌面环境,它只需要能在屏幕上显示图形、四处移动窗口,而别无杂物。你会发现传统桌面的通知、任务栏和系统托盘会妨碍你的工作。你想主要通过终端工作,但也希望运行图形应用。如果听起来像是你的想法...【详细内容】
2019-12-13   Linux  点击:(16)  评论:(0)  加入收藏
Linux Cockpit 是一个基于 Web 界面的应用,它提供了对系统的图形化管理。看下它能够控制哪些。-- Sandra Henry-stocker如果你还没有尝试过相对较新的 Linux Cockpit,你可能...【详细内容】
2019-03-03   Linux  点击:(5)  评论:(0)  加入收藏
这里是最好的 Kali Linux 工具列表,它们可以让你评估 Web 服务器的安全性,并帮助你执行黑客渗透测试。-- Ankush Das(作者)如果你读过 Kali Linux 点评 ,你就知道为什么它被认为...【详细内容】
2019-12-11   Linux  点击:(19)  评论:(0)  加入收藏
当你需要在 shell 脚本中创建邮件时,就需要用到命令行发送邮件的知识。Linux 中有很多命令可以实现发送邮件。-- Magesh Maruthamuthu(作者)当你需要在 shell 脚本中创建邮件...【详细内容】
2019-12-11   Linux  点击:(14)  评论:(0)  加入收藏
本教程教你怎样在 Linux 终端快速检测一个网站是否宕机。-- Magesh Maruthamuthu(作者) 你可能已经了解了一些类似的命令,像 ping、curl 和 wget。我们在本教程中又加入了一些...【详细内容】
2019-12-10   Linux  点击:(10)  评论:(0)  加入收藏
linux 启动有个概念就是runlevel,但是很久都不知道runlevel为何物,搜了点资料,总结下 0:关机状态 1:单用户模式 2:字符界面的多用户模式(不支持网络) 3:字符界面的多用户模式(运行...【详细内容】
2019-12-10   Linux  点击:(18)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条