磁盘

一个数据在磁盘A位置,一个数据在磁盘B位置,他们如果隔着很远。这对磁盘来说性能很差

(机械盘,磁头来回移动)

一个数据写进来,他会把数据放到缓存中,经过磁盘调度算法来调度,最后写到硬盘

io读写与进程优先级没关系。

缓存给磁盘做写操作。与此同时,又有很多读操作,先读还是先写 由调度算法决定

进程优先值再高也与磁盘没关系

blk-mq 多队列

rhel7

cd /sys/block/sda/queue/

只有三种

rhel8

[root@servera queue]# cat scheduler
[mq-deadline] kyber bfq none
[root@servera queue]#

中括号的位置为当前算法

有四种

my-deadline 最终期限 (与红帽7原理一样,只是多队列)

bfq (对应以前cfq)

none (对应noop)

kyber (多出来的)

永久有效可以写在tuned里

[root@servera supermao12]# vi tuned.conf
[root@servera supermao12]# pwd
/usr/lib/tuned/supermao12 [disk]
# The default unit for readahead is KiB. This can be adjusted to sectors
# by specifying the relevant suffix, eg. (readahead => 8192 s). There must
# be at least one space between the number and suffix (if suffix is specified).
readahead=>4096
elevator=bfq

(所有硬盘都一样了,都是bfq)

不同算法调优参数不一样

磁盘算法的优缺点与应用场景

cfq 完全公平排队IO策略

给每一个进程分配一个调度队列,默认以请求片和请求数限定的方式分配IO资源,以此保证每个进程的IO资源占用是公平的。这个算法在IO压力大,且IO主要集中在几个进程的时候,性能不太友好。

适合桌面级,多媒体应用。不适合数据库

cfq 做ppt 搞word 看电影 看qq 看微信 (cfq合适。完全公平,但是没有重点)

deadline

deadline 最终期限调度

对数据库环境是最好的选择,频繁更新小IO环境 (数据库磁盘阵列适合raid10)

在数据库应用场景中,我们需要更多的满足某个或没几个进程的IO相应速度,而不是让所有的进程公平使用IO



deadline有四个队列

有两个处理读写,还有两个处理要超时的,饿死的io

专门有两个处理超时的请求

[root@servera iosched]# cat read_expire
500
[root@servera iosched]# cat write_expire
5000 这是默认值,可以改
[root@servera iosched]# cat fifo_batch
16 #一次性往队列里放多少个IO

读不会超过500ms 写不会超过5000ms (防止超时)

读得快,用户感知很重要

适合小io且多

数据库不要做raid5 raid6

大的IO 可以用raid5 raid6 备份,视频监控

none与noop

无任何调优,先进先出,先来的io先处理,后来后处理

场景一: 如果系统中的硬盘是通过存储映射的LUN /dev/lunsdb

该硬盘所属的存储lun,已经在存储端做过优化,操作系统端就不需要优化,减少cpu压力 (cpu来计算调度算法 减少cpu时钟周期)

场景二:SSD选择none

固态硬盘不需要通过磁盘磁头回移动来进行读写,固态硬盘是通过芯片计算的

io要整合,一次性下发,对固态硬盘来说都不需要了

队列 io整合是在机械硬盘的时代

数据库机械盘应用 deadline 如果有固态选none

kyber

[root@servera iosched]# cat read_lat_nsec
2000000
[root@servera iosched]#

单位纳秒 换算为2毫秒

快速处理请求,快速响应 ssd

适合对于吞吐量敏感

服务器满足几个重要进程就行了(deadline)

windows iometer(网上下)

一个扇区512个字节,10个G就是 10 * 1024 * 1024 * 2 = 20971520

创建一个Access specifications



压力测试4kio 百分之随机写



linux fio

结果



每秒的io总数 30484

每秒119M

平均io响应时间 0.0326

最大io响应时间 1882

cpu使用率 (是否更消耗cpu)

