您的位置:首页 > 运维架构 > Linux

linux 硬盘性能(一) 查看

2013-01-07 12:54 155 查看
查看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。磁盘响应正常,但是已经很繁忙了。
参考文献:

Linux man iostat

How Linux iostat computes its results

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: