Linux磁盘性能方法以及磁盘io性能分析

news2024/12/23 17:55:53

Linux磁盘性能方法以及磁盘io性能分析

  • 1. fio压测
    • 1.1. 安装fio
    • 1.2. bs = 4k iodepth = 1:随机读/写测试,能反映硬盘的时延性能
    • 1.3. bs = 128k iodepth = 32:顺序读/写测试,能反映硬盘的吞吐性能
  • 2. dd压测
    • 2.1. 测试纯写入性能
    • 2.2. 测试纯读取性能
  • 3.磁盘性能分析
    • 3.1. 判断磁盘io打满
    • 3.2. io打满是由于磁盘本身问题还是应用过量
    • 3.3. 云盘的性能参考
  • 4. 疑问和思考
    • 4.1 %util能否代表磁盘io性能压力过大?
    • 4.2 如何判断磁盘性能是否饱和?
    • 4.3 如何判断磁盘性慢,是否与磁盘负载高还是低层设备io性能差?

磁盘性能是衡量计算机系统运行状况的关键因素之一。对于磁盘性能的测试和分析,Fio 和 dd 是两个常用的工具。在这篇文章中,将介绍如何使用 Fio 进行磁盘 I/O 测试,以及如何分析磁盘性能。同时,还会简单介绍 dd 工具的使用。

Fio 是一个灵活的 I/O 测试工具,支持多种工作模式,包括顺序读写、随机读写等。在安装 Fio 时,可以选择通过 yum 或编译源码进行安装。Fio 的测试报告中包含了丰富的信息,包括吞吐量和时延等指标。

除了 Fio 以外,dd 也是一个常用的磁盘测试工具。dd 可以用于测试磁盘的纯写入和纯读取性能。通过使用不同的参数,可以定制 dd 测试的读写块大小和读写次数等。

在分析了磁盘性能之后,可以使用 iostat 命令对磁盘的各项指标进行监控。iostat 可以显示磁盘的读写吞吐量、I/O 请求数等指标,帮助分析磁盘性能是否满足系统需求。另外,还需要参考磁盘类型的带宽参数,来判断磁盘性能的瓶颈可能来自哪里,例如磁盘本身的问题或者是应用程序的过量读写等。总之,在对磁盘性能进行测试和分析时,需要综合考虑多个方面的因素,才能更准确地判断系统的运行状况。


1. fio压测

1.1. 安装fio

使用yum安装

#yum安装
yum install fio

编译安装

# 下载Fio源码。
wget https://github.com/axboe/fio/archive/fio-2.1.10.tar.gz
#解压Fio源码。
tar -zxvf fio-2.1.10.tar.gz
#编译并安装Fio。
cd fio-fio-2.1.10
make
make install
#检查安装的Fio版本号。
fio --version
#回显信息如下,则Fio安装成功。
fio-2.1.10

1.2. bs = 4k iodepth = 1:随机读/写测试,能反映硬盘的时延性能

# 测试硬盘的随机写时延。
fio -filename=/data/fio.txt -ioengine=libaio -direct=1 -iodepth 1 -thread -rw=randwrite -bs=4k -size=100G -numjobs=48 -runtime=300 -group_reporting -name=mytest

# 测试硬盘的随机读时延。
fio -filename=/data/fio.txt -ioengine=libaio -direct=1 -iodepth 1 -thread -rw=randread -bs=4k -size=100G -numjobs=48 -runtime=300 -group_reporting -name=mytest

查看测试报告
在这里插入图片描述

1.3. bs = 128k iodepth = 32:顺序读/写测试,能反映硬盘的吞吐性能

# 测试硬盘的随机写带宽。
fio -filename=/data/fio.txt -ioengine=libaio -direct=1 -iodepth 32 -thread -rw=randwrite -bs=128k -size=100G -numjobs=48 -runtime=300 -group_reporting -name=mytest

# 测试硬盘的随机读带宽。
fio -filename=/data/fio.txt -ioengine=libaio -direct=1 -iodepth 32 -thread -rw=randread -bs=128k -size=100G -numjobs=48 -runtime=300 -group_reporting -name=mytest

查看测试报告
在这里插入图片描述

2. dd压测