邹老师的机械盘

linux fio

yum -y install fio

fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite bs=4k --direct=1 --size=512M --numjobs=2 --group_reporting --filename=/tmp/test

--ioengine=libaio (io引擎)

--iodepth=1 (测试车道,一般为1)

--rw=randwrite (随机写)

--direct=1 (直接写io)

--numjobs=2 (2个任务更快,这个和cpu有关,4个cpu设置4) 为1大大降低效率

aio: async io

除此之外有sync

sync更不准,写数据写到硬盘,硬盘给了回应才算写完,才能写下一个io

[root@servera iosched]# fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=4k --direct=1 --size=512M --numjobs=2 --group_reporting --filename=/tmp/testfile
randwrite: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
fio-3.7
Starting 2 processes
randwrite: Laying out IO file (1 file / 512MiB)
Jobs: 1 (f=1): [_(1),w(1)][100.0%][r=0KiB/s,w=13.9MiB/s][r=0,w=3548 IOPS][eta 00m:00s]
randwrite: (groupid=0, jobs=2): err= 0: pid=3781: Wed Jul 6 22:04:41 2022
write: IOPS=7427, BW=29.0MiB/s (30.4MB/s)(1024MiB/35293msec)
slat (usec): min=4, max=24237, avg=38.12, stdev=54.34
clat (usec): min=5, max=25812, avg=220.89, stdev=164.12
lat (usec): min=64, max=25867, avg=259.72, stdev=173.67
clat percentiles (usec):
| 1.00th=[ 74], 5.00th=[ 93], 10.00th=[ 111], 20.00th=[ 133],
| 30.00th=[ 151], 40.00th=[ 169], 50.00th=[ 188], 60.00th=[ 208],
| 70.00th=[ 233], 80.00th=[ 269], 90.00th=[ 359], 95.00th=[ 453],
| 99.00th=[ 881], 99.50th=[ 1074], 99.90th=[ 1450], 99.95th=[ 1631],
| 99.99th=[ 2933]
bw ( KiB/s): min=10064, max=19216, per=51.30%, avg=15240.91, stdev=2053.36, samples=137
iops : min= 2516, max= 4804, avg=3810.18, stdev=513.35, samples=137
lat (usec) : 10=0.01%, 20=0.01%, 50=0.12%, 100=7.01%, 250=68.58%
lat (usec) : 500=20.74%, 750=2.06%, 1000=0.82%
lat (msec) : 2=0.63%, 4=0.02%, 10=0.01%, 50=0.01%
cpu : usr=0.24%, sys=16.53%, ctx=272918, majf=0, minf=61
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,262144,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1 Run status group 0 (all jobs):
WRITE: bw=29.0MiB/s (30.4MB/s), 29.0MiB/s-29.0MiB/s (30.4MB/s-30.4MB/s), io=1024MiB (1074MB), run=35293-35293msec Disk stats (read/write):
vda: ios=0/261613, merge=0/0, ticks=0/64564, in_queue=7515, util=99.37%
[root@servera iosched]#

调整算法也可以调高磁盘性能

fifo batch 一次往队列中放入的IO数量,数量越大,性能约好,但延迟变大,反之,设置fifo batch为1,则性能相对于16而已要差,但延迟更小(deadline)

对延迟敏感还是写性能敏感

fio中的I/O延迟包括三种:slat,clat,lat
关系是 lat = slat + clat。
slat 表示fio submit某个I/O的延迟。
clat 表示fio complete某个I/O的延迟。
lat 表示从fio将请求提交给内核,再到内核完成这个I/O为止所需要的时间。

一次性调整三个盘

[disk]
# The default unit for readahead is KiB. This can be adjusted to sectors
# by specifying the relevant suffix, eg. (readahead => 8192 s). There must
# be at least one space between the number and suffix (if suffix is specified).
readahead=>4096
elevator=mq-deadline [sysfs]
/sys/block/vda/queue/iosched/fifo_batch=2 [root@servera iosched]# ls
fifo_batch front_merges read_expire write_expire writes_starved
[root@servera iosched]# cat fifo_batch
2
[root@servera iosched]# pwd

RAID和文件系统



固态做raid10,raid1 多一些

mdadm -C /dev/md0 -1 raid0 -n 2 /dev/vd[b-c]1

创建软raid

格式化mda

mkfs -t xfs -d su=64k,sw=2 /dev/san/lun1

每满64K就写一次硬盘,每写两个盘。做一次校验

chunk size 条带大小

一个成员盘,写多少个数据,才会移动到下一个磁盘

如果都是大IO,chunk size大小应该和IO对齐

如果IO很大,chunksize很小。相当于一个chunksize要跨很几个盘,相反

chunksize很大,io小,很多io写在一个地方。那么其他盘就闲住了

sw 数据盘的数量

mkfs.xfs -d su=64k,sw=2 /dev/vdc2

mkfs.xfs -d su=32k,sw=2 /dev/vdc3

一个block 4K * 16 才能写满一个chunksize

往一个成员盘里写16个block

一个条带共32个block (两个数据盘,3个数据盘*3)

chunk size : 64K raid5 四块盘,其中三块数据盘,每块盘写满一个chunksize,即64K。才写下一个成员盘,一个条带有三块数据盘

[root@servera iosched]# mkfs.xfs -d su=32k,sw=3 -f /dev/vdc
meta-data=/dev/vdc isize=512 agcount=8, agsize=163840 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=8 swidth=24 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

就是你的条带设置了32k,然后第一个单元有八个block 写完之后就是第一个磁盘写完了。因为有三块数据盘的缘故 要这样操作三次,所以3 * 8 。得到整个条带宽度24

raid情况下,单盘无需这样设置 (raid需要设置条带,和硬盘数,达到更好的性能)

什么场景ext4,什么场景xfs

xfs更适合大文件

ext4更适合小文件



xfs更消耗cpu

数据库建议用ext4

xfs 默认inodesize 512字节 (可以记录更多额外信息)

ext4 256

也可以指定xfs block inodesize大小

[root@servera iosched]# tune2fs -l   xxx (看xfs文件系统)

atime 每24小时更新一次,mtime比atime更新的时候会变

mount -o remount,noatime /

不更改atime

默认的方式下linux会把文件访问的时间atime做记录,文件系统在文件被访问、创建、修改等的时候记录下了文件的一些时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间;这在绝大部分的场合都是没有必要的。

因为系统运行的时候要访问大量文件,如果能减少一些动作(比如减少时间戳的记录次数等)将会显著提高磁盘 IO 的效率、提升文件系统的性能。

如果遇到机器IO负载高或是CPU WAIT高的情况,可以尝试使用noatime和nodiratime禁止记录最近一次访问时间戳。

转自honpey
文件系统中 atime,lazytime,relatime 详聊
atime,ctime,mtime是文件inode的三个时间戳,分别表示文件最近一次的访问时间;inode本身的更改(changed)时间;文件数据的更改(modify)时间;这几个概念还是很好区分。ctime和mtime的概念很清楚,每次ctime和mtime变化了,那么这个inode就真的要落盘了,但是atime相对就比较棘手一些;atime表示这个文件被访问(确切的说是读)了,比如cat file操作,但吊诡的是:每次读操作都会转化成一次写,因为atime的改变导致了inode变脏写回。这是很难接受的一件事情,因为哪怕你什么都没有写入,简单的读操作,竟然在系统层面引起了大量的写IO。于是各种优化被提了出来。 noatime:直接没有atime,让系统中的atime失效;relatime:只有当mtime/ctime的时间戳晚于atime的时候才去更新atime;lazytime:如果仅有inode变脏,那么控制inode下发的时间。 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- lazytime的问题的本质是:哪些操作会深入到真实的文件系统,那些操作不会深入到真实的文件系统? 比如setsize,write,truncate等操作都是会深入到真实的文件系统中去的,并且这些操作都会使得文件的 i_size 等关键属性发生变化,真实文件系统中会主动把这个 inode 放到到待回写的脏链表(bdi_writeback->b_dirty)中去!但是对于一个cat操作,会引起atime的变化(我们认为atime是一种不关键的inode属性),变化了也就是脏的了,VFS层负责把这个inode放到待回写的脏链表中去(bdi_writeback->b_dirty/b_dirty_time)。这说明,调用mark_inode_dirty让inode回写这件事儿,如果深入到了真实文件系统,比如i_size变了等场景,真实文件系统做;如果未深入到真实文件系统,VFS做! 再引申一件事情:inode结构体中许多重要的成员,比如 i_size, i_links都是在具体文件系统中设置,这个以后慢慢聊 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------那么到这里我们就大致知道了,其实relatime和lazytime其实都是处理的只有atime变化的场景,举例来说:cp file1 file2,此时file1就只有一个atime的变化。这会儿再来看relatime和lazytime,relatime是说atime的改变要与mtime/ctime联系在一起,只有mtime/ctime时间戳晚于atime的时候才会去更新atime,什么意思?初始状态下,我atime是9:00,mtime/ctime是12:00, 我13:00 cat了一下,kernel发现9:00 < 12:00,于是把atime更新为13:00;初始状态下,我atime是9:00,mtime/ctime是8:00,我13:00 cat了一下,kernel发现9:00 > 8:00,那么便不会更新atime,atime此时仍为9:00,这是relatime。lazytime呢,是说我inode的atime是实时更新的,8:00 cat,那么atime是8:00,13:00 cat,atime就变成了13:00,但是如果设置了lazytime,这个只有atime变化的inode是不会被下发的,只有当如下条件之一发生时才会被下发:1)有其他重要属性变化,如i_size/i_links等;2)如果用户态调用fsync/fdatasync等。 通过这些分析知道,lazytime 和 relatime 会大量减少IO的数量。好了,这就是基本的原理咯。 最后看如何使能这些标记: mount -t ext4 -oremount,lazytime /dev/ram0 ext4 mount -t ext4 -oremount,relatime /dev/ram0 ext4 mount-t ext4 -oremount,strictatime /dev/ram0 ext4 mount -t ext4 -oremount,noatime /dev/ram0 ext4

RHCA rh442 009 磁盘算法 RAID相关 磁盘压力测试的更多相关文章

  1. 使用Megacli64对服务器物理磁盘做Raid并通过uuid方式挂载

    需求说明:公司最近来了一批服务器,用于大数据业务部署.数据节点服务器由14块物理磁盘,其中有2块是900G的盘,12块是4T的盘.在服务器系统安装时,进入系统的BIOS界面:1)将2块900G的磁盘做 ...

  2. 在VMware下的Linux中的RAID5校验位算法下的磁盘管理

    前景:1988年由加利福尼亚大学伯克利分校发表的文章首次提到并定义了RAID,当今CPU性能每年可提升30%-50%但硬盘仅提升7%,渐渐的已经成为计算机整体性能的瓶颈,并且为了避免硬盘的突然损坏导致 ...

  3. uva 509 RAID!(磁盘数据)

    来自 https://blog.csdn.net/su_cicada/article/details/80085318 习题4-7 RAID技术(RAID!, ACM/ICPC World Final ...

  4. 使用RAID进行磁盘管理

    转自http://www.linuxprobe.com/chapter-06/ 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有 ...

  5. raid,磁盘配额,DNS综合测试题

    DNS解析综合学习案例1.用户需把/dev/myvg/mylv逻辑卷以支持磁盘配额的方式挂载到网页目录下2.在网页目录下创建测试文件index.html,内容为用户名称,通过浏览器访问测试3.创建用户 ...

  6. RAID及磁盘配额

     RAID的对比: 版本 特点 磁盘个数 可用空间 故障磁盘数 应用环境 RAID0 读写速度快,数据容易丢失 两个 全部 一块 测试,临时性 RAID1 读写速度慢,数据可靠 至少两个,可以2的倍数 ...

  7. 如何做raid级别磁盘(rhel和centos系统皆可)

    添加磁盘,自己需要多少磁盘即可添加多少数量 此处只添加了三块200MB大小的磁盘 此处三块磁盘,只有两块做raid,一块与raid磁盘为实验测读写速率,不测速率可三块都做raid. 进入虚拟机给三个磁 ...

  8. Raid相关操作与注意事项记录

    Raid相关操作与注意事项 Raid5 SATA盘组成的Raid5,在保护数据的前提下达到高性能: RAID要有BBU Current Cache Policy采用WriteBack,No Write ...

  9. 使用 MegaCLI 检测磁盘状态并更换磁盘

    专栏首页阿dai_linux使用 MegaCLI 检测磁盘状态并更换磁盘 原 10

  10. IBM X3850 Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘

    以前安装的是window2003 32位, 改装为2012 64位的时候.出现 Windows 无法安装到这个磁盘.选中的磁盘具有MBR分区表.在 EFI 系统上,Windows 只能安装到 GPT ...

