linux 硬盤性能(一) 查看

 查看Linux磁盤空間大小

一、df 命令;

df 是來自於coreutils 軟件包,系統安裝時,就自帶的;我們通過這個命令可以查看磁盤的使用情況以及文件系統被掛載的位置;

舉例:

[root@localhost beinan]# df -lh

Filesystem 容量 已用 可用 已用% 掛載點

/dev/hda8 11G 6.0G 4.4G 58% /

/dev/shm 236M 0 236M 0% /dev/shm

/dev/sda1 56G 22G 35G 39% /mnt/sda1

我們從中可以看到,系統安裝在/dev/hda8 ;還有一個56G的磁盤分區/dev/sda1掛載在 /mnt/sda1中;

其它的參數請參考 man df

二、fdsik

fdisk 是一款強大的磁盤操作工具,來自util-linux軟件包,我們在這裏只說他如何查看磁盤分區表及分區結構;參數 -l ,通過-l 參數,能獲得機器中所有的硬盤的分區情況;

[root@localhost beinan]# fdisk -l

Disk /dev/hda: 80.0 GB, 80026361856 bytes

255 heads, 63 sectors/track, 9729 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/hda1 * 1 765 6144831 7 HPFS/NTFS

/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)

/dev/hda3 2806 7751 39728745 5 Extended

/dev/hda5 2806 3825 8193118+ 83 Linux

/dev/hda6 3826 5100 10241406 83 Linux

/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris

/dev/hda8 5199 6657 11719386 83 Linux

/dev/hda9 6658 7751 8787523+ 83 Linux

在上面Blocks中,表示的是分區的大小,Blocks的單位是byte ,我們可以換算成M,比如第一個分區/dev/hda1的大小如果換算成M,應該是6144831/1024=6000M,也就是6G左右,其實沒有這麼麻煩,粗略的看一下把小數點向前移動三位,就知道大約的體積有多大了;

System 表示的文件系統,比如/dev/hda1 是NTFS格式的;/dev/hda2 表示是fat32格式的文件系統;.

在此例中,我們要特別注意的是/dev/hda3分區,這是擴展分區;他下面包含着邏輯分區,其實這個分區相當於一個容器;從屬於她的有 hda5,hda6,hda7,hda8,hda9 ;

我們還注意到一點,怎麼沒有hda4呢?爲什麼hda4沒有包含在擴展分區?一個磁盤最多有四個主分區; hda1-4算都是主分區;hda4不可能包含在擴展分區裏,另外擴展分區也算主分區;在本例中,沒有hda4這個分區,當然我們可以把其中的一個分區設置爲主分區,只是我當時分區的時候沒有這麼做而已;

再仔細統計一下,我們看一看這個磁盤是不是還有空間?hda1+hda2+hda3=實際已經分區的體積,所以我們可以這樣算 hda1+hda2+hda3=6144831+16386300+39728745 = 62259876 (b),換算成M單位,小數點向前移三位,所以目前已經劃分好的分區大約佔用體積是62259.876(M),其實最精確的計算 62259876/1024=60800.67(M);而這個磁盤大小是80.0 GB (80026361856byte),其實實際大小也就是78150.744(M);通過我們一系列的計算,我們可以得出這個硬盤目前還有使用的空間;大約還有18G未分區的空間;

fdisk -l 能列出機器中所有磁盤的個數,也能列出所有磁盤分區情況;比如:

[root@localhost beinan]# fdisk -l

Disk /dev/hda: 80.0 GB, 80026361856 bytes

255 heads, 63 sectors/track, 9729 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/hda1 * 1 765 6144831 7 HPFS/NTFS

/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)

/dev/hda3 2806 7751 39728745 5 Extended

/dev/hda5 2806 3825 8193118+ 83 Linux

/dev/hda6 3826 5100 10241406 83 Linux

/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris

/dev/hda8 5199 6657 11719386 83 Linux

/dev/hda9 6658 7751 8787523+ 83 Linux

Disk /dev/sda: 60.0 GB, 60011642880 bytes

64 heads, 32 sectors/track, 57231 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System

/dev/sda1 1 57231 58604528 83 Linux

通過上面我們可以知道此機器有兩塊硬盤,我們也可以指定fdisk -l 來查看其中一個硬盤的分區情況;

[root@localhost beinan]# fdisk -l /dev/sda

Disk /dev/sda: 60.0 GB, 60011642880 bytes

64 heads, 32 sectors/track, 57231 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes

Device Boot Start End Blocks Id System

/dev/sda1 1 57231 58604528 83 Linux

通過上面情況可以知道,在/dev/sda 這個磁盤中,只有一個分區;使用量差不多是百分百了;

我們還可以來查看 /dev/hda的

[root@localhost beinan]# fdisk -l /dev/hda

自己試試看?

三、cfdisk 來自於util-linux的軟件包;

cfdisk 也是一款不錯的分區工具;在有些發行版中,此工具已經從util-linux包中剔除;cfdisk 簡單易用是他的特點;和DOS中的fdisk 相似;在本標題中,我們只來解說如何查看機器的中的磁盤分區狀況及所用的文件系統等;

查看磁盤分區的用法 cfdisk -Ps 磁盤設備名;

比如

[root@localhost beinan]cfdisk -Ps

[root@localhost beinan]cfdisk -Ps /dev/hda

[root@localhost beinan]cfdisk -Ps

Partition Table for /dev/hda

First Last

# Type Sector Sector Offset Length Filesystem Type (ID) Flag

-- ------- ----------- ----------- ------ ----------- -------------------- ----

1 Primary 0 23438834 63 23438835 Linux (83) Boot

2 Primary 23438835 156296384 0 132857550 Extended (05) None

5 Logical 23438835 155268224 63 131829390 Linux (83) None

6 Logical 155268225 156296384 63 1028160 Linux swap (82) None

我們只用的參數 -Ps,就列出了磁盤的分區情況;目前在Slackware Debian Mandrake 等主流發行版中存在cfdisk ,而fedora 4.0把這個小工具剔除了;有點可惜;這是我在Slackware中操作的;

如果您這樣操作,就更直觀了;

[root@localhost beinan]cfdisk 磁盤設備名

舉例:

[root@localhost beinan]cfdisk /dev/hda

您所看到的是如下的模式:

cfdisk 2.12a

Disk Drive: /dev/hda

Size: 80026361856 bytes, 80.0 GB

Heads: 255 Sectors per Track: 63 Cylinders: 9729

Name Flags Part Type FS Type [Label] Size (MB)

-------------------------------------------------------------------------------------------

hda1 Boot Primary Linux ReiserFS 12000.69

hda5 Logical Linux ReiserFS 67496.65

hda6 Logical Linux swap 526.42

[Bootable] [ Delete ] [ Help ] [Maximize] [ Print ] [ Quit ]

[ Type ] [ Units ] [ Write ]

Toggle bootable flag of the current partition

您進入了cfdisk 的操作界面;用鍵盤移動指針到[Quit]就可以退出;

四、parted 功能不錯的分區工具;在Fedora 4.0中有帶,可以自己安裝上;在此主題中,我們只說如何查看磁盤的分區情況;

調用方法簡單,parted 默認是打開的設備是/dev/hda ,也可以自己指定;比如 parted /dev/hda 或/dev/sda 等;退出的方法是 quit

[root@localhost beinan]# parted

使用 /dev/hda

(parted) p

/dev/hda 的磁盤幾何結構:0.000-76319.085 兆字節

磁盤標籤類型:msdos

Minor 起始點 終止點 類型 文件系統 標誌

1 0.031 6000.842 主分區 ntfs 啓動

2 6000.842 22003.088 主分區 fat32 lba

3 22003.088 60800.690 擴展分區

5 22003.119 30004.211 邏輯分區 reiserfs

6 30004.242 40005.615 邏輯分區 reiserfs

7 40005.646 40774.350 邏輯分區 linux-swap

8 40774.381 52219.094 邏輯分區 ext3

9 52219.125 60800.690 邏輯分區 reiserfs

我們在partd 的操作面上,用p就可以列出當前磁盤的分區情況,如果想要查看其它磁盤,可以用 select 功能,比如 select /dev/sda ;

五、qtparted ,與parted 相關的軟件還有qtparted ,也能查看到磁盤的結構和所用的文件系統,是圖形化的;

[beinan@localhost ~]# qtparted

圖形化的查看,一目瞭然;

六、sfdisk 也是一個分區工具,功能也多多;我們在這裏只說他的列磁盤分區情況的功能;

[root@localhost beinan]# sfdisk -l

自己看看吧;

sfdisk 有幾個很有用的功能;有興趣的弟兄不妨看看;

七、partx 也簡要的說一說,有些系統自帶了這個工具,功能也簡單,和fdisk 、parted、cfdisk 來說不值一提;不用也罷;

用法: partx 設備名

[root@localhost beinan]# partx /dev/hda

# 1: 63- 12289724 ( 12289662 sectors, 6292 MB)

# 2: 12289725- 45062324 ( 32772600 sectors, 16779 MB)

# 3: 45062325-124519814 ( 79457490 sectors, 40682 MB)

# 4: 0- -1 ( 0 sectors, 0 MB)

# 5: 45062388- 61448624 ( 16386237 sectors, 8389 MB)

# 6: 61448688- 81931499 ( 20482812 sectors, 10487 MB)

# 7: 81931563- 83505869 ( 1574307 sectors, 806 MB)

# 8: 83505933-106944704 ( 23438772 sectors, 12000 MB)

# 9: 106944768-124519814 ( 17575047 sectors, 8998 MB)

八、查看目前機器中的所有磁盤及分區情況:

[beinan@localhost ~]$ cat /proc/partitions

major minor #blocks name

3 0 78150744 hda

3 1 6144831 hda1

3 2 16386300 hda2

3 5 8193118 hda5

3 6 10241406 hda6

3 7 787153 hda7

3 8 11719386 hda8

3 9 8787523 hda9

8 0 58605120 sda

8 1 58604528 sda1

 

另:硬盤 I/O  性能

 

Linux系統出現了性能問題,一般我們可以通過top、iostat、free、vmstat等命令 來查看初步定位問題。其中iostat可以給我們提供豐富的IO狀態數據。

1. 基本使用

$iostat -d -k 1 10

參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block爲單位的列強制使用Kilobytes爲單位;1 10表示,數據顯示每隔1秒刷新一次,共顯示10次。

$iostat -d -k 1 10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 39.29 21.14 1.44 441339807 29990031
sda1 0.00 0.00 0.00 1623 523
sda2 1.32 1.43 4.54 29834273 94827104
sda3 6.30 0.85 24.95 17816289 520725244
sda5 0.85 0.46 3.40 9543503 70970116
sda6 0.00 0.00 0.00 550 236
sda7 0.00 0.00 0.00 406 0
sda8 0.00 0.00 0.00 406 0
sda9 0.00 0.00 0.00 406 0
sda10 60.68 18.35 71.43 383002263 1490928140

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 327.55 5159.18 102.04 5056 100
sda1 0.00 0.00 0.00 0 0

tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。“一次傳輸”意思是“一次I/O請求”。多個邏輯請求可能會被合併爲“一次I/O請求”。“一次傳輸”請求的大小是未知的。

kB_read/s:每秒從設備(drive expressed)讀取的數據量;kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;kB_read:讀取的總數據量;kB_wrtn:寫入 的總數量數據量;這些單位都爲Kilobytes。

上面的例子中,我們可以看到磁盤sda以及它的各個分區的統計數據,當時統計的磁盤總TPS是39.29,下面是各個分區的TPS。(因爲是瞬間 值,所以總TPS並不嚴格等於各個分區TPS的總和)

2. -x 參數

使用-x參數我們可以獲得更多統計信息。

iostat -d -x -k 1 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20

rrqm/s:每秒這個設備相關的讀取請求有多少被Merge了(當系統調用需要讀取數據的 時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的數據,FS會將這個請求合併Merge);wrqm/s:每秒這個 設備相關的寫入請求有多少被Merge了。

rsec/s:每秒讀取的扇區數;wsec/: 每秒寫入的扇區數。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;

await:每一個IO請求的處理的平均時間(單位是微秒)。這裏可以理解爲IO的響應時 間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。

%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該 設備有0.8秒在處理IO,而0.2秒閒置,那麼該設備的%util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙程度。一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁盤,即使%util是100%,因 爲磁盤的併發能力,所以磁盤使用未必就到了瓶頸)。

3. -c 參數

iostat還可以用來獲取cpu部分狀態值:

iostat -c 1 10
avg-cpu: %user %nice %sys %iowait %idle
1.98 0.00 0.35 11.45 86.22
avg-cpu: %user %nice %sys %iowait %idle
1.62 0.00 0.25 34.46 63.67

4. 常見用法

$iostat -d -k 1 10 #查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看設備使用率(%util)、響應時間(await)
iostat -c 1 10 #查看cpu狀態

5. 實例分析

