
Storage
文章平均质量分 64
解析内核存储栈代码,AIO 块设备读写原理,IO 拥塞控制机制,具体案例分析等
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
yiyeguzhou100
专注,探索,分享
展开
-
PCI bar 解析
pci bar原创 2022-12-03 22:36:05 · 2010 阅读 · 0 评论 -
dd测试中conv=fsync时的落盘情况
使用conv=fdatasync/fsync时,dd会从/dev/zero中一次性读取410M的数据,写入到文件系统缓存中(因为写的/test/test文件,不是裸设备),然后再从缓存中读取,一次性写入到磁盘当中。从对do_fsync的function trace来看,只抓到一次对do_fsync的调用,dd总耗时是2.7s,do_fsync执行耗时就有2.05s,剩下0.65s的时间就是从/...原创 2019-07-17 18:36:26 · 1525 阅读 · 0 评论 -
noop io scheduler
定义了一个elevator_noop的调度器类型:static struct elevator_type elevator_noop = { .ops = { .elevator_merge_req_fn = noop_merged_requests,//查询一个request,用于将bio并入 .elevator_dispatch_fn...转载 2019-03-15 18:19:40 · 544 阅读 · 0 评论 -
磁盘IO利用率100%导致执行sync卡住
在同样的环境sda磁盘利用率不高的情况下,sync不卡。原创 2019-09-10 22:22:25 · 1141 阅读 · 0 评论 -
Linux IO并发拥塞控制机制分析-3
如下面的代码,inode,bdi相关的读或写方向的拥塞判断都是通过wb_congested函数,而wb_congested函数判断是否拥塞就是根据“Linux IO并发拥塞控制机制分析-2”中提到的函数blk_set_congested是否设置了拥塞标志(读或写方向)。 inode(文件)的拥塞判断 举例1如下,在进行预读操作时,如果判断当前读方向处于拥塞,则推迟(Defer)...原创 2019-08-17 23:41:28 · 445 阅读 · 0 评论 -
MySQL服务器SSD性能问题分析与测试
https://www.cnblogs.com/wangdong/p/9970866.html【问题】我们有台HP的服务器,SSD在写IOPS约5000时,%util达到80%以上,那么这块SSD的性能究竟有没有问题,为解决这个问题做了下面测试。【工具】blktrace是linux下用来排查IO性能的工具。它可以记录IO经历的各个步骤,并计算出IO请求在各个阶段的消耗,下面是关...转载 2019-07-28 21:46:25 · 304 阅读 · 0 评论 -
记一次排查fio顺序写测试IOPS上不去的问题
测试命令:fio -name=iops -filename=/root/testfio -ioengine=libaio -direct=1 -bs=4k -size=4g -runtime=60 -numjobs=2 -thread -rw=write -group_reporting -time_based两台同配置服务器,同样的测试命令,IOPS相差近40倍:A服务器平均IOPS...原创 2019-08-06 21:48:29 · 1769 阅读 · 0 评论 -
IO完成软中断对运行CPU的选择 - 避免一次IPI的优化
举例为对下面commit 1的翻译。而commit 1是对commit 2的revert,并加以解释。commit 1将commit 2 revert掉,可避免一个不必要的IPI中断(触发其他CPU产生软中断的IPI)。假设前提条件: 处理器插槽上的处理器芯片有7个cpu(cpu0~7),并假定IO请求是在cpu1上提交(__make_request)的,IO完成的硬中断是在...原创 2019-08-31 23:13:42 · 1128 阅读 · 0 评论 -
采用sched_feat作为内核调试控制开关
该文件定义了内核线程调度器的feature,在内核调度器代码中会判断相应feature是否打开:我们可以在features.h文件中定义我们自己的开关,默认值是false(即sched_feat(OPEN_FLAG) == flase),然后在其他内核模块中使用,如在内核block/deadline-iosched.c中控制我们自己加的debug代码是否执行。需要在deadline...原创 2019-07-29 22:46:40 · 1779 阅读 · 0 评论 -
atop备忘
https://blog.csdn.net/chen8238065/article/details/77170846http://www.361way.com/atop/5162.html转载 2019-03-06 09:10:32 · 165 阅读 · 0 评论 -
记一次对rocksdb元数据落盘的优化
针对rocksdb落盘超时问题的优化。 xfs文件系统下文件fdatasync测试以及元数据落盘场景 fdatasync_test.c测试代码按执行顺序,执行的步骤如下基于xfs文件系统创建256KB文件(初始化位0), 然后调用fdatasync落盘; 继续向文件写4K数据(文件大小增大4K),然后调用fdatasync落盘; 将文件当前写指针重定位到文件起始位置,向文件写12...原创 2019-07-08 20:43:05 · 1603 阅读 · 0 评论 -
Linux IO并发拥塞控制机制分析-1
块设备请求队列:struct request_queue {struct list_head queue_head; //待处理请求的链表,请求队列中的请求用链表组织在一起struct request *last_merge; //指向队列中首先可能合并的请求描述符struct elevator_queue *elevator;//指向elevator对象的指针(电梯算法)st...原创 2019-07-14 10:47:00 · 856 阅读 · 0 评论 -
块设备IO完成软中断平衡参数(rq_affinity)的意义
rq_affinity, 块设备IO完成软中断的平衡By default this value is set to 1, which means that once an I/O request has been completed by the block device, it will be sent back to the "group" of CPUs that the request...原创 2019-08-25 22:26:11 · 3396 阅读 · 0 评论 -
Linux IO并发拥塞控制机制分析-2
如"Linux IO并发拥塞控制机制分析-1"所述,在__get_request函数值中判断若符合拥塞条件则调用blk_set_congested 设置拥塞标志(同步与异步),这里所说的拥塞控制是指对单个磁盘的拥塞控制(单盘对应一个request_queue):除了在_get_request函数中会判断是否设置拥塞标志,当用户在调整单盘并发IO个数(/sys/block/sda/que...原创 2019-08-07 22:47:52 · 329 阅读 · 0 评论 -
Fio压测工具和io队列深度理解和误区
本文链接地址:Fio压测工具和io队列深度理解和误区Fio 是个强大的IO压力测试工具,我之前写过不少fio的使用和实践,参见这里。随着块设备的发展,特别是SSD盘的出现,设备的并行度越来越高。利用好这些设备,有个诀窍就是提高设备的iodepth, 一把喂给设备更多的IO请求,让电梯算法和设备有机会来安排合并以及内部并行处理,提高总体效率。应用使用IO通常有二种方式:同步和异步。 ...转载 2019-07-25 22:50:30 · 3432 阅读 · 0 评论 -
一次解决磁盘IO读取慢全过程
在两台型号相同的机器上(snap1 和snap3)测试磁盘的读取速度,发现两台机器的读取速度差的很大: #dd if=/dev/dm-93 of=/dev/null bs=4M count=1024 711MB/sonsnap1. 178MB/sonsnap3. 接下来比较snap1和snap3两台机器上关于dm-93磁盘(raid)的以下字段输出都是一样 /sys/block/<device>/queue/max_sectors_kb ...转载 2021-06-11 19:59:26 · 1713 阅读 · 0 评论 -
Linux IO 多队列流程图
https://github.com/kernel-z/filesystem/blob/master/blk_mq.png转载 2019-09-03 22:29:51 · 993 阅读 · 0 评论 -
ext4 barrier
将ext4的mount参数加上nobarrier,测试结果显示性能明显有提升,一旦mount参数不指定nobarrier,性能就成倍下降。代码中barrier在ext4中是默认开启的,其目的是为了保证文件系统元数据比真实数据先落盘,简单来说就是文件系统往磁盘写了元数据后,会让驱动给磁盘发一个flush命令,以保证此时停留在磁盘控制器缓存中的元数据落到盘上。...原创 2021-10-30 11:47:17 · 1430 阅读 · 0 评论 -
Linux kernel fault injection
https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txthttps://www.kernel.org/doc/Documentation/fault-injection/nvme-fault-injection.txthttps://lwn.net/Articles/209257/example nvme?:https://git.kernel.org/pub/scm/linux/kernel/git/t原创 2021-07-17 12:17:22 · 422 阅读 · 2 评论 -
limit bio max size when convert page->bio
https://lkml.org/lkml/2021/4/12/2168https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?h=next-20210622&id=cd2c7545ae1beac3b6aae033c7f31193b3255946原创 2021-06-23 12:40:12 · 173 阅读 · 0 评论 -
Long Story of Block - segment
segmentsegment 的概念实际来自 DMA controller,DMA controller 可以实现一段内存物理地址区间与一段设备物理地址区间之间的数据拷贝,segment 就描述 DMA 数据传输过程中的一段连续的内存空间,也就是说 DMA controller 可以将内存中一个 segment 中的数据拷贝到设备,或将设备中的数据拷贝到 segment 中segment 可以是一个 page,也可以是一个 page 的其中一部分,通常存储一个或多个相邻的 sector 的数据.转载 2021-06-22 09:49:45 · 526 阅读 · 0 评论 -
Linux Kernel 5.8 将为 blk-mq 引入内联加密支持
为了提供更好的加密性能,目前谷歌工程师正在为 Linux 文件系统加密管理工具 fscrypt 添加内联加密支持。而与之相关的开发包括在 Linux 5.8 的块设备队列管理blk-mq 中引入内联加密。fscrypt 是用于Linux 文件系统加密管理的高级工具,它管理元数据、密钥生成、密钥封装与 PAM 集成,并提供用于创建和修改加密目录的统一界面。fscrypt 的内核部分已集成到诸如 ext4 的文件系统中。blk-mq 则是 Linux 的块设备层多队列机制,它将 Linux 内核..转载 2021-05-22 23:38:16 · 272 阅读 · 0 评论 -
Discuss about make aio wait path to account iowait time
https://lkml.org/lkml/2020/8/28/48From Xianting Tian <>Subject [PATCH] aio: make aio wait path to account iowait timeDate Fri, 28 Aug 2020 14:07:12 +0800share 0As the normal aio wait path(read_events() ->wait_event_interruptible_hrtimeo.原创 2020-09-05 10:01:14 · 282 阅读 · 0 评论 -
when interrupts come after submit
Almost at the same time,two interrupts come to cpu 25 and 26 at the time .577560 and .577564 spearately.原创 2020-08-14 22:58:49 · 243 阅读 · 0 评论 -
interesting discuss, it helps us understand direct_io better
http://laoar.github.io/blog/2017/04/28/directio/https://yarchive.net/comp/linux/o_direct.html原创 2020-08-13 12:22:23 · 131 阅读 · 0 评论 -
注释一下blk_update_request函数
注释一下blk_update_request函数/*** blk_update_request - Special helper function for request stacking drivers* @req: the request being processed 包含IO完成的数据所在的request* @error: block status code* @nr_bytes: number of bytes to complete @req 表示本函数要处理的IO原创 2020-08-12 22:06:01 · 3432 阅读 · 0 评论 -
内核hybird poll原理
传统的poll机制通过持续的poll操作,可以提高诸如高IO throughput设备的IO性能,例如NVME设备。但是持续的poll一个设备,会过度的占用CPU,有时可能使IO性能更糟糕,为了解决这种传统poll过度占用CPU的问题,内核引入了hybird poll,与传统的poll在IO提交后就立即poll不同,在hybird poll机制中引入了poll delay。假定后端设备要用10微秒才能完成一个IO,当我们在用submit_bio提交io后就开始poll,前面几us的poll就是白白浪费c原创 2020-07-13 21:23:10 · 647 阅读 · 0 评论 -
RWF_HIPRI, IOCB_HIPRI,REQ_HIPRI与Poll
NN原创 2020-07-08 22:09:10 · 980 阅读 · 0 评论 -
io_submit,io_getevents被阻塞原因分析
libaio虽然是异步direct-io,但某些情况下仍然会被阻塞。测试环境,硬盘信息:ATA HGST硬盘,6.0 Gbps SATA HDD,容量5.46TiB(6.00TB);逻辑盘信息:RAID0,容量5.457TiB,条带大小256KB,读策略Read ahead,写策略Write back;[root@localhost ~]# lsscsi[0:2:0:0] disk AVAGO MR9361-8i 4.68 /dev/sdafio测试命令:...原创 2020-07-01 18:35:03 · 3816 阅读 · 2 评论 -
io_uring相对libaio的优势
bbbb原创 2020-06-29 22:45:11 · 1758 阅读 · 0 评论 -
get_user_page
1,get_user_pages函数详解https://liujunming.top/2017/07/03/get-user-pages%E5%87%BD%E6%95%B0%E8%AF%A6%E8%A7%A3/2,页面的引用计数和get_user_pageshttps://blog.csdn.net/iteye_5014/article/details/818247393,Linux Kernel get_user_pages() 源码分析https://v1ckydxp.github.原创 2020-06-23 18:53:10 · 3213 阅读 · 1 评论 -
Asynchronous vectored I/O operations
https://lwn.net/Articles/170954/Thefile_operationsstructure contains pointers to the basic I/O operations exported by filesystems and char device drivers. This structure currently contains three different methods for performing a read operation: ...原创 2020-06-13 00:43:59 · 447 阅读 · 0 评论 -
读取bluestore数据crc检验失败,排除内核态出问题的方法
在ceph存储测试中,发现用户态通过aio读取到的bluestore数据crc检验失败,业务怀疑是内核态返回给用户的数据有问题,可在块设备的bio完成回调函数中直接读取bio对应page的数据,与用户态读取的数据比较,排除内核态的问题。上述代码中,设计proc接口aio_dev用来过滤特定块设备的数据;上述代码中,用到用户态读写操作的buffer,在io_submit_one函数中记录:首先需要在kiocb结构中,添加buf变量,...原创 2020-06-10 23:13:57 · 714 阅读 · 0 评论 -
块存储:写块设备缓存的代码注释
“块存储:AIO的直接写流程注释”中说到,如果是Direct 写,__generic_file_write_iter将首先调用generic_file_direct_write函数,然后generic_file_direct_write调用块设备的direct_io函数直接写设备,如果direct_io没有将需要写盘的数据写完,就要调用generic_perform_write函数做一次buffer write,即写page cache(块设备也是一种文件,有对应的address_space管理page c原创 2020-05-28 22:53:44 · 1431 阅读 · 1 评论 -
块存储:AIO的直接写流程注释
提交io流程中aio_write之前函数的注释,可参考“块存储:AIO的直接读流程注释”。原创 2020-05-27 21:02:52 · 1177 阅读 · 0 评论 -
bio中bi_sector扇区的转换
在"块存储:AIO的直接读流程注释"文中,描述了调用块设备__blkdev_direct_IO发起IO直读,在提交IO(io_submit)之前设置了bio的起始扇区,但这个起始扇区只是相对于块设备分区的偏移,不是相对于整个块设备或磁盘的偏移,还不能发给设备驱动执行:static ssize_t__blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages){struct file *file =...原创 2020-05-26 21:03:56 · 1546 阅读 · 1 评论 -
块存储:AIO的直接读流程注释
的原创 2020-05-23 20:07:12 · 1095 阅读 · 1 评论 -
ext4_commit_super BUG
最近在centos7.6遇到的问题,提交buffer_head时在summit_bh_wbc函数钟发生了BUG_ON,原因在于ext4的sb对应的buffer_head没有与page建立映射,运行到submit_bh_wbc函数时就出错了,社区的解决方案是,在ext4_commit_super函数中判断如果buffer_head没有映射的话,就直接退出:社区做这个修改遇到的问题是,nvme设备被热插拔了,设备已不存在,所以在同步superblock时出错了:我们遇到...原创 2020-05-10 15:20:59 · 518 阅读 · 0 评论 -
BLOCK_DUMP观察LINUX IO写入的具体文件
很多情况下开发者调测程序需要在Linux下获取具体的IO的状况,目前常用的IO观察工具用vmstat和iostat,具体功能上说当然是iostat更胜一筹,在IO统计上时间点上更具体精细。但二者都是在全局上看到IO,宏观上的数据对于判断IO到哪个文件上毫无帮助,这个时候block_dump的作用就显现出来了。一、使用方法:需要先停掉syslog功能,因为具体IO数据要通过printk输出,如果syslog存在,则会往message产生大量IO,干扰正常结果 1 2转载 2020-05-09 18:46:07 · 733 阅读 · 0 评论 -
bio sector的计算与块设备lba
在构造nvme cmd命令的时候,使用了request的参数__sector,__data_len来设置nvme命令的lba,len值。request的参数__sector,__data_len是怎么得到的呢?原创 2020-05-07 22:54:31 · 676 阅读 · 0 评论