随机推荐

  1. 深入探讨Function Calling:在Semantic Kernel中的应用实践

    引言 上一章我们熟悉了 OpenAI 的 function calling 的执行原理,这一章节我们讲解一下 function calling 在 Semantic Kernel 的应用. 在Open ...

  2. 用C++ Qt实现类似Photoshop的钢笔工具

    因为工作上的需求,需要实现一个类似Photoshop里面的钢笔工具, 分析一下它的功能,包括: 1. 有两种点:节点和控制点,节点是构成图形的基本端点,控制点是影响贝塞尔曲线的系数. 2. 创建节点: ...

  3. kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ consumer实战

    1.上一节课我们学习了MQTT producer 生产者步骤,MQTT consumer消费者步骤.该步骤可以从支持MRQTT协议的中间件获取数据,该步骤和kafka consumer 一样可以处理实 ...

  4. LINQ to Entities does not recognize the method 'System.String ToString()' method

    LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method ca ...

  5. Kubernetes监控手册05-监控Kubelet

    上一篇我们介绍了如何监控Kube-Proxy,Kube-Proxy的/metrics接口没有认证,相对比较容易,这一篇我们介绍一下Kubelet,Kubelet的监控相比Kube-Proxy增加了认证 ...

  6. Vue学习:11.了解生命周期

    Vue.js框架为组件设计了一套完整的生命周期,涵盖了从创建到销毁的全过程.这些生命周期钩子函数(lifecycle hooks)允许开发者在特定的阶段执行自定义逻辑,以便更好地管理组件的状态和与其交 ...

  7. 🌟 简单理解 React 的 createContext 和 Provider 🚀

    在 React 应用中,我们经常需要在组件之间共享状态和数据.而 React 的 createContext 和 Provider 就是为了解决这个问题而诞生的. createContext:创建自定 ...

  8. RHEL8.1---离线升级gcc

    升级gcc到gcc9.1.0 下载离线包.放到/opt下 [root@172-18-251-35 opt]# wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc ...

  9. Kubernetes(五) Pod控制器详解

    Pod控制器详解 本章主要介绍Pod控制器的详细使用 1. Pod控制器介绍 在kubernetes中,按照pod的创建方式可以将其分为2类: 自主式pod:kubernetes直接创建出来的pod, ...

  10. Nuxt3 的生命周期和钩子函数(二)

    title: Nuxt3 的生命周期和钩子函数(二) date: 2024/6/26 updated: 2024/6/26 author: cmdragon excerpt: 摘要:本文深入介绍了Nu ...