免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6782 | 回复: 11
打印 上一主题 下一主题

关于dd速度的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-05 14:37 |只看该作者 |倒序浏览
最近碰到了一个问题.
在三台不同的机上,运行同一个脚本,在运行到dd这句时,速度差了非常多.(我dd语句的参数bs都是取1)
脚本运行的目录,均为/home/gy/job目录下,dd的输出文件也是放在目录下,dd的输入文件,则是放在/data目录下

语句: dd if=$1 of=$dp bs=1 skip=$(($(wc -c "$1"|awk '{print $1}')-2048+11)) count=12

/***********************************/
机器1:
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup_ID_29812-LogVol1
                     119339260  34774080  78503100  31% /
/dev/sda3               194449     14214    170195   8% /boot
none                    994808         0    994808   0% /dev/shm
/dev/mapper/VolGroup_ID_29812-LogVol3
                       6386192   3171924   2889868  53% /usr
/dev/mapper/VolGroup_ID_29812-LogVolHome
                      10321208   4572636   5224284  47% /home
/***********************************/

/***********************************/
机器2:
Filesystem    512-blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4       209715200  24745944   89%  1193733    30% /
/dev/hd2        12582912   2708632   79%    33947    11% /usr
/dev/hd9var       524288    267704   49%      895     3% /var
/dev/hd3          524288    131248   75%     1058     7% /tmp
/dev/fwdump      1048576   1047760    1%        4     1% /var/adm/ras/platform
/dev/hd1          524288    173800   67%      245     2% /home
/proc                  -         -    -         -     -  /proc
/dev/hd10opt     8912896   6593016   27%     5876     1% /opt
/dev/fslv01   1254096896 296896640   77%    66766     1% /oradata
/dev/vx/dsk/dg2/app1  503296000 459251862    9%     2532     1% /app1
/dev/vx/dsk/dg2/data1 2205465696 662361536   70%   105922     2% /data1
/***********************************/

/*************************************/
机器3:
Filesystem    512-blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4       209715200 201202392    5%     4549     1% /
/dev/hd2         9961472    749736   93%    30383    26% /usr
/dev/hd9var      6291456   1939560   70%    94878    31% /var
/dev/hd3         4194304   3083944   27%      222     1% /tmp
/dev/fwdump      1048576   1047760    1%        4     1% /var/adm/ras/platform
/dev/hd1          524288    310640   41%     1165     4% /home
/proc                  -         -    -         -     -  /proc
/dev/hd10opt     2097152    136384   94%     5740    26% /opt
/dev/vx/dsk/fjcj/app  524288000 305641924   42%  3395535    15% /app
/dev/vx/dsk/fjcj/data 6479960064 1256161044   81% 23926583    23% /data
/*************************************/

三台机器,运行同样的语句,速度是递减的,机器3运行那个dd语句是最慢的,需要20多秒.
后来我测试了另一条dd语句:dd if=$1 of=$dp bs=1 skip=$((2048*i+20+${diff}*186)) count=186
这条语句在三台机器上的差别就没那么离谱了.想想应该是count值影响的.

请问下大家,有哪些因素会影响到dd的速度?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-04-05 16:59 |只看该作者
跟磁盘读写的速度有关吧

论坛徽章:
0
3 [报告]
发表于 2008-04-05 22:16 |只看该作者
你怎么会要用bs=1呢。
我在一台SCO服务器上试过从bs=1b(即512字节)与到10k差别很大,10k与100k差别不明显。

论坛徽章:
0
4 [报告]
发表于 2008-04-05 23:07 |只看该作者
原帖由 zhangshebao 于 2008-4-5 22:16 发表
你怎么会要用bs=1呢。
我在一台SCO服务器上试过从bs=1b(即512字节)与到10k差别很大,10k与100k差别不明显。


读写块的大小,为什么会影响到速度呢?不理解.另,为什么,同样是bs=1,而count值比较大的,也可以明显提升速度呢?

论坛徽章:
0
5 [报告]
发表于 2008-04-05 23:34 |只看该作者
原帖由 寂寞烈火 于 2008-4-5 16:59 发表
跟磁盘读写的速度有关吧


烈火兄,这个确实应该是一方面原因,那台机子,确实读写非常频繁.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2008-04-06 00:25 |只看该作者
相同的语句/命令在性能不同的机器上运行效果应该一样吧!