$$iostat -d -k 1 |grep sda10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda10 60.72 18.95 71.53 395637647 1493241908
sda10 299.02 4266.67 129.41 4352 132
sda10 483.84 4589.90 4117.17 4544 4076
sda10 218.00 3360.00 100.00 3360 100
sda10 546.00 8784.00 124.00 8784 124
sda10 827.00 13232.00 136.00 13232 136

上面看到,磁盤每秒傳輸次數平均約400;每秒磁盤讀取約5MB,寫入約1MB。

iostat -d -x -k 1
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29
sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25
sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24

可以看到磁盤的平均響應時間<5ms,磁盤使用率>80。磁盤響應正常,但是已經很繁忙了。

參考文獻:

  1. Linux man iostat
  2. How Linux iostat computes its results
  3. Linux iostat

http://blog.csdn.net/AE86_FC/archive/2010/02/03/5284112.aspx

 

最近要對分佈式集羣做一些性能測試,其中一個很重要的項就是測試hadoop分佈式集羣在支持多磁盤輪轉 寫入的時候在各種磁盤配置的情況下的讀寫性能,如 在RAID0,RAID5和JBOD情況下的磁盤性能,所以linux 下的iostat命令就在產生report的腳本中非常有用,特此記錄下iostat命令的一些使用筆 記 
[命令:] iostat [-c|-d] [-k] [-t] [間隔描述] [檢測次數]
參 數:
-c : 僅顯示cpu的狀態
-d : 僅顯示存儲設備的狀態,不可以和-c一起使用
-k : 默認顯示的是讀入讀出的block信息,用-k可以改成KB大小來顯示
-t  : 顯示日期
-p device | ALL : device爲某個設備或者某個分區,如果使用ALL,就表示要顯示所有分區和設備的信息

顯示示例:
avg-cpu:  %user   %nice    %sys %iowait   %idle
4.55    0.00    0.63    0.26   94.56

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
cciss/c0d0       30.11        68.20        67.13 1232784060 1213452142
cciss/c0d0p1      0.00         0.00         0.00       2531          2
cciss/c0d0p2     83.78        68.18        67.11 1232572011 1213204536
dm-0              1.06         0.60         4.07   10873201   73555720
dm-1             82.50        67.42        62.23 1218704309 1124966656
dm-2              0.21         0.18         0.83    3199605   14929540
dm-3              0.00         0.00         0.00        372        224

以上顯示分爲上下兩個部 分,上半部分顯示CPU的信息,下面的數 據 顯示存儲設備的相關數據,它的數據意義如下:
tps:平均每秒鐘的傳送次數,與數據傳輸“次數”相關,非容 量
kB_read/s:啓動到現在的平均讀取單位
kB_wrtn/s:啓動到現在的平均寫入單位
kB_read:啓動到現在總共 讀出來的文件 單位
kB_wrtn: 啓動到現在總共寫入的文件單位

如果想要對iostat檢查多此,每次之間的間隔一定數量的秒數,這樣就可以查看每幾秒鐘之內的io統計數 據,這對性能的測試才具有實際意義:
$> iostat -d 2 3
表示沒量秒鐘檢查一次,一共檢查三次
avg-cpu:  %user   %nice    %sys %iowait   %idle
4.55    0.00    0.63    0.26   94.56

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
cciss/c0d0       30.11        68.20        67.13 1232900288 1213456210
cciss/c0d0p1      0.00         0.00         0.00       2531          2
cciss/c0d0p2     83.78        68.19        67.11 1232688239 1213208604
dm-0              1.06         0.60         4.07   10873201   73558008
dm-1             82.50        67.42        62.23 1218820537 1124967604
dm-2              0.21         0.18         0.83    3199605   14930372
dm-3              0.00         0.00         0.00        372        224

avg-cpu:  %user   %nice    %sys %iowait   %idle
0.00    0.00    0.63    0.00   99.37

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
cciss/c0d0        1.02         0.00        63.27          0        124
cciss/c0d0p1      0.00         0.00         0.00          0          0
cciss/c0d0p2     15.82         0.00        63.27          0        124
dm-0             15.82         0.00        63.27          0        124
dm-1              0.00         0.00         0.00          0          0
dm-2              0.00         0.00         0.00          0          0
dm-3              0.00         0.00         0.00          0          0

avg-cpu:  %user   %nice    %sys %iowait   %idle
0.00    0.00    0.32    0.00   99.68

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
cciss/c0d0        3.06         0.00        26.53          0         52
cciss/c0d0p1      0.00         0.00         0.00          0          0
cciss/c0d0p2      6.63         0.00        26.53          0         52
dm-0              0.00         0.00         0.00          0          0
dm-1              6.63         0.00        26.53          0         52
dm-2              0.00         0.00         0.00          0          0
dm-3              0.00         0.00         0.00          0          0

其中每一次的統計都是上 一次的統計時間到這次的統計時間之間的統計數據

 

 

1. 想看當前目錄下所有目錄以及子目錄的大小:

# du -h .

“.”代表當前目錄下。也可以換成一個明確的路徑

-h表示用K、M、G的人性化形式顯示

2. 只想看當前目錄下abc目錄的大小,並不想看其他目錄以及其子目錄:

# du -ch abc | tail -n 1

此種方法需要管道技術來管道du和tail兩個命令來實現。

-c 表示會列出文件空間大小的總和,用於計算幾個文件的大小之和

# du -sh abc

-s表示總結的意思,即只列出一個目錄中所有文件的空間大小的總值

# du -h -max-depth=0 abc

-max-depth=n表示只深入到第n層目錄,此處設置爲0,即表示不深入到子目錄。

3. 列出abc目錄及其子目錄下所有目錄和文件的大小

# du -ah abc

-a表示路徑下的所有包括目錄和文件

4. 列出所有abc目錄中的目錄名不包括xyz字符串的目錄的大小

# du -h –exclude=’*xyz*’

5. 想在一個屏幕下列出更多的關於abc目錄及子目錄大小的信息

# du -0h abc

-0(槓零)表示每列出一個目錄的信息,不換行,而是直接輸出下一個目錄的信息。

備註: du usage:

用法:du [選項]... [文件]...
或:du [選項]... --files0-from=F
總結每個<文件>的磁盤用量,目錄則取總用量。

長選項必須用的參數在使用短選項時也是必需的。
-a, --all 輸出所有文件的磁盤用量,不僅僅是目錄
--apparent-size 顯示錶面用量,而並非是磁盤用量;雖然表面用量通常會
小一些,但有時它會因爲稀疏文件間的"洞"、內部碎
片、非直接引用的塊等原因而變大。
-B, --block-size=大小 使用指定字節數的塊
-b, --bytes 等於--apparent-size --block-size=1
-c, --total 顯示總計信息
-D, --dereference-args 解除命令行中列出的符號連接
--files0-from=F 計算文件F 中以NUL 結尾的文件名對應占用的磁盤空間
如果F 的值是"-",則從標準輸入讀入文件名
-H 等於--dereference-args (-D)
-h, --human-readable 以可讀性較好的方式顯示尺寸(例如:1K 234M 2G)
--si 類似-h,但在計算時使用1000 爲基底而非1024
-k 等於--block-size=1K
-l, --count-links 如果是硬連接,就多次計算其尺寸
-m 等於--block-size=1M
-L, --dereference 找出任何符號鏈接指示的真正目的地
-P, --no-dereference 不跟隨任何符號鏈接(默認)
-0, --null 將每個空行視作0 字節而非換行符
-S, --separate-dirs 不包括子目錄的佔用量
-s, --summarize 只分別計算命令列中每個參數所佔的總用量
-x, --one-file-system 跳過處於不同文件系統之上的目錄
-X, --exclude-from=文件 排除與指定文件中描述的模式相符的文件
--exclude=PATTERN 排除與PATTERN 中描述的模式相符的文件
--max-depth=N 顯示目錄總計(與--all 一起使用計算文件)
當N 爲指定數值時計算深度爲N;
--max-depth=0 等於--summarize
--time 顯示目錄或該目錄子目錄下所有文件的最後修改時間
--time=WORD 顯示WORD 時間,而非修改時間:
atime,access,use,ctime 或status
--time-style=樣式 按照指定樣式顯示時間(樣式解釋規則同"date"命令):
full-iso,long-iso,iso,+FORMAT
--help 顯示此幫助信息並退出
--version 輸出版本信息並退出
所顯示的數值是來自 --block-size、DU_BLOCK_SIZE、BLOCK_SIZE 
及 BLOCKSIZE 環境變量中第一個可用的 SIZE 單位。
否則,默認單位是 1024 字節(或是 512,若設定 POSIXLY_CORRECT 的話)。
SIZE 可以是一個可選的整數,後面跟着以下單位中的一個:
KB 1000,K 1024,MB 1000*1000,M 1024*1024,還有 G、T、P、E、Z、Y。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章