Linux 磁盘读写参数设置

本文介绍通过调整Linux内核参数提升Android系统中eMMC、SDIO及USB存储设备读写性能的方法。针对dirty_ratio、dirty_background_ratio等关键参数进行了详细解析,并提供了具体的设置建议。

磁盘读写参数设置

现象:
在Android 4.2.1 中遇到 turn on USB Storage (打开MSC)时,eMMC ,SDIO, USB 数据读写慢的问题。

系统启动后,# cat /proc/sys/vm/dirty_ratio, 为20
在turn on USB Storage后, 其值变为 0 ,系统读写较慢
通过设置
echo 5 > /proc/sys/vm/dirty_ratio , 系统 读写速度提高

分析:  参考http://hi.baidu.com/roxws/item/4fb9fe2c368fdbd00e37f9e9

1). 2.6内核下/proc/sys/vm/dirty_ratio

这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,:

echo '1' > /proc/sys/vm/dirty_ratio

2). /proc/sys/vm/dirty_background_ratio

这个参数控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候,pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,:

echo '1' > /proc/sys/vm/dirty_background_ratio
3). /proc/sys/vm/dirty_writeback_centisecs


这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。设置方法如下:

echo "100" > /proc/sys/vm/dirty_writeback_centisecs

如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值:

echo "1000" > /proc/sys/vm/dirty_writeback_centisecs

4). /proc/sys/vm/dirty_expire_centisecs

这个参数声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。

echo "100" > /proc/sys/vm/dirty_expire_centisecs

当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。


5)           /proc/sys/vm/vfs_cache_pressure

该文件表示内核回收用于directory和inode   cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode   cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode   cache;增加该值超过100,将导致内核倾向于回收directory和inode   cache

缺省设置:100


6)           /proc/sys/vm/min_free_kbytes

该文件表示强制Linux   VM最低保留多少空闲内存(Kbytes)。

缺省设置:724(物理内存)


7)           /proc/sys/vm/nr_pdflush_threads

该文件表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。

缺省设置:2(只读)

8)           /proc/sys/vm/overcommit_memory

该文件指定了内核针对内存分配的策略,其值可以是0、1、2。

0,   表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1,   表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2,   表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。

缺省设置:0


9) /proc/sys/vm/overcommit_ratio

该文件表示,如果overcommit_memory=2,可以过载内存的百分比,通过以下公式来计算系统整体可用内存。

系统可分配内存=交换空间+物理内存*overcommit_ratio/100

缺省设置:50(%)


10)   /proc/sys/vm/page-cluster

该文件表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。

缺省设置:3(2的3次方,8页)


12)   /proc/sys/vm/swapiness

该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。



参 考
深入理解Linux内核---页高速缓存



