RHCA rh442 009 磁盘算法 RAID相关 磁盘压力测试
磁盘
一个数据在磁盘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相关 磁盘压力测试的更多相关文章
- 使用Megacli64对服务器物理磁盘做Raid并通过uuid方式挂载
需求说明:公司最近来了一批服务器,用于大数据业务部署.数据节点服务器由14块物理磁盘,其中有2块是900G的盘,12块是4T的盘.在服务器系统安装时,进入系统的BIOS界面:1)将2块900G的磁盘做 ...
- 在VMware下的Linux中的RAID5校验位算法下的磁盘管理
前景:1988年由加利福尼亚大学伯克利分校发表的文章首次提到并定义了RAID,当今CPU性能每年可提升30%-50%但硬盘仅提升7%,渐渐的已经成为计算机整体性能的瓶颈,并且为了避免硬盘的突然损坏导致 ...
- uva 509 RAID!(磁盘数据)
来自 https://blog.csdn.net/su_cicada/article/details/80085318 习题4-7 RAID技术(RAID!, ACM/ICPC World Final ...
- 使用RAID进行磁盘管理
转自http://www.linuxprobe.com/chapter-06/ 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有 ...
- raid,磁盘配额,DNS综合测试题
DNS解析综合学习案例1.用户需把/dev/myvg/mylv逻辑卷以支持磁盘配额的方式挂载到网页目录下2.在网页目录下创建测试文件index.html,内容为用户名称,通过浏览器访问测试3.创建用户 ...
- RAID及磁盘配额
RAID的对比: 版本 特点 磁盘个数 可用空间 故障磁盘数 应用环境 RAID0 读写速度快,数据容易丢失 两个 全部 一块 测试,临时性 RAID1 读写速度慢,数据可靠 至少两个,可以2的倍数 ...
- 如何做raid级别磁盘(rhel和centos系统皆可)
添加磁盘,自己需要多少磁盘即可添加多少数量 此处只添加了三块200MB大小的磁盘 此处三块磁盘,只有两块做raid,一块与raid磁盘为实验测读写速率,不测速率可三块都做raid. 进入虚拟机给三个磁 ...
- Raid相关操作与注意事项记录
Raid相关操作与注意事项 Raid5 SATA盘组成的Raid5,在保护数据的前提下达到高性能: RAID要有BBU Current Cache Policy采用WriteBack,No Write ...
- 使用 MegaCLI 检测磁盘状态并更换磁盘
专栏首页阿dai_linux使用 MegaCLI 检测磁盘状态并更换磁盘 原 10
- IBM X3850 Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘
以前安装的是window2003 32位, 改装为2012 64位的时候.出现 Windows 无法安装到这个磁盘.选中的磁盘具有MBR分区表.在 EFI 系统上,Windows 只能安装到 GPT ...
随机推荐
- k8s中的pod更新策略
StatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序,比如在进行SpringCloud项目容器化时,Eureka的部署是比较适合用StatefulSet部署方式的 ...
- mysql通过binlog来恢复被删除的数据库
binlog日志 查询: MariaDB [(none)]> show variables like 'log_bin'; +---------------+-------+ | Variabl ...
- centos6 chkconfig的原理 和添加开机自启动的办法
当我们使用 chkconfig --list的时候 都会又 123456 这样的级别. 当某个级别是 on 他就会开机启动,当他是off 的时候他就不会开机自启动. 那么这是什么原因呢?他的 原理是什 ...
- node写接受
选择数据库类型:mongodb 定义用户集合的字段(域): 用户名 密码 性别 爱好(多选) 简介 npm i -S express mongoose 在项目中连接mongodb服务 inde ...
- LeetCode 40. Combination Sum II 组合总和 II (C++/Java)
题目: Given a collection of candidate numbers (candidates) and a target number (target), find all uniq ...
- linux系统下,jdk的安装和配置教程,以jdk-8u311为例
1.官方下载 下载地址:https://www.oracle.com/ 本文以jdk8为例, 1)下载地址:https://www.oracle.com/java/technologies/downl ...
- 工程数学 实验5-MATLAB最优化工具箱的使用
(1)线性规划应用案例的求解 1.基本要求 通过一个农业生产计划优化安排的实例求解,培养学生解决实际线性规划问题的初步能力:熟悉线性规划的建模过程:掌握Matlab优化工具箱中线性规划函数的调用. 2 ...
- mongodb客户端操作语法笔记
##登录连接: 进入客户端方法D:\Program Files\MongoDB\Server\5.0\bin>mongo.exe > db.runoob.insert({"nam ...
- JS常用的工具方法
记录一些经常使用的JS通用工具方法,代码来自互联网,佛性更新 空字符串校验 /** * 判断字符串是不是NULL或空串或空格组成 * @param str 被判断的字符串 * @return {boo ...
- MySQL入门到实战详细教程
MySQL介绍 MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品,它广泛应用于各种Web应用程序和网站,MySQL使用结构化查 ...