一、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 閱讀(264)
評論(0) 編輯 收藏 所屬分類:
轉發 、
Linux