dd 也是我们经常使用到的磁盘测试工具,Linux服务器装好系统之后,想要知道硬盘的读写是否能满足服务的需要,如果不满足硬盘的IO就是服务的一个瓶颈。我们可以使用dd命令简单进行测试,更为专业的测试可以使用上面描述的fio 工具:
time有计时作用,dd用于复制,从if读出,写到of。if=/dev/zero不产生IO,因此可以用来测试纯写速度。同理of=/dev/null不产生IO,可以用来测试纯读速度。bs是每次读或写的大小,即一个块的大小,count是读写块的数量。

2.1. 测试纯写入性能

dd if=/dev/zero of=/data/testw bs=8k count=10000 oflag=direct
10000+0 records in
10000+0 records out
81920000 bytes (82 MB) copied, 3.07226 s, 26.7 MB/s

2.2. 测试纯读取性能

# 创造一个2G的可读文件
dd if=/dev/zero of=/data/testr bs=10M count=200
200+0 records in
200+0 records out
2097152000 bytes (2.1 GB) copied, 2.88613 s, 727 MB/s

# 测试纯读速度
dd if=/data/testr of=/dev/null bs=8k count=10000 iflag=direct
10000+0 records in
10000+0 records out
81920000 bytes (82 MB) copied, 3.07104 s, 26.7 MB/s

3.磁盘性能分析

使用iostat命令可以获取当前硬盘的指标情况,以判断当前的硬盘性能是否足够。但是经常会遇到一些磁盘的ioutil已经打满,只能判断io性能不足,不能判断是否与应用对磁盘读写过高导致io打满,还是磁盘本身的性能不足导致小量的io读写就导致磁盘性能打满,常见的分析手段

iostat -mx 1

在这里插入图片描述

3.1. 判断磁盘io打满

如上图所示,ioutil标志当前磁盘的io打满情况,一般大于60%以上就认为磁盘的io有比较大的压力,如果持续90%以上,并且间歇性出现100%,则认为磁盘的io性能已经打满

3.2. io打满是由于磁盘本身问题还是应用过量

ioutil需要配合当前读写量配合看(标红部分),来判断是否当前的磁盘性能问题是来于底层本身的问题还是应用的磁盘读写过量导致。以ioutil使用率为90%为准绳,判断当前的磁盘读、写的带宽情况,常见的磁盘类型的带宽参考如下。

磁盘类型iops磁盘最大吞吐备注
机械磁盘SATA150150MB/s7200 rpm的磁盘IOPS = 1000 / (9 + 4.17) = 76 IOPS
10000 rpm的磁盘IOPS = 1000 / (6+ 3) = 111 IOPS
15000 rpm的磁盘IOPS = 1000 / (4 + 2) = 166 IOPS
SSD SATA3000~10000250MB/s - 400MB/s
nvme20w+2GB/s +
内存100w+30~60 GB/s。

3.3. 云盘的性能参考

  • 云硬盘类型

4. 疑问和思考

4.1 %util能否代表磁盘io性能压力过大?

不能。

%util是最容易让人产生误解的一个参数,很多初学者看到%util 等于100%就说硬盘能力到顶了,这种说法是错误的。

%util数据源自diskstats中的io_ticks,这个值并不关心等待在队里里面IO的个数,它只关心队列中有没有IO。

和超时排队结账这个类比最本质的区别在于,现代硬盘都有并行处理多个IO的能力,但是收银员没有。收银员无法做到同时处理10个顾客的结账任务而消耗的总时间与处理一个顾客结账任务相差无几。但是磁盘可以。所以,即使%util到了100%,也并不意味着设备饱和了。

最简单的例子是,某硬盘处理单个IO请求需要0.1秒,有能力同时处理10个。但是当10个请求依次提交的时候,需要1秒钟才能完成这10%的请求,,在1秒的采样周期里,%util达到了100%。但是如果10个请一次性提交的话, 硬盘可以在0.1秒内全部完成,这时候,%util只有10%。

因此,在上面的例子中,一秒中10个IO,即IOPS=10的时候,%util就达到了100%,这并不能表明,该盘的IOPS就只能到10,事实上,纵使%util到了100%,硬盘可能仍然有很大的余力处理更多的请求,即并未达到饱和的状态。

如下4张图,可以看到当IOPS为1000的时候%util为100%,但是并不意味着该盘的IOPS就在1000,实际上2000,3000,5000的IOPS都可以达到。根据%util 100%时的 r/s 或w/s 来推算磁盘的IOPS是不对的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