<think> 首先,用户在询问“获取Linux磁盘读写信息的方法”。我需要基于提供的引用来回答这个问题。引用来自于之前的上下文,我需要整合这些信息来提供一个全面的回答。 回顾引用: - 引用[1]:提到使用dd命令测试磁盘读写性能,例如:`dd if=/dev/zero of=/dev/hda1 bs=1k count=10000` 和 `dd if=/dev/zero of=/volume1/testfile.txt bs=32k count=40k oflag=dsync`。[^1] - 引用[2]:讨论了测试磁盘I/O性能的方法,包括dd命令、fio工具和bonnie++工具。[^2] - 引用[3]:描述了使用iotop命令监控磁盘读写速率,包括总速率、实际速率等指标。[^3] - 引用[4]:解释了Linux磁盘读写缓存,以及如何设置直接I/O。[^4] - 引用[5]:提到了在Qt中获取磁盘读写速度的方法,使用了qDebug输出读写速率。[^5] 用户的问题焦点是“获取Linux磁盘读写信息”,不仅仅是测试性能,还包括监控。我应该覆盖各种方法: 1. **命令行工具**:如dd、fio、bonnie++用于测试性能。 2. **监控工具**:如iotop用于实时监控。 3. **其他方法**:如/proc文件系统或脚本。 系统指令要求: - 使用中文回答。 - 行内数学表达式用$...$。 - 独立公式用$$...$$并单独成段(但这里可能不涉及复杂公式)。 - LaTeX语法正确。 - 生成相关问题。 - 引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,逐步解决问题。 - 基于引用内容,确保真实可靠。 结构回答: 1. **引言**:简要解释获取磁盘读写信息的重要性。 2. **方法分类**: - **测试性能**:如dd命令。 - **实时监控**:如iotop。 - **其他工具**:如fio、bonnie++。 - **系统文件**:如/proc/diskstats。 3. **详细解释每种方法**:提供命令示例。 4. **总结**:推荐常用方法。 5. **生成相关问题**:基于内容,列出几个相关问题。 确保引用正确: - 当提到dd命令时,引用[1]。 - 提到iotop时,引用[3]。 - 提到缓存时,引用[4]。 - 提到其他工具时,引用[2]。 用户说参考站内引用,但这些引用是给定的,我需要基于它们回答。用户的问题是如何获取信息,所以我应该覆盖测试和监控。 关键方法: - **dd命令**:用于简单读写测试。[^1] - **iotop命令**:用于实时监控磁盘I/O。[^3] - **fio和bonnie++**:更高级的测试工具。[^2] - **系统文件**:如/proc/diskstats,可用于脚本监控。[^3]参考了iotop,但/proc文件系统可以派生。 - **编程方式**:如Qt中获取,类似[^5]。 在回答中自然地添加引用标识: - 例如,“使用dd命令可以进行简单的磁盘读写测试[^1]。” 生成相关问题: - 至少三个问题,类似示例。 - 例如: 1. 如何解释iotop的输出? 2. dd命令中的参数如何优化以获得准确结果? 3. 在Linux中如何避免磁盘读写缓存的干扰? 最终回答使用中文。 </think> ### 获取Linux磁盘读写信息的方法 在Linux系统中,获取磁盘读写信息(包括读写速度、延迟、吞吐量等)是系统监控和性能优化的关键步骤。这些信息可以通过命令行工具、系统文件或第三方工具获取。以下是基于参考引用的详细方法分类和步骤描述,确保真实可靠。方法分为测试性能(主动负载测试)和实时监控(被动观察)两类。 #### 1. **使用命令行工具测试磁盘读写性能** 这些工具通过模拟I/O负载来测量磁盘读写速度、延迟等指标。适用于基准测试或性能评估。 - **dd命令**:简单测试读写速度。命令格式为 `dd if=[输入源] of=[输出目标] bs=[块大小] count=[块数] [可选参数]`。例如: - 测试写入速度(写入/dev/hda1分区): ```bash dd if=/dev/zero of=/dev/hda1 bs=1k count=10000 ``` 输出结果包括传输速率(如`10000 bytes copied, 0.123456 s, 81.0 MB/s`),表示平均写入速度[^1]。 - 测试读取速度并避免缓存影响(使用`oflag=dsync`确保直接I/O): ```bash dd if=/volume1/testfile.txt of=/dev/null bs=32k count=40000 oflag=dsync ``` 此命令测试实际磁盘读取速率,忽略系统缓存[^1][^4]。 - **注意**:`dd`测试简单但可能不精确,需多次运行取平均值;输出文件应为空分区或临时文件,避免数据丢失。 - **fio工具**:高级I/O测试工具,适用于复杂负载场景(如随机读写、多线程)。安装命令:`sudo apt-get install fio`(Debian/Ubuntu)或 `sudo yum install fio`(CentOS)。示例测试随机读写: ```bash fio --name=randrw --ioengine=libaio --rw=randrw --bs=4k --size=1G --numjobs=4 --runtime=60 --time_based --group_reporting ``` 输出包括读写吞吐量(IOPS)和延迟,适合评估存储子系统性能[^2]。 - **bonnie++工具**:专注于文件系统性能测试,支持多线程和文件操作。安装:`sudo apt-get install bonnie++`。示例: ```bash bonnie++ -d /tmp -s 2G -n 0 -m test -f -b -u root ``` 结果包括顺序读写速度、随机读写性能等指标[^2]。 #### 2. **实时监控磁盘读写信息** 这些方法用于持续监控系统运行时的磁盘活动,输出实时速率、延迟和应用级I/O数据。 - **iotop命令**:交互式工具,实时显示每个进程的磁盘读写速率。安装:`sudo apt-get install iotop`。运行: ```bash sudo iotop ``` 输出列包括: - `TID/PID`:线程/进程ID。 - `DISK READ`:读取速率(KB/s)。 - `DISK WRITE`:写入速率(KB/s)。 - `SWAPIN`:交换使用率。 - `IO>`:I/O等待百分比。 按`o`键过滤仅显示活跃I/O进程,帮助诊断瓶颈[^3]。 - **查看/proc文件系统**:直接读取系统文件获取原始数据。例如: - `/proc/diskstats`:包含所有磁盘设备的读写统计(如读次数、写次数、扇区数)。 ```bash cat /proc/diskstats ``` 输出格式为:`设备号 读操作数 读扇区数 写操作数 写扇区数`,可用于脚本计算实时速率[^3]。 - 结合脚本计算速率:例如,用Shell脚本读取`/proc/diskstats`的变化: ```bash #!/bin/bash interval=1 # 采样间隔(秒) device="sda" # 磁盘设备名 prev_read=$(grep $device /proc/diskstats | awk '{print $6}') prev_write=$(grep $device /proc/diskstats | awk '{print $10}') sleep $interval current_read=$(grep $device /proc/diskstats | awk '{print $6}') current_write=$(grep $device /proc/diskstats | awk '{print $10}') read_rate=$(( (current_read - prev_read) * 512 / interval / 1024 )) # 转换为KB/s write_rate=$(( (current_write - prev_write) * 512 / interval / 1024 )) echo "读速率: ${read_rate} KB/s, 写速率: ${write_rate} KB/s" ``` 此脚本输出每秒读写速率[^3][^5]。 #### 3. **其他方法** - **避免缓存影响**:Linux默认使用磁盘缓存加速读写。要获取真实磁盘性能,需在测试时启用直接I/O(如dd的`oflag=dsync`或fio的`direct=1`参数)[^4]。 - **编程接口**:在应用中通过系统调用或库获取。例如,在Qt中,用`QStorageInfo`和`QProcess`读取`/proc`数据: ```cpp // 示例Qt代码片段获取磁盘读写速率(类似引用[5]) QProcess process; process.start("iostat -dkx 1 2"); // 使用iostat工具 process.waitForFinished(); QString output = process.readAllStandardOutput(); // 解析输出获取读写速率 ``` 输出读写速率(单位KB/s),适用于开发监控工具[^5]。 #### 总结与建议 - **简单测试**:优先使用`dd`命令快速检查读写速度[^1]。 - **精确评估**:选择`fio`或`bonnie++`进行负载测试[^2]。 - **实时监控**:`iotop`或自定义脚本读取`/proc/diskstats`最有效[^3]。 - **注意事项**:测试时确保磁盘未满,避免影响系统;监控工具需root权限。真实环境中,多次测试取平均值以提高准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值