热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux性能测试工具之Disk(四)

Disks4.1iostatiostat(1)summarizesper-diskIOstatistics,providingmetricsforworkloadcharact

Disks


4.1 iostat

iostat(1) summarizes per-disk I/O statistics, providing metrics for workload characterization, utilization, and saturation.

The name “iostat” is short for “I/O statistics”, although it might have been better to call it “diskiostat” to reflect the type of I/O it reports.

root@ubuntu:~# iostat
Linux 5.4.0-59-generic (ubuntu) 2021年01月06日 _x86_64_ (2 CPU)avg-cpu: %user %nice %system %iowait %steal %idle0.96 0.07 1.04 0.57 0.00 97.37Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
loop0 0.01 0.06 0.00 0.00 338 0 0
loop1 0.01 0.06 0.00 0.00 348 0 0
loop10 0.00 0.00 0.00 0.00 8 0 0
loop2 0.01 0.18 0.00 0.00 1063 0 0
loop3 0.01 0.18 0.00 0.00 1072 0 0
loop4 0.01 0.06 0.00 0.00 341 0 0
loop5 0.01 0.18 0.00 0.00 1058 0 0
loop6 0.01 0.06 0.00 0.00 342 0 0
loop7 0.01 0.06 0.00 0.00 351 0 0
loop8 0.01 0.06 0.00 0.00 336 0 0
loop9 1.78 1.83 0.00 0.00 10784 0 0
sda 7.13 174.03 41.48 0.00 1023155 243849 0

%userCPU运行在用户态的百分比
%niceCPU处在带NICE值的用户模式下的时间百分比
%systemCPU运行在内核态的百分比
%iowaitCPU等待输入输出完成时间的百分比
%steal管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idleCPU空闲时间百分比
tps该设备每秒的传输次数(IOPS)
kB_read/s每秒从设备(drive expressed)读取的数据量
kB_wrtn/s每秒向设备(drive expressed)写入的数据量
kB_dscd/s每秒设备丢弃的数据量
kB_read读取的总数据量
kB_wrtn写入的总数据量
kB_dscd丢弃的总数据量

如果%iowait的值过高,表示硬盘存在I/O瓶颈。

如果%idle值高,表示CPU较空闲。

如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。

如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。


4.2 PSI

io压力

# cat /proc/pressure/io
some avg10=63.11 avg60=32.18 avg300=8.62 total=667212021
full avg10=60.76 avg60=31.13 avg300=8.35 total=622722632

4.3 pidstat

The Linux pidstat(1) tool prints CPU usage by default and includes a -d option for disk I/O statistics.

root@ubuntu:~# pidstat -d 2
Linux 5.4.0-59-generic (ubuntu) 2021年01月06日 _x86_64_ (2 CPU)16时44分08秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command16时44分10秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command16时44分12秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
16时44分14秒 0 353 0.00 70.00 0.00 0 systemd-journal16时44分14秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
16时44分16秒 0 353 0.00 24.00 0.00 0 systemd-journal16时44分16秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
16时44分18秒 0 313 0.00 2.00 0.00 0 jbd2/sda5-8
16时44分18秒 0 353 0.00 2.00 0.00 0 systemd-journal16时44分18秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
16时44分20秒 104 762 0.00 2.00 0.00 0 rsyslogd16时44分20秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command16时44分22秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
16时44分24秒 0 313 0.00 6.00 0.00 0 jbd2/sda5-8
16时44分24秒 0 353 0.00 2.00 0.00 0 systemd-journal
[...]

其中,kB_ccwr/s的含义是:

Number of kilobytes whose writing to disk has been cancelled by the task. This may occur when the task truncates some dirty pagecache. In this case, some IO which another task has been accounted for will not be happening.


4.4 perf

perf列出和block相关的事件

[root@localhost ~]# perf list 'block:*'List of pre-defined events (to be used in -e):block:block_bio_backmerge [Tracepoint event]block:block_bio_bounce [Tracepoint event]block:block_bio_complete [Tracepoint event]block:block_bio_frontmerge [Tracepoint event]block:block_bio_queue [Tracepoint event]block:block_bio_remap [Tracepoint event]block:block_dirty_buffer [Tracepoint event]block:block_getrq [Tracepoint event]block:block_plug [Tracepoint event]block:block_rq_complete [Tracepoint event]block:block_rq_insert [Tracepoint event]block:block_rq_issue [Tracepoint event]block:block_rq_remap [Tracepoint event]block:block_rq_requeue [Tracepoint event]block:block_sleeprq [Tracepoint event]block:block_split [Tracepoint event]block:block_touch_buffer [Tracepoint event]block:block_unplug [Tracepoint event]Metric Groups:

磁盘I/O延时

perf record -e block:block_rq_issue,block:block_rq_complete -a sleep 20
perf script --header > disk.txt
### 这样得出分析文件,但还需在手动计算,比如用awk等工具对文本进行处理

4.5 biolatency-bpfcc

这是直观的显示io latency的BCC工具。

usage: biolatency-bpfcc [-h] [-T] [-Q] [-m] [-D] [-F] [interval] [count]Summarize block device I/O latency as a histogrampositional arguments:interval output interval, in secondscount number of outputsoptional arguments:-h, --help show this help message and exit-T, --timestamp include timestamp on output-Q, --queued include OS queued time in I/O time-m, --milliseconds millisecond histogram-D, --disks print a histogram per disk device-F, --flags print a histogram per set of I/O flagsexamples:./biolatency # summarize block I/O latency as a histogram./biolatency 1 10 # print 1 second summaries, 10 times./biolatency -mT 1 # 1s summaries, milliseconds, and timestamps./biolatency -Q # include OS queued time in I/O time./biolatency -D # show each disk device separately./biolatency -F # show I/O flags separately

image-20210106165353596

-F选项可以根据flags分别显示io latency,这个选项很实用

image-20210106165552612


4.6 biosnoop-bpfcc

Trace all block device I/O and print a summary line per I/O

usage: biosnoop-bpfcc [-h] [-Q]Trace block I/Ooptional arguments:-h, --help show this help message and exit-Q, --queue include OS queued timeexamples:./biosnoop # trace all block I/O./biosnoop -Q # include OS queued time

root@ubuntu:test_mem# biosnoop-bpfcc -Q
TIME(s) COMM PID DISK T SECTOR BYTES QUE(ms) LAT(ms)
0.000000 ? 0 R 0 8 0.00 0.57
2.017184 ? 0 R 0 8 0.00 1.44
3.168129 jbd2/sda5-8 313 sda W 206940176 16384 0.00 0.18
3.168304 jbd2/sda5-8 313 sda W 206940208 4096 0.00 0.13
4.031720 ? 0 R 0 8 0.00 0.31
[...]

4.7 biostack.bt

biostacks(8)14 is a bpftrace tool that traces the block I/O request time (from OS enqueue to device completion) with the I/O initialization stack trace.

root@ubuntu:test_mem# biostacks.bt
Attaching 5 probes...
cannot attach kprobe, probe entry may not exist
Warning: could not attach probe kprobe:blk_start_request, skipping.
Tracing block I/O with init stacks. Hit Ctrl-C to end.
^C@usecs[blk_account_io_start+1generic_make_request+207submit_bio+72submit_bh_wbc+386submit_bh+19journal_submit_commit_record.part.0+475jbd2_journal_commit_transaction+4754kjournald2+182kthread+260ret_from_fork+53
]:
[4K, 8K) 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@usecs[blk_account_io_start+1blk_attempt_plug_merge+274blk_mq_make_request+863generic_make_request+207submit_bio+72submit_bh_wbc+386submit_bh+19jbd2_journal_commit_transaction+1484kjournald2+182kthread+260ret_from_fork+53
]:
[4K, 8K) 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|[...]

4.8 blktrace

blktrace - generate traces of the i/o traffic on block devices.

[root&#64;localhost ~]# blktrace -d /dev/sdc1 -o - | blkparse -i -8,32 4 1 0.000000000 1385858 A W 3470177952 &#43; 8 <- (8,33) 34701759048,33 4 2 0.000000992 1385858 Q W 3470177952 &#43; 8 [kworker/u113:3]8,33 4 3 0.000007305 1385858 G W 3470177952 &#43; 8 [kworker/u113:3]8,33 4 4 0.000008454 1385858 P N [kworker/u113:3]8,32 4 5 0.000015076 1385858 A W 9638099512 &#43; 8 <- (8,33) 96380974648,33 4 6 0.000015273 1385858 Q W 9638099512 &#43; 8 [kworker/u113:3]8,33 4 7 0.000016198 1385858 G W 9638099512 &#43; 8 [kworker/u113:3]8,32 4 8 0.000027067 1385858 A WM 3036678400 &#43; 8 <- (8,33) 30366763528,33 4 9 0.000027267 1385858 Q WM 3036678400 &#43; 8 [kworker/u113:3]8,33 4 10 0.000028193 1385858 G WM 3036678400 &#43; 8 [kworker/u113:3]8,32 4 11 0.000033291 1385858 A W 302800272 &#43; 8 <- (8,33) 3027982248,33 4 12 0.000033485 1385858 Q W 302800272 &#43; 8 [kworker/u113:3]8,33 4 13 0.000034269 1385858 G W 302800272 &#43; 8 [kworker/u113:3]8,33 4 14 0.000035653 1385858 U N [kworker/u113:3] 48,33 4 15 0.000036376 1385858 I W 3470177952 &#43; 8 [kworker/u113:3]8,33 4 16 0.000036877 1385858 I W 9638099512 &#43; 8 [kworker/u113:3]8,33 4 17 0.000037129 1385858 I WM 3036678400 &#43; 8 [kworker/u113:3]8,33 4 18 0.000037273 1385858 I W 302800272 &#43; 8 [kworker/u113:3]8,33 4 19 0.000042762 1385858 D W 3470177952 &#43; 8 [kworker/u113:3]8,33 4 20 0.000050812 1385858 D W 9638099512 &#43; 8 [kworker/u113:3]8,33 4 21 0.000052794 1385858 D WM 3036678400 &#43; 8 [kworker/u113:3]8,33 4 22 0.000054746 1385858 D W 302800272 &#43; 8 [kworker/u113:3]8,33 12 1 0.000427923 0 C W 302800272 &#43; 8 [0]8,33 12 2 0.000438597 0 C WM 3036678400 &#43; 8 [0]8,33 12 3 0.000441113 0 C W 3470177952 &#43; 8 [0]8,33 12 4 0.000443239 0 C W 9638099512 &#43; 8 [0]
^CCPU4 (8,33):Reads Queued: 0, 0KiB Writes Queued: 4, 16KiBRead Dispatches: 0, 0KiB Write Dispatches: 4, 16KiBReads Requeued: 0 Writes Requeued: 0Reads Completed: 0, 0KiB Writes Completed: 0, 0KiBRead Merges: 0, 0KiB Write Merges: 0, 0KiBRead depth: 0 Write depth: 4IO unplugs: 1 Timer unplugs: 0
CPU12 (8,33):Reads Queued: 0, 0KiB Writes Queued: 0, 0KiBRead Dispatches: 0, 0KiB Write Dispatches: 0, 0KiBReads Requeued: 0 Writes Requeued: 0Reads Completed: 0, 0KiB Writes Completed: 4, 16KiBRead Merges: 0, 0KiB Write Merges: 0, 0KiBRead depth: 0 Write depth: 4IO unplugs: 0 Timer unplugs: 0Total (8,33):Reads Queued: 0, 0KiB Writes Queued: 4, 16KiBRead Dispatches: 0, 0KiB Write Dispatches: 4, 16KiBReads Requeued: 0 Writes Requeued: 0Reads Completed: 0, 0KiB Writes Completed: 4, 16KiBRead Merges: 0, 0KiB Write Merges: 0, 0KiBIO unplugs: 1 Timer unplugs: 0Throughput (R/W): 0KiB/s / 0KiB/s
Events (8,33): 26 entries
Skips: 0 forward (0 - 0.0%)

4.9 bpftrace

#Count block I/O tracepoints events:
bpftrace -e &#39;tracepoint:block:* { &#64;[probe] &#61; count(); }&#39;#Summarize block I/O size as a histogram:
bpftrace -e &#39;t:block:block_rq_issue { &#64;bytes &#61; hist(args->bytes); }&#39;#Count block I/O request user stack traces:
bpftrace -e &#39;t:block:block_rq_issue { &#64;[ustack] &#61; count(); }&#39;
bpftrace -e &#39;t:block:block_rq_insert { &#64;[ustack] &#61; count(); }&#39;#Count block I/O type flags:
bpftrace -e &#39;t:block:block_rq_issue { &#64;[args->rwbs] &#61; count(); }&#39;#Trace block I/O errors with device and I/O type:
bpftrace -e &#39;t:block:block_rq_complete /args->error/ { printf("dev %d type %s error %d\n", args->dev, args->rwbs, args->error); }&#39;#Count SCSI opcodes:
bpftrace -e &#39;t:scsi:scsi_dispatch_cmd_start { &#64;opcode[args->opcode] &#61; count(); }&#39;#Count SCSI result codes:
bpftrace -e &#39;t:scsi:scsi_dispatch_cmd_done { &#64;result[args->result] &#61; count(); }&#39;#Count SCSI driver functions:
bpftrace -e &#39;kprobe:scsi* { &#64;[func] &#61; count(); }&#39;

推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
伊子夕2010_593
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有