那么有没有一个指标用来衡量硬盘设备的饱和程度呢。很遗憾,iostat没有一个指标可以衡量磁盘设备的饱和度。

4.2 如何判断磁盘性能是否饱和?

通过使用iostat -xm 1获取磁盘的io使用情况,相关参数如下

$iostat -d -k 1 10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              39.29        21.14         1.44  441339807   29990031
sda1              0.00         0.00         0.00       1623        523
sda2              1.32         1.43         4.54   29834273   94827104
sda3              6.30         0.85        24.95   17816289  520725244
sda5              0.85         0.46         3.40    9543503   70970116
sda6              0.00         0.00         0.00        550        236
sda7              0.00         0.00         0.00        406          0
sda8              0.00         0.00         0.00        406          0
sda9              0.00         0.00         0.00        406          0
sda10            60.68        18.35        71.43  383002263 1490928140

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             327.55      5159.18       102.04       5056        100
sda1              0.00         0.00         0.00          0          0

disk属性值说明:
rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
r/s: 每秒完成的读 I/O 设备次数。即 rio/s
w/s: 每秒完成的写 I/O 设备次数。即 wio/s
rsec/s: 每秒读扇区数。即 rsect/s
wsec/s: 每秒写扇区数。即 wsect/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
avgqu-sz: 平均I/O队列长度。
await: 平均每次设备I/O操作的等待时间 (毫秒)。
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

关键指标 svctm、await、avgque-sz

  • 如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
  • 如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。
  • 如果avgqu-sz比较大,也表示有当量io在等待。

await能够反映磁盘读写的正常时间,通常情况下,不应该超过5ms,因此可以通过该指标判断磁盘io性能是否已经达到瓶颈

4.3 如何判断磁盘性慢,是否与磁盘负载高还是低层设备io性能差?

磁盘io性能关键指标: svctm、await、avgque-sz
磁盘负载指标: w/s和r/s

两者相结合,判断磁盘的io慢是由于磁盘io负载高导致还是磁盘设备本身性能差导致

  • svctm、await、avgque-sz 大,但是w/s和r/s 小,表示磁盘没有磁盘io高负载,但是磁盘io响应慢,大概率是磁盘低层设备性能差导致
  • svctm、await、avgque-sz 大,w/s和r/s 大,表示表示磁盘磁盘io高负载,导致依然很慢,大概率是磁盘读写压力过大,导致磁盘io响应慢

参考云厂商磁盘io的磁盘读写吞吐情况
在这里插入图片描述

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

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

相关文章

禾赛戳了自动驾驶的眼睛?

大数据产业创新服务媒体 ——聚焦数据 改变商业 激光雷达之于自动驾驶,就如同眼睛和大脑至于人,重要性自然不言而喻。 然而,对于自动驾驶如此重要的关键零件,2月29日,有消息称,部分使用禾赛科技激光雷达的…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2,将元素分为d1个组,每组相邻量取元素距离为d1,在各组内直接进行插入排序;取第二个整数d2 d1/2, 重复上述分组排序过程&#xff0…

鬼屋游戏c++

c #include <iostream> #include <string> #include <vector> #include <cstdlib> // 用于随机数生成 #include <ctime> // 用于随机数种子using namespace std;// 定义房间结构体 struct Room {string description;bool hasKey;bool hasClue…

Java中的动态代理与Spring AOP编程

第一章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;动态代理和Spring AOP&#xff08;面向切面编程&#xff09;是两个能让代码更加灵活、更加干净的强大工具。作为一名Java程序员&#xff0c;小黑觉得掌握它们对于写出高质量的代码来说非常…

win11安装nodejs

一、下载安装包 链接: https://pan.baidu.com/s/1_df8s1UlgNNaewWrWgI59A?pwdpsjm 提取码: psjm 二、安装步骤 1.双击安装包 2.Next> 3.勾选之后&#xff0c;Next> 4.点击Change&#xff0c;选择你要安装的路径&#xff0c;然后Next> 5.点击Install安装 二、…

最新Sora人工智能视频资源网址分享

1&#xff0c;了解什么是Sora * 什么是 OpenAI Sora&#xff1f; Sora 是由 OpenAI 开发的文本到视频模型。它可以按照用户的提示生成长达一分钟的高质量和一致的视频。 * 如何使用 OpenAI Sora 模型&#xff1f; 目前&#xff0c;OpenAI Sora 模型处于内测阶段&#xff0c;并将…

深入剖析k8s-Pod篇

