文件系统与存储
文章平均质量分 77
介绍linux内核文件系统和存储的内容
nginux
阿里巴巴
展开
-
linux的dirty page回写磁盘过程中是否允许并发写入更新page?
众所周知Linux内核write系统调用采用pagecache机制加速写入过程,避免write系统调用长时间block应用进程,用户态进程执行write调用的时候,内核只是将用户态buffer copy到内核的pagecache当中,write系统调用就返回了,完全不需要等待数据完全写入存储设备,因为存储设备是的写入可能是个耗时很长的过程。内核正在回写page到存储设备的过程中,是否允许应用层同时更新page内容?应用层更新page是否会被block?本文将从理论和内核源码两个方面彻底分析该问题。原创 2023-09-10 07:59:17 · 510 阅读 · 0 评论 -
ext4 buddy块分配算法源码剖析
ext4 mballoc之buddy算法_nginux的博客-CSDN博客。原创 2023-07-23 23:07:38 · 204 阅读 · 0 评论 -
ext4 - mballoc块分配机制
ext4为了尽量避免block管理的碎片化有如此措施:1.mballoc多块分配器。原创 2023-07-23 19:02:19 · 1003 阅读 · 0 评论 -
ext4 mballoc之buddy算法
ext4_mb_init_cache,而是ext4_mb_load_buddy就会调用ext4_mb_init_cache,这里init cache就是指保存磁盘data block bitmap的pagecache和buddy bitmap。ext4_mb_init_group和ext4_mb_load_buddy都会调用ext4_mb_init_cache,我们就以ext4_mb_init_group调用为启动分析。原创 2023-07-23 15:55:53 · 452 阅读 · 0 评论 -
ext4 delay allocation之ext4_writepages页回写源码剖析
ext4 write写入pagecache之后,再合适的时机会回写到磁盘,ext4文件系统中是通过ext4_writepages写入磁盘,本来将在源码角度分析该过程。建议先参照ext4 - delay allocation数据结构_nginux的博客-CSDN博客看下涉及的重要数据结构。原创 2023-07-23 01:03:21 · 396 阅读 · 0 评论 -
ext4 - delay allocation数据结构
延迟分配delay allocation是ext4非常重要的特性,启用该特性write系统将用户空间buffer写入内存page cache中即返回,此时也不会真正进行磁盘block分配,而是延迟到磁盘回写时(比如dirty ratio达到一定值,定时刷新,主动sync等) 才开始映射磁盘block(map block)进行块分配,好处就是可以将连续的块进行合并merge,结合ext4的mballoc多块分配机制,可以一次性分配多个物理block,降低cpu使用率和碎片化问题。原创 2023-07-22 15:22:12 · 652 阅读 · 0 评论 -
Linux pagecache writeback的一个性能优化patch分析
用来主要降低设备IO拥塞时,由于jdb transaction commit引起的性能问题,如果page cache不需要执行block allocation和extent conversion逻辑,就先将这部分dirty page submit交给块设备层,然后复用一个transcation即可。buffer_unwritten(bh)逻辑,命中map->m_len = 0逻辑返回true。mpage_add_bh_to_extent会返回true,会进入的mpage_submit_page逻辑。原创 2023-07-17 16:10:59 · 189 阅读 · 0 评论 -
Ext4文件系统介绍 - 实战篇
红框的f30a对应上图的extent_header,根据ext4理论篇中的定义我们知道extent_header数据结构如下:正好f30A对应extent_header的magic number。我们知道inode是存储在inode table中,每个inode size 是256B,所以我们怎么找到inode table的block号?dumpe2fs命令!本文主要通过dd,hexdump和dumpe2fs工具分析ext4的磁盘二进制数据,加深对ext4文件系统的印象,要想理解本建议先阅读下。原创 2023-07-14 21:34:31 · 529 阅读 · 0 评论 -
Linux 读文件 - readahead预读算法
根据ondemand_readahead中initial_readahead label处逻辑看,ra->size是由get_init_ra_size函数计算,该函数第一个参数是应用read的数据页(每个数据页4K)的数量,该场景每次读取4K bytes,相当于调用get_init_ra_size(1,32)返回4。这里async readahead就是指generic_file_buffered_read函数中的:page_cache_async_readahead函数调用。: 开始预读的数据页索引,原创 2023-07-02 22:46:16 · 728 阅读 · 0 评论 -
buffer_head数据结构
buffer_head用来将一个单独的block映射到一个page,一般80x86体系结构上,根据block size大小,一个page可以包含1-8个block,比如如果block size = 1K,那么一个缓存page缓存4个block,且buffer_head是文件系统和block layer的io基本单位。假设page size = 4K, block size = 1K。bio取代了buffer_head作为io基本单位。原创 2023-07-01 16:55:28 · 765 阅读 · 0 评论 -
Ext4文件系统介绍 - 理论篇
但是,ext4_inode_info没有定义指向ext4_inode的字段,只是拷贝了ext4_inode的i_block,i_flags等字段;ext4_sb_info和ext4_super_block中的很多字段相似,但也有区别,ext4_sb_info中的很多字段是根据ext4_super_block的字段计算而得,虽然可以通过 ext4_super_block计算而得到,但是定义在ext4_sb_info定义可以省去重复计算的时间。磁盘数据的每个inode通过ext4_inode数据结构表示。原创 2023-07-09 21:46:39 · 2302 阅读 · 0 评论 -
Linux iowait到底是什么含义
IOwait 一个迷之参数,top/iostat/mpstat/sar 都会统计的关键数据,字面理解是系统等待IO的时间,经常用于反映系统IO压力。IOwait时候CPU在干什么?什么时间才算IOwait,到底在wait什么?转载 2023-07-08 07:56:50 · 590 阅读 · 0 评论 -
Linux read的核心函数generic_file_buffered_read
【代码】Linux read的核心函数generic_file_buffered_read。原创 2023-07-02 16:19:27 · 469 阅读 · 0 评论 -
新文件创建inode分配路径
inode的ops赋值在ext4_create函数中。原创 2023-06-25 17:40:21 · 70 阅读 · 0 评论 -
Linux bio数据结构
代码中newblock=map->m_lblk - ee_block + ee_start即是起始逻辑地址映射的磁盘块地址,allocated = ee_len - (map->m_lblk - ee_block)是成功映射的block数,注意未必等于map.m_len,有可能小于map.m_len,因为磁盘block未必有map.m_len个连续的块。ext4_mpage_readpages函数就会读取磁盘数据就会构建一个个的bio,如上面描述我们知道bio指向的是一块连续的磁盘数据,原创 2023-07-08 01:43:15 · 661 阅读 · 0 评论 -
Linux vfs各种operation操作介绍
由于目录也是一种文件,而目录操作和普通文件操作不同,所以文件系统需要定义两种file_operations,创建普通文件和目录文件时候都要创建inode对象,inode对象中包含两个重要的成员:i_op和i_fop,分别代表inode_operations和file_operations,要根据不同文件类型,给其inode赋予不同的结构体: 通过strace观察ls命令分两步:1)打开目录 2)读取遍历目录2.1.1 打开目录:openat对应的操作调用栈可以看到调用路径:vsys_openat ->原创 2023-06-26 21:50:19 · 351 阅读 · 0 评论 -
Linux源码编译开启cgroup blk限制io性能
经过上面的mout之后就可以看到/sys/fs/cgroup/blkio中出现了各种控制节点。原创 2023-07-01 13:47:14 · 502 阅读 · 0 评论