LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2309|回复: 8

彻底搞定linux下硬盘DMA工作模式

[复制链接]
发表于 2004-5-22 20:56:23 | 显示全部楼层 |阅读模式
系统:slackware9.1,硬盘西部数据80G,内核2.6.6

装完系统后,第一次打开应用程序总是特别的慢,而且从windows分区拷贝文件也是特别慢,同一台机器装的magiclinux就没有这个问题。怀疑是硬盘的DMA没有设置好,而记得当初编译2.6.6内核的时候选择了默认打开硬盘的DMA模式,尝试解决这个问题:

从网上搜索相关发现有hdparm命令可以用,用法如下:

#hdparm -i /dev/hda 查看硬盘的物理参数和支持的工作模式
#hdparm -v /dev/hda 查看当前硬盘的工作模式
#hdparm -Tt /dev/hda 测试一下优化前和优化后的硬盘读写速率

测试了自己的硬盘:
Timing buffered disk reads: 64 MB in 24 seconds = 2.5 MB/sec
只有可怜的2.5MB,肯定了自己的猜测。

那就接着根据网上搜到的命令用hdparm命令来把它调好:
#hdparm -d1 -c3 -X66 -m16 /dev/hda
可是出现了以下字符:
/dev/hda:
setting using_dma to 1 (on)
HDIO_SET_DMA failed: Operation not permitted
using_dma = 0 (off)

然后测试硬盘速度还是可怜的2.5MB,尝试失败。
于是仔细研究这些参数的意义:
# /sbin/hdparm -x66 -d1 -u1 -m16 -c3 /dev/hda
选项说明:
① c3 :就是把硬盘的16位格式转换为32位模式(32-bit mode w/sync)。控制数据如何从pci总线传递到控制器。
② m16 :改变硬盘的多路扇区的读功能,-m16可以使得硬盘在一次i/o中断中读入16个扇区的数据。但是不是所有的硬盘都支持这个功能。使用hdparm -i /dev/hda 可以察看您的硬盘最大能读写的扇区数目。
③ d1:打开DMA模式。
④ x66 :在支持UDMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。X34 在支持DMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。支持 ATA33 可以加上 -X66 这个参数,ATA66则是 -X68,-X69是mode 5(ATA100), -X68是mode 4(ATA66)可用于光驱。
⑤ u1 :Linux在处理磁盘中断时,可以unmask其他的中断或者响应其他中断相关的任务。
于是不断的拿X66.X68.X69等参数来实验后立即用#hdparm -tT /dev/hda来测试性能,仍然不成功。再找网上的方法,有如下:

1./etc/rc.d/rc.local 最后面加上一行
/sbin/hdparm -d1 -c3 -X66 -m16 -q /dev/hda
建议加上-q参数,因为man里面说的,这样可以开机即是DMA模式,不用手动设定,但此方法和命令其实是一样的,解决不了我的问题。

2.修改/etc/sysconfig/harddisks也可以打开DMA模式
我的slackware9.1没有这个文件,不行。

3.要靠手工在/etc/conf.d/hdparm里面写好,然后rc-update add hdparm default。
和方法1目的一样,对我没有。

4.编辑/etc/conf.d/local.start加入
hdparm -d1 -c1 -X69 /dev/hda 重启即可,也类似方法3

5.#hdparm -d1 -c1 -X69 -k1 -K1 /dev/hda
直接命令设定,比较简单,但对偶还是没用。

再搜,有人说要重新编译内核才行,我只好重新编译,幸亏有原来编译备份的.config文件,在相关的地方好像是IDE chipset support根据感觉选了一通,重新生成bzImage,重启电脑,还是失败,,,,,

不甘心,继续努力在网上找答案,来到linuxsir.cn用搜索功能的只搜主题选项,搜索“硬盘DMA”,把所有的结果仔细看了一遍,发现解决办法还是要编译内核,但之前要运行#lspci命令来确定自己电脑的IDE控制芯片是什么。
运行#lspci,结果如下:
00:00.0 Host bridge: Advanced Micro Devices [AMD] AMD-760 [IGD4-1P] System Controller (rev 13)
00:01.0 PCI bridge: Advanced Micro Devices [AMD] AMD-760 [IGD4-1P] AGP Bridge
00:07.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 40)
00:07.1 IDE interface: VIA Technologies, Inc. VT82C586/B/686A/B PIPC Bus Master IDE (rev 06)
00:07.2 USB Controller: VIA Technologies, Inc. USB (rev 1a)
00:07.3 USB Controller: VIA Technologies, Inc. USB (rev 1a)
00:07.4 SMBus: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 40)
00:09.0 Multimedia audio controller: C-Media Electronics Inc CM8338A (rev 10)
00:0d.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
00:13.0 Unknown mass storage controller: Triones Technologies, Inc. HPT366/368/370/370A/372 (rev 04)
01:05.0 VGA compatible controller: nVidia Corporation NV20 [GeForce3 Ti 200] (rev a3)

