一、linux下测试磁盘的读写IO速度
- 有时候我们在做维护的时候,总会遇到类似于IO特别高,但不能判定是IO瓶颈还是软件参数设置不当导致热盘的问题.这时候通常希望能知道磁盘的读写速度,来进行下一步的决策.
- 下面是两种测试方法:
- (1)使用hdparm命令
- 这是一个是用来获取ATA/IDE硬盘的参数的命令,是由早期Linux IDE驱动的开发和维护人员 Mark Lord开发编写的( hdparm has been written by Mark Lord <mlord@pobox.com>, the primary developer and maintainer of the (E)IDE driver for Linux, with suggestions from many netfolk).该命令应该也是仅用于Linux系统,对于UNIX系统,ATA/IDE硬盘用的可能比较少,一般大型的系统都是使用磁盘阵列的.
- 使用方法很简单
- # hdparm -Tt /dev/sda
- /dev/sda:
- Timing cached reads: 6676 MB in 2.00 seconds = 3340.18 MB/sec
- Timing buffered disk reads: 218 MB in 3.11 seconds = 70.11 MB/sec
- 可以看到,2秒钟读取了6676MB的缓存,约合3340.18 MB/sec;
- 在3.11秒中读取了218MB磁盘(物理读),读取速度约合70.11 MB/sec
- (2)使用dd命令
- 这不是一个专业的测试工具,不过如果对于测试结果的要求不是很苛刻的话,平时可以使用来对磁盘的读写速度作一个简单的评估.
- 另外由于这是一个免费软件,基本上×NIX系统上都有安装,对于Oracle裸设备的复制迁移,dd工具一般都是首选.
- 在使用前首先了解两个特殊设备
- /dev/null 伪设备,回收站.写该文件不会产生IO
- /dev/zero 伪设备,会产生空字符流,对它不会产生IO
- 测试方法:
- a.测试磁盘的IO写速度
- # time dd if=/dev/zero of=/test.dbf bs=8k count=300000
- 300000+0 records in
- 300000+0 records out
- 10.59s real 0.43s user 9.40s system
- # du -sm /test.dbf
- 2347 /test.dbf
- 可以看到,在10.59秒的时间里,生成2347M的一个文件,IO写的速度约为221.6MB/sec;
- 当然这个速度可以多测试几遍取一个平均值,符合概率统计.
- b.测试磁盘的IO读速度
- # df -m
- Filesystem 1M-blocks Used Available Use% Mounted on
- /dev/mapper/VolGroup00-LogVol00
- 19214 9545 8693 53% /
- /dev/sda1 99 13 82 14% /boot
- none 506 0 506 0% /dev/shm
- # time dd if=/dev/mapper/VolGroup00-LogVol00 of=/dev/null bs=8k
- 2498560+0 records in
- 2498560+0 records out
- 247.99s real 1.92s user 48.64s system
- 上面的试验在247.99秒的时间里读取了19214MB的文件,计算下来平均速度为77.48MB/sec
- c.测试IO同时读和写的速度
- # time dd if=/dev/sda1 of=test.dbf bs=8k
- 13048+1 records in
- 13048+1 records out
- 3.73s real 0.04s user 2.39s system
- # du -sm test.dbf
- 103 test.dbf
- 上面测试的数据量比较小,仅作为参考.
- 相比两种方法:
- 前者是linux上专业的测试IDE/ATA磁盘的工具,但是使用范围有局限性;(此试验仅仅使用了测试磁盘IO的参数,对于其他参数及解释参考man手册)
- 后者可以通用,但不够专业,也没有考虑到缓存和物理读的区分,测试的数据也是仅作参考,不能算是权威.
二、linux 下 find 命令的高级用法
- 以前写过一篇find命令的初级用法,今天总结下它的一些高级用法;先附上以前那篇find的文章链接:
- http://blog.chinaunix.net/uid-24485075-id-2211571.html
- 1. 首先介绍一个-exce参数它可以在搜索的结构中使用shell命令:
- find PATH OPTION [-exec COMMAND { } \;]
- 注意格式要正确:"-exec 命令 {} \;" 在}和\之间一定要有空格才行;
- {}表示命令的参数即为所找到的文件;命令的末尾必须以“ \;”结束。
- 例子1:在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
- find / -name "test-find.c" -type f -mtime 3 -user greek -prune
- /root/bin -print
- 对上述例子搜索出来的文件进行删除操作,命令如下:
- find / -name "test-find.c" -type f -mtime 3 -user greek -prune /root/bin -exec rm {} \;
- 例子2:为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
- find / -type f -size 0 -exec ls -l { } \;
- 2.再来看看xargs参数,在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
- find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
- 在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
- 而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
- 来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
- 下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
- find . -type f -print | xargs file
- ./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
- ./.kde/Autostart/.directory: ISO-8859 text\
- ......
- 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
- find / -name "core" -print | xargs echo "" >/tmp/core.log
- 上面这个执行太慢,我改成在当前目录下查找
- find . -name "file*" -print | xargs echo "" > /temp/core.log
- cat /temp/core.log
- ./file6
- 3.使用find查找文件的时候怎么避开某个文件目录,那就得看prune这个参数了。
- 比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
- find /usr/sam -path "/usr/sam/dir1" -prune -o -print
- find [-path ..] [expression] 在路径列表的后面的是表达式-path" /usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假,则求值 -print, -print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
- 这个表达式组合特例可以用伪码写为:
- if -path "/usr/sam" then
- -prune
- else
- -print
- 避开多个文件夹
- find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
- 圆括号表示表达式的结合。\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
- 查找某一确定文件,-name等选项加在-o 之后
- find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print
- 我们已经看过了 find 命令的一些更加有用以及有点难懂的功能,但是 find 还可以执行更多的任务。例如,有多个选项可以使 find 与较低的 UNIX 版本和其他操作系统相兼容并允许您执行打印输出到多个文件等操作。
三、linux 下硬链接和软连接- 硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用
- 软连接:也称符号连接,新建的文件以“路径”的形式来表示另一个文件,和windows的快捷方式类似,新建的软连接可以之间不存在的文件
- n
- 这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这
- 个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。
- 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要
- 在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。例
- 如:ln -s /bin/less /usr/local/bin/less
- -s 是代号(symbolic)的意思。
- 这里有两点要注意:
- 第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
- 第二,ln的链接又软链接和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会
- 占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链
- 接还是硬链接,文件都保持同步变化。
- 第三,软链接是可以跨分区的,但是硬链接只能在同一分区内。
- 如果你用ls察看一个目录时,发现有的文件或文件夹的颜色和别的不一样,我机子上是蓝色的,那就是一个用ln命令生成的文件,用ls -l命令去察看
- ,就可以看到显示的link的路径了。
- 1、硬链接和原来的文件没什么区别,共享一个inode号(文件在文件系统上的唯一标识),软连接不共享inode,和原文件对应的inode有区别。
- 2、若原文件被删除,软连接不在可以访问,而硬链接可以访问。
- ln -s 源文件 目标文件
posted on 2012-07-12 22:19
kxbin 阅读(255)
评论(0) 编辑 收藏 所属分类:
转发 、
Linux