初探diskstats
内核很多重要子系统均通过proc文件的方式,将自身的一些统计信息输出,方便最终用户查看各子系统的运行状态,这些统计信息被称为metrics。 直接查看metrics并不能获取到有用的信息,一般都是由特定的应用程序(htop/sar/iostat等)每隔一段时间读取相关metrics,并进行相应计算,给出更具用户可读性的输出。 常见的metrics文件有:
• cpu调度统计信息的/proc/stat
• cpu负载统计信息的/proc/loadavg
通用块设备层也有一个重要的统计信息
• /proc/diskstats内核通过diskstats文件,将通用块设备层的一些重要指标以文件的形式呈现给用户
首先来看下diskstats里面都有些什么,下面截取的是一个diskstats文件内容:
虽然如上面提到的,这些数字看上去完全没有规律。不过若想研究内核通用块设备层的统计实现方式,还是得一个一个字段的分析。
# cat /proc/diskstats
2 0 fd0 0 0 0 0 0 0 0 0 0 0 0
11 0 sr0 18 0 2056 98 0 0 0 0 0 90 98
8 0 sda 5941 81 508270 54421 2051 3068 49868 15639 0 13973 69944
8 1 sda1 159 0 9916 304 11 2 68 28 0 292 332
8 2 sda2 5751 81 495010 54034 2040 3066 49800 15611 0 13834 69529
253 0 dm-0 5662 0 485850 54998 5106 0 49800 31524 0 13807 86522
253 1 dm-1 90 0 4920 156 0 0 0 0 0 123 156
/proc/diskstats有11(从F4开始)个字段,以下内核文档解释了它们的含义https://www.kernel.org/doc/Documentation/iostats.txt,我重新表述了一下,注意除了字段#9(F12)之外都是累计值,从系统启动之后一直累加:
1. (rd_ios)读操作的次数。
2. (rd_merges)合并读操作的次数。如果两个读操作读取相邻的数据块时,可以被合并成一个,以提高效率。合并的操作通常是I/O scheduler(也叫elevator)负责的。
3. (rd_sectors)读取的扇区数量。
4. (rd_ticks)读操作消耗的时间(以毫秒为单位)。每个读操作从__make_request()开始计时,到end_that_request_last()为止,包括了在队列中等待的时间。
5. (wr_ios)写操作的次数。
6. (wr_merges)合并写操作的次数。
7. (wr_sectors)写入的扇区数量。
8. (wr_ticks)写操作消耗的时间(以毫秒为单位)。
9. (in_flight)当前未完成的I/O数量。在I/O请求进入队列时该值加1,在I/O结束时该值减1。
注意:是I/O请求进入队列时,而不是提交给硬盘设备时。
10. (io_ticks)该设备用于处理I/O的自然时间(wall-clock time)。
请注意io_ticks与rd_ticks(字段#4)和wr_ticks(字段#8)的区别,rd_ticks和wr_ticks是把每一个I/O所消耗的时间累加在一起,因为硬盘设备通常可以并行处理多个I/O,所以rd_ticks和wr_ticks往往会比自然时间大。而io_ticks表示该设备有I/O(即非空闲)的时间,不考虑I/O有多少,只考虑有没有。在实际计算时,字段#9(in_flight)不为零的时候io_ticks保持计时,字段#9(in_flight)为零的时候io_ticks停止计时。
11. (time_in_queue)对字段#10(io_ticks)的加权值。字段#10(io_ticks)是自然时间,不考虑当前有几个I/O,而time_in_queue是用当前的I/O数量(即字段#9 in-flight)乘以自然时间。虽然该字段的名称是time_in_queue,但并不真的只是在队列中的时间,其中还包含了硬盘处理I/O的时间。iostat在计算avgqu-sz时会用到这个字段。
以sda磁盘为例:
8 0 sda 5941 81 508270 54421 2051 3068 49868 15639 0 13973 69944
域 | Value | Quoted | 解释 |
F1 | 8 | major number | 此块设备的主设备号 |
F2 | 0 | minor mumber | 此块设备的次设备号 |
F3 | sda | device name | 此块设备名字 |
F4 | 5941 | reads completed successfully | 成功完成的读请求次数 |
F5 | 81 | reads merged | 读请求的次数 |
F6 | 508270 | sectors read | 读请求的扇区数总和 |
F7 | 54421 | time spent reading (ms) | 读请求花费的时间总和 |
F8 | 2051 | writes completed | 成功完成的写请求次数 |
F9 | 3068 | writes merged | 写请求合并的次数 |
F10 | 49868 | sectors written | 写请求的扇区数总和 |
F11 | 15639 | time spent writing (ms) | 写请求花费的时间总和 |
F12 | 0 | I/Os currently in progress | 次块设备队列中的IO请求数 |
F13 | 13973 | time spent doing I/Os (ms) | 块设备队列非空时间总和 |
F14 | 69944 | weighted time spent doing I/Os (ms) | 块设备队列非空时间加权总和 |
流程图
下图是Linux内核通用块设备层IO请求处理的完整流程,如图例所示,所有的统计相关处理均有用不同颜色标注。 在进行深入分析前,请大致浏览图片,对整个流程有一个大致印象。
更详细的内容,请阅读:http://ykrocku.github.io/blog/2014/04/11/diskstats/
初探diskstats的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- Koa框架教程
Node主要用在开发 Web 应用.这决定了使用 Node,往往离不开 Web 应用框架. Koa 就是一种简单好用的 Web 框架.它的特点是优雅.简洁.表达力强.自由度高.本身代码只有1000多行 ...
- Windows 查看程序占用的端口
一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知 ...
- Nginx配置日志格式记录cookie
Nginx配置日志格式记录cookie1. 一般用来做UV统计,或者获取用户token等. 配置方式: 在nginx的配置文件中有个变量:$http_cookie来获取cookie的信息.配置方式很 ...
- spring boot 2.0 源码分析(三)
通过上一章的源码分析,我们知道了spring boot里面的listeners到底是什么(META-INF/spring.factories定义的资源的实例),以及它是创建和启动的,今天我们继续深入分 ...
- SQL更改表架构
修改SQL架构: ALTER SCHEMA 新架构 TRANSFER 旧架构.对象名称
- 15.Generator 函数的语法
Generator 函数的语法 Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generat ...
- rabbitmq不同模式的交换机使用
交换机的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启用ack模式后,交换机找不到队列会返回错误.交换机有四种类型:Direct, topic, Headers and Fanout( ...
- SQL Server如何存储特殊字符、上标、下标
测试验证特殊符号能否存入数据库中: 其中,像一些普通单位符号比如“ ° ′"﹩ $ ﹠ & £¥ ‰ % ℃ ¤ ¢℉”可以正常录入没有问题,但是万分号“‱”之上就不可以了,录入后显 ...
- 利用jquery.backstretch插件,背景切换
//首页自动更换背景特效开始============================================1.引用文件<script src="jquery.js" ...
- asp后台读id设置样式
加runat=“server”