找到答案,我编译内核凭的是模糊的记忆,没有真正按照自己的硬件来编译,结果造成IDE interface: VIA Technologies, Inc. VT82C586/B/686A/B PIPC Bus Master IDE 没有编译进支持,导致DMA不可用。接下来就好办了,重新编译内核,重启电脑,测试结果如下:
#hdparm -tT /dev/hda
/dev/hda:
Timing buffer-cache reads: 128 MB in 0.57 seconds =225.78 MB/sec
Timing buffered disk reads: 64 MB in 1.74 seconds = 36.81 MB/sec
终于搞定,而且2.6内核是自动开机即运行,默认开启DMA,所以不用做任何设置了。
使用了google,linuxsir.cn等相关网站资料,并看了LINUX系统性能调谐,链接地址为:http://www-900.ibm.com/developer ... ent/tune/index.shtm

by:uniboy @ 2004.5.22l
发表于 2004-5-22 21:27:41 | 显示全部楼层
好,支持兄弟那种热心治学的精神。
ps:末尾的链接好像无效。
发表于 2004-5-22 21:40:40 | 显示全部楼层
shtml后缀比较多,shtm几乎没见过,所以改一下就行了(这个因果律好像有些问题:p )
发表于 2004-5-24 09:44:13 | 显示全部楼层
楼主,hdparm中有个参数-k (set drive keep_settings_over_reset flag (0/1)),好像是让磁盘记住设置,那么这和把 hdparm -X69 -u1 -c3 -q /dev/hda写入/etc/rc.d/rc.local
有什么区别?
还有-k    -K(大小写不同)有什么区别?我的磁盘hdparm -i /dev/hda中
UDMA modes: udma0 udma1 udma2 udma3 *udma4 udma5
我把xfermode 设为69(udma5)行吗?udma4前面的*又是什么意思?
不胜感激!
发表于 2004-5-24 10:07:15 | 显示全部楼层
我觉得hdparm -t /dev/hda时有太多的外界因素介入,直接影响测试结果.所以我提醒大家一定要多测几次,且最好是系统干净启动后测试,测试时不要有任何其它动作,大家看看我这个图就知了(刚开始是越测越快,稳定后在一个定值附近波动,如果有切换窗口的行为,测试数据就狂降!)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2004-5-24 10:08:28 | 显示全部楼层

-k -K参数应该在man里有

udma4前面的*指的是你的硬盘当前工作在udma4状态下
如果你的硬盘和系统总线支持udma5当然可以,现在较新的机器应该都可以,你可以看一下你的主板说明和硬盘参数。
但笔记本上还是小心点好,虽然我的笔记本硬盘可以支持udma4,但主板只支持udma3,所以就工作在udma3好了,其实只要dma打开了,硬盘性能基本就很好了。
发表于 2004-5-24 12:02:04 | 显示全部楼层
2.6的内核只要编译内核时选了dma自动支持的话开机时都可以自动开启dma的

我以前用2.4内核时写了个启动脚本来开机自动开启dma ( hdparm -d1 /dev/hda )
后来升级到2.6后也没再动过,结果硬盘一直出错,还以为硬盘要坏了,后来把那个脚本给关掉后就好了

今天看到这贴,用hdparm /dev/hda查看了一下,发现dma居然是on,这才反映过来,出错是因为dma已经自动打开了又用hdparm打开造成的
发表于 2004-6-3 07:54:41 | 显示全部楼层

我的正常吗?

[root@test root]# hdparm -Tt /dev/hda

/dev/hda:
Timing buffer-cache reads:   128 MB in  0.94 seconds =136.17 MB/sec
Timing buffered disk reads:  64 MB in  1.66 seconds = 38.55 MB/sec
[root@test root]#
发表于 2004-6-8 13:29:21 | 显示全部楼层
[root@localhost root]# hdparm -v  /dev/hda

/dev/hda:
multcount    = 16 (on)
IO_support   =  0 (default 16-bit)
unmaskirq    =  0 (off)
using_dma    =  1 (on)
keepsettings =  0 (off)
readonly     =  0 (off)
readahead    = 256 (on)
geometry     = 16383/255/63, sectors = 234441648, start = 0
[root@localhost root]# hdparm -Tt  /dev/hda

/dev/hda:
Timing buffer-cache reads:   1324 MB in  2.00 seconds = 660.78 MB/sec
Timing buffered disk reads:    8 MB in  3.12 seconds =   2.56 MB/sec
我的这样子,怎么回事?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表