[ 本帖最后由 寂寞烈火 于 2008-4-6 00:43 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-04-06 11:57 |只看该作者
dd if=$1 of=$dp bs=1 skip=$(($(wc -c "$1"|awk '{print $1}')-2048+11)) count=12
skip是读并跳过,应该改用seek直接到指定位置取。
用wc将文件读一遍,目的仅仅是为了取文件长度,浪费了。应该改用ls -l
事实上你的文件被读了两遍。
dd if=$1 of=$dp bs=1 seek=$(ls -l "$1"|awk '{print $5-2048+11}') count=12

dd if=$1 of=$dp bs=1 skip=$((2048*i+20+${diff}*186)) count=186
skip应改为seek。不明白diff为什么不像 i 那样直接写变量名,而要用${}括起来。

不知道楼主的skip及count的值有什么特别含义,一定要这个数值吗?你试试将count的值赋给bs,将count赋1,将seek的值除以新的bs的值,看看有什么结论。
如果差别大,楼主又一定要跳过这个特定值(远大于要取的数据长度),再取特定长度数据,可以用两次dd,第1次bs取数据长的的两遍,count=1,第2次bs取1,count取所要的数据长度,从第1次dd的结果中将所要的数据筛选出来。

论坛徽章:
0
8 [报告]
发表于 2008-04-06 14:44 |只看该作者
3个系统的不同结果,主要取决系统内部对磁盘低效io要求的不同优化方法;
两次测试不同结果,主要差别在于wc及skip值的不同,它们的开销远大于取12或186字节。
bs对dd的影响,请看下面的结果(在cygwin下测试):
bash-3.2$ time dd if="新华字典 1.0.exe" of=/dev/null bs=1b
6408+0 records in
6408+0 records out
3280896 bytes (3.3 MB) copied, 0.25 s, 13 MB/s

real    0m0.265s
user    0m0.077s
sys     0m0.156s
bash-3.2$ time dd if="新华字典 1.0.exe" of=/dev/null bs=10k
320+1 records in
320+1 records out
3280896 bytes (3.3 MB) copied, 0.015 s, 219 MB/s

real    0m0.046s
user    0m0.061s
sys     0m0.016s
bash-3.2$ time dd if="新华字典 1.0.exe" of=/dev/null bs=100k
32+1 records in
32+1 records out
3280896 bytes (3.3 MB) copied, 0 s, Infinity B/s

real    0m0.031s
user    0m0.046s
sys     0m0.015s
bash-3.2$ time dd if="新华字典 1.0.exe" of=/dev/null bs=186
17639+1 records in
17639+1 records out
3280896 bytes (3.3 MB) copied, 0.734 s, 4.5 MB/s

real    0m0.766s
user    0m0.155s
sys     0m0.593s
bash-3.2$ time dd if="新华字典 1.0.exe" of=/dev/null bs=12
273408+0 records in
273408+0 records out
3280896 bytes (3.3 MB) copied, 11.078 s, 296 kB/s

real    0m11.094s
user    0m1.108s
sys     0m7.124s
bash-3.2$ time dd if="新华字典 1.0.exe" of=/dev/null bs=1
3280896+0 records in
3280896+0 records out
3280896 bytes (3.3 MB) copied, 122.234 s, 26.8 kB/s

real    2m2.250s
user    0m14.202s
sys     1m18.749s
bash-3.2$

论坛徽章:
0
9 [报告]
发表于 2008-04-06 14:59 |只看该作者
原帖由 beauty2003 于 2008-4-5 23:07 发表


读写块的大小,为什么会影响到速度呢?不理解.另,为什么,同样是bs=1,而count值比较大的,也可以明显提升速度呢?

dd每次读写1个记录大小的数据就调用低层io一次,对读写相同数量的数据,bs小了调用的次数必然就多了。低层io读写数据有最小单位,一般是512字节,bs=1时调用低层io额外的开销远大于读写1个字节本身需要的开销。
bs相同,count大了数据量就大,所用时间更多。两个结果不同不是因为count.

论坛徽章:
0
10 [报告]
发表于 2008-04-06 16:40 |只看该作者
原帖由 寂寞烈火 于 2008-4-6 00:25 发表
相同的语句/命令在性能不同的机器上运行效果应该一样吧!


可是确实效率上差了很多,其中运行最慢的那台,硬盘不是本地的硬盘,而是连接着磁盘阵列。不知道和这有没有关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP