[工具]iostat
本文主要分析了Linux的iostat命令的源码
iostat源码共563行,应该算是Linux系统命令代码比较少的了。源代码中主要涉及到如下几个Linux的内核文件:
1、/proc/diskstats——该文件是内核2.6以上的系统中的,记录了从Linux系统启动之后,所有磁盘的相关信息,该文件中每个参数代表的意义可以自行google或者baidu,或者见博客:/proc/diskstats参数含义。
2、/proc/partitions——partitions是2.4版本的系统中的,其含义基本与diskstats一样。
3、/proc/stat——stat记录了自系统启动之后,CPU的信息,具体含义可以参考博客:性能测试进阶指南——基础篇一(系统资源的讲解)
4、/proc/cpuinfo——iostat主要是从该内核文件中获取cpu的核心数的。
iostat源码解析
第一步,从/proc/cpuinfo中获取系统的cpu核心数,通过计算该文件中processor出现的次数便可以得到cpu的核心数;
第二步,通过判断文件/proc/diskstats和/proc/partitions是否存在,从而判断linux的内核是2.4版本还是2.6版本:如果/proc/diskstats文件存在,则为2.6版本;否则判断/proc/partitions是否存在,若存在,则为2.4版本;
第三部,分析iostat命令输入的参数,每个参数的功能可以在上一篇博客中找到:性能测试进阶指南——基础篇之磁盘IO
第四步,初始化,获取磁盘名称。以内核2.6为例,读取文件/proc/diskstats
104 0 cciss/c0d0 49787 19805 1597284 159946 20172754 28596938 390157514 1583532 0 1352168 1737502
第一个参数104和第二个参数0分别代表了major和minor,major是8的倍数,minor是16的倍数,只要同时符合这两个的条件,其对应的第三个参数cciss/c0d0便是所需要获取的磁盘名称;
第五步,进入主循环:
(1) 获取/proc/diskstats中每个磁盘的数据,例如:
104 0 cciss/c0d0 49787 19805 1597284 159946 20172754 28596938 390157514 1583532 0 1352168 1737502
每个参数对应的值为
104——major
0——minor
49787——rd_ios
19805——rd_merges
1597284——rd_sectors
159946——rd_ticks
20172754——wr_ios
28596938——wr_merges
390157514——wr_sectors
1583532——wr_ticks
1352168——ticks
1737502——aveq
(2) 获取/proc/stat中的数据,计算cpu的平均时间:分别获取cpu的user时间,nice时间,system时间,idle时间,iowait时间。计算中将nice时间并入user时间,将irq时间和softirq时间并入system时间。此处只计算cpu的平均和状态,不计算每隔核单独的状态。
(3)计算deltams时间,其中HZ是Linux的系统频率。
deltams = 1000.0 * ((new_cpu.user + new_cpu.system + new_cpu.idle + new_cpu.iowait) - (old_cpu.user + old_cpu.system + old_cpu.idle + old_cpu.iowait)) / ncpu / HZ; `
(4)计算IO
blkio.rd_ios = new_blkio[p].rd_ios - old_blkio[p].rd_ios;
blkio.rd_merges = new_blkio[p].rd_merges - old_blkio[p].rd_merges;
blkio.rd_sectors = new_blkio[p].rd_sectors - old_blkio[p].rd_sectors;
blkio.rd_ticks = new_blkio[p].rd_ticks - old_blkio[p].rd_ticks;
blkio.wr_ios = new_blkio[p].wr_ios - old_blkio[p].wr_ios;
blkio.wr_merges = new_blkio[p].wr_merges - old_blkio[p].wr_merges;
blkio.wr_sectors = new_blkio[p].wr_sectors - old_blkio[p].wr_sectors;
blkio.wr_ticks = new_blkio[p].wr_ticks - old_blkio[p].wr_ticks;
blkio.ticks = new_blkio[p].ticks - old_blkio[p].ticks;
blkio.aveq = new_blkio[p].aveq - old_blkio[p].aveq;
n_ios = blkio.rd_ios + blkio.wr_ios;
n_ticks = blkio.rd_ticks + blkio.wr_ticks;
n_kbytes = (blkio.rd_sectors + blkio.wr_sectors) / 2.0;
queue = blkio.aveq / deltams;
size = n_ios ? n_kbytes / n_ios : 0.0;
wait = n_ios ? n_ticks / n_ios : 0.0;
svc_t = n_ios ? blkio.ticks / n_ios : 0.0;
busy = 100.0 * blkio.ticks / deltams;
if (busy > 100.0) busy = 100.0;
rd_sectors和wr_sectors是扇区数,如果需要换算成KB等单位,需要除以2,1KB=2*512Bytes。512Bytes为1个扇区数。
(5)计算CPU
cpu.user = new_cpu.user - old_cpu.user;
cpu.system = new_cpu.system - old_cpu.system;
cpu.idle = new_cpu.idle - old_cpu.idle;
cpu.iowait = new_cpu.iowait - old_cpu.iowait;
total = (cpu.user + cpu.system + cpu.idle + cpu.iowait) / 100.0;
printf("%3.0f %3.0f ", cpu.user / total, cpu.system / total);
if (kernel == 6) printf("%3.0f ", cpu.iowait / total);
printf("%3.0f", cpu.idle / total);
(6) Save old stats:
old_blkio[p] = new_blkio[p];
old_cpu = new_cpu;
每隔采样时间循环执行第五步。
从源码中可以看出,第一次获取的时候,是没有old stats的,所有的old stats值均为0,即iostat在第一次输出的值为Linux启动之后至当前时间的一个平均状态值,在之后的输出值则为系统当前的实时磁盘I/O信息和CPU
[工具]iostat的更多相关文章
- Linux IO时事检测工具iostat
Linux IO时事检测工具iostat iostat命令用于检测linux系统io设备的负载情况,运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间来获得所需的统 ...
- [Linux 性能检测工具]IOSTAT
IOSTAT NAME: Iostat, 报告CPU的统计,和 I/O的统计. 语法: iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k ...
- 性能优化工具---iostat
Iostat (参考 man iostat) 可选项: -c为汇报CPU的使用情况: -d为汇报磁盘的使用情况: -k表示每秒按kilobytes字节显示数据: -t为打印汇报的时间: -v表示打印出 ...
- Java 性能调优工具
CPU使用率工具: vmstat 检查应用性能时,应该首先审查CPU时间.代码优化的目的是提升而不是降低(更短时间段内的)CPU的使用率.在试图深入优化应用前,应该先弄清楚为何CPU使用率低.磁盘使用 ...
- MMAP和DIRECT IO区别
看完此文,题目不言自明.转自 http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关 ...
- 转 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- MMAP和DIRECT IO区别【转】
转自:http://www.cnblogs.com/zhaoyl/p/5901680.html 看完此文,题目不言自明.转自 http://blog.chinaunix.net/uid-2710571 ...
- Linux系统性能和使用活动监控工具 sysstat
Sysstat是一个非常方便的工具,它带有众多的系统资源监控工具,用于监控系统的性能和使用情况.我们在日常使用的工具中有相当一部分是来自sysstat工具包的.同时,它还提供了一种使用cron表达式来 ...
- 一些实用但不为人知的Unix命令
浮现在脑海的很多 Linux命令,其中一些不为人知,另一些则很常见,如下: xargs or parallel: 并行运行一些程序,命令有很多的选项 sed and awk: 广为人知并且非常有用的处 ...
随机推荐
- 寒城攻略:Listo 教你用 Swift 写IOS UI 项目生活记事本
刚才用 Swift 写了一个记事本的应用,仅仅是简单的 UI 方向的开发,先来上产品的界面: 如今 Listo 给分享源码: 共同进步,开源中国.转载请声明出处
- 解析UML九种图
UML作为设计工具,重在实践上,而这就离不开九种图了.绘图是在看完视频以后进行的,刚開始绘图的时候脑袋懵懵的,不知道该从哪下手,于是就在绘图之前再次的学习了一下这九种图和四种关系.理了 ...
- ios MetalPerformanceShaders 使用总结
MPSCNNConvolution 1.初始化时传人 UnsafePointer<Float> 时要传入w,不能是 &(w[0]).否则w其实传入失败,卷积的结果是nan或inf. ...
- Cache-control no-transform Robots Exclusion Protocol
蜘蛛协议 <今日头条>支持蜘蛛协议(Robots Exclusion Protocol)"ToutiaoSpider",同时,我们尊重所有的网络媒体,如媒体不希望内容被 ...
- 20170620_javaweb_小结
01.session失效的方式 02. session和cookie的区别 03.jsp九大内置对象,意义 以及对应的java类 04.转发和重定向 05.jsp的执行过程 和 生命周期 06.实现s ...
- BMP图片的解析,关于压缩方式
在做一个显示bmp图片到lcd屏的时候,发现有些bmp图显示不对. 同样是16bit bmp却有差异. 就查了一下格式. bmp文件格式 位图文件的组成 结构名称 符号 位图文件头(bitmap-fi ...
- 51nod 1406 与查询
垃圾选手练dp 考虑对于一个数,能够把它表示出来也一定可以把它某些1的位变成0变成的数表示出来 那么用大的数更新小的,容易想到每次都把这个大的数的1个1的位变成0 但是这样还是会有重复的情况 比如10 ...
- 【POJ 3349】 Snowflake Snow Snowflakes
[题目链接] http://poj.org/problem?id=3349 [算法] 哈希 若两片雪花相同,则它们六个角上的和一定相同,不妨令 H(A) = sigma(Ai) % P ,每次只要到哈 ...
- 洛谷P2516 [HAOI2010]最长公共子序列
题目描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...
- HTML--文本域,支持多行文本输入
当用户需要在表单中输入大段文字时,需要用到文本输入域. 语法: <textarea rows="行数" cols="列数">文本</texta ...