IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / Linux Kernel and Tao
IT 2013-07-30 13:50:15 / 累计浏览 2,640

ext4+delalloc造成单次写延迟增加的分析

这篇讲的是淘宝内核组在将线上系统升级到Ext4文件系统后,发现应用写操作延迟异常增大的故障。根源在于Ext4的新特性“延迟分配”(delalloc)。 简单来说,delalloc为了优化后续的顺序访问性能,将原本每次写操作都会进行的磁盘块分配过程,推迟到了系统批量回写数据时才进行。这导致了一个关键的锁竞争问题:回写进程在批量分配磁盘块时需要持有排他写锁(i_data_sem),这个过程可能耗时较长(例如约30秒一次)。如果此时有应用程序发起新的写操作,它就必须等待这把锁释放,从而导致单次写操作的延迟被显著拉高。 作者通过fio工具进行了量化测试:开启delalloc后,虽然写操作的平均延迟更低(5.86微秒 vs 7.00微秒),但最大延迟却飙升到了193毫秒,是关闭时(16毫秒)的10倍以上。这清晰地说明了delalloc“集中处理”带来的长尾延迟问题。 对于使用Buffer IO进行追加写、不主动刷新数据且对延迟敏感的应用,这个问题会尤为突出。文章给出的解决方法是在挂载时加上`nodelloc`参数来关闭此特性。

本机暂存
IT 2012-12-23 23:39:11 / 累计浏览 3,380

通过blktrace, debugfs分析磁盘IO

这篇讲的是当磁盘利用率飙到100%、程序变卡时,如何揪出背后的“元凶”文件。作者从实际场景出发,演示了如何组合使用blktrace和debugfs这两个工具,层层追查IO的来源。 具体来说,当iostat显示磁盘压力巨大时,先用blktrace捕获块设备层的IO请求。关键点在于grep出以“A”开头的日志行,这里是原始请求的入口,能清晰看到读写操作对应的源设备扇区。接着,通过debugfs的“icheck”命令,根据扇区号换算出的文件系统块号,反查到对应的inode号。最后,用“ncheck”命令把这个inode号映射为具体的文件路径——比如例子中的“test_file”。 整个流程就像顺藤摸瓜:从设备层的扇区,到文件系统的块和inode,最终定位到用户可见的文件。拿到这个结果后,就能结合自己的应用程序,分析为什么这个文件会被频繁读写,从而进行优化。文章给出了完整的命令示例和输出解读,实操性很强。

本机暂存
IT 2012-09-18 23:17:11 / 累计浏览 3,960

Linux的IO调度器-CFQ

作者从控制IO带宽的实际需求出发,发现关于Linux IO调度器CFQ的中文资料相当稀缺,于是决定亲自撰写一个系列文章,填补这一空白。这篇系列开篇将首先厘清CFQ的基本概念——它作为Linux内核的一种IO调度策略,主要通过为每个进程分配时间片和队列来公平地调度磁盘读写请求,尤其适合多任务桌面环境。作者预告,后续文章将深入解析CFQ的各项可调参数及其对性能的影响,剖析其内部架构设计,并探讨如何与cgroup子系统结合以实现更精细的IO资源控制。整个系列旨在为需要进行IO性能调优的工程师提供一份清晰实用的中文指南。

本机暂存
IT 2012-09-18 23:14:21 / 累计浏览 3,280

free命令中的buffers和cached

这篇讲的是Linux系统中free命令输出结果里buffers和cached字段的区别。作者从同事的日常疑问出发,分享了对这两个内存管理概念的深入解析,旨在帮助读者准确理解系统内存状态。 在Linux的内存管理中,buffers指的是块设备缓冲区,主要用于缓存文件系统元数据和块I/O操作的数据,比如磁盘写入的临时存储;而cached则是页缓存,用于缓存已读取的文件内容,以提升重复访问的性能。文章详细对比了它们的实现机制:buffers通常与底层磁盘块直接关联,数据可能在系统重启后丢失;cached则基于内存页,可以持久化存储文件内容,即使进程结束后也可能保留。 关键差异在于,buffers更侧重于优化原始磁盘操作,适合频繁的读写场景,如数据库或日志处理;cached则专注于文件级别的缓存,适合多次读取相同文件的应用

本机暂存