为什么需要Pod&#xff1f; 进程是以进程组的方式组织在一起。受限制容器的“单进程模型”&#xff0c; 成组调用没有被妥善处理&#xff08;资源调用有限&#xff09;&#xff0c;使用资源囤积则导致复杂度上升。 在k8s项目中&#xff0c;Pod的实现需要使用一个中间容器——…

【快速选择】解决TopK问题

目录 一、什么是TopK问题 二、优先级队列 优先级队列介绍 代码实现 三、使用优先级队列解决TopK问题 四、快速选择算法解决TopK问题 快速选择 图解快速选择 代码解决前k小个元素 五、优先级队列与快速选则算法比较 优先级队列 快速选择 一、什么是TopK问题 TopK问题…

Mybatis plus核心功能-IService

目录 1 前言 2 使用方法 2.1 继承ServiceImpl,> 2.2 基础业务开发的使用 2.3 复杂业务开发的使用 2.3 Lambda查询 2.4 Lambda更新 1 前言 我本以为Mapper层的类能够继承BaseMapper<XXX>&#xff0c;而不用我们手动写一些mapper方法已经够离谱了。没想到海油膏…

Zookeeper学习1:概述、安装、应用场景、集群配置

文章目录 概述安装LinuxWindows 配置参数集群参考配置文件配置步骤流程启动 概述 Zookeeper&#xff1a; 为分布式框架组件提供协调服务的中间件 【类似&#xff1a;文件系统通知机制】 负责存储上下层应用关系的数据以及接收观察者注册监听&#xff0c;一旦观察查关心的数据发…

gpt批量工具,gpt批量生成文章工具

GPT批量工具在今天的数字化时代扮演着越来越重要的角色&#xff0c;它们通过人工智能技术&#xff0c;可以自动批量生成各种类型的文章&#xff0c;为用户提供了便利和效率。本文将介绍5款不同的GPT批量工具&#xff0c;并介绍一款知名的147GPT生成工具&#xff0c;以及另外一款…

MyBatis的补充用法

说明&#xff1a;之前介绍过MyBatis的用法&#xff0c;像 用注解和Mapper.xml操作数据库、在Mapper.xml里写动态SQL。最近在一次用MyBatis批量更新数据库对象的场景中&#xff0c;意识到对MyBatis的一些标签用法不太熟悉&#xff0c;所以去 MyBatis官网 看了一些文档&#xff0…

(介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)

前言 本文详细介绍了如何利用物联网技术,通过NodeMCU ESP8266(ESP-12F)模块连接到新版的OneNet平台,使用MQTT协议实现数据的上传与指令的下发。文中首先对NodeMCU ESP8266模块及其特性进行了简介,随后详细阐述了如何配置和使用MQTT协议连接到OneNet平台,实现温湿度数据的…

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合&#xff0c;为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换&#xff0c;极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点&#xff0c;集中式架构拥有简单易用、管…

Java对象大小计算

概述 在实际应用中&#xff0c;尤其是在进行JVM调优时&#xff0c;理解并正确估计对象大小是非常重要的&#xff0c;因为这直接影响到内存分配、垃圾回收效率以及应用程序的整体性能。 对象的组成 在Java中&#xff0c;计算一个对象的大小是为了了解它在内存中占用的确切空间…

Leetcode2673. 使二叉树所有路径值相等的最小代价

Every day a Leetcode 题目来源&#xff1a;2673. 使二叉树所有路径值相等的最小代价 解法1&#xff1a;遍历 对于满二叉树&#xff0c;父节点 cost[i] 的左右儿子节点分别为 cost[2 * i - 1]、cost[2 * i]。 考虑根到两个互为兄弟节点&#xff08;父节点相同&#xff09;的…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

Navicat保存的连接密码破解-java代码

第一步&#xff1a;找到加过密的密码 有两种方法可以找到密码&#xff0c;一种是注册表里可以找到&#xff0c;一种是导出连接信息功能&#xff0c;这里说第二种。 1、打开Navicat&#xff0c;点击文件->导出连接菜单 2、导出要破解密码的连接到connections.ncx文件中&…

小程序配置服务器域名的操作步骤(入门级)

将详细列出小程序配置服务器域名的操作步骤&#xff1a; 服务器选购推荐&#xff1a;腾讯云轻量服务器 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作为游戏服…

SQL面试题(2)

第一题 创建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…