首页 > 代码库 > 聊聊磁盘的I/O!
聊聊磁盘的I/O!
问题:
懂网络的都知道,硬盘发展的速度可没有内存和cpu那么快,磁盘IO问题话也越来越严重!有的时候,服务器性能往往卡在了磁盘上。目前pc大多还是SATA接口,也出现了SSD和SAS等硬盘,但是相比cpu和内存来说,反应还是慢一些。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
常用查看磁盘IO的工具:
1、iotop(动态查看系统磁盘IO状况)
yum install iotop -y
2、快速的定位到并发高是由于磁盘io开销!
1、top|htop
通过wa 的百分比可以大致的体现出当前的磁盘io请求是否频繁。如果 wa的数量比较大,说明等待输入输出的的io比较多。
Htop基本上是一个top改善版本,它能够以更加多彩的方式显示更多的统计信息,同时允许你采用不同的方式进行排序,它提供了一个用户友好的接口。
#yum install htop -y
2、sysstat
#yum install sysstat -y
[root@node6 ~]# iostat -dx
Linux 2.6.32-504.el6.x86_64 (node6) 2016年09月19日 _x86_64_ (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.43 2.59 0.91 0.42 65.37 24.11 67.38 0.02 15.21 6.26 34.48 4.39 0.58
sdb 0.00 0.00 0.03 0.00 0.26 0.00 8.00 0.00 0.91 0.91 0.00 0.91 0.00
sdc 0.00 0.00 0.02 0.00 0.16 0.00 8.00 0.00 1.23 1.23 0.00 1.23 0.00
sdd 0.00 0.00 0.02 0.00 0.14 0.00 8.00 0.00 1.37 1.37 0.00 1.37 0.00
scd0 0.00 0.00 0.01 0.00 0.08 0.00 7.56 0.00 6.17 6.17 0.00 6.17 0.01
dm-0 0.00 0.00 1.10 3.01 63.75 24.11 21.34 0.64 155.09 12.12 207.42 1.38 0.57
dm-1 0.00 0.00 0.05 0.00 0.43 0.00 8.00 0.00 2.65 2.65 0.00 2.03 0.01
dm-2 0.00 0.00 0.02 0.00 0.14 0.00 8.00 0.00 0.44 0.44 0.00 0.44 0.00
[root@node6 ~]#
r/s 和 w/s 分别是每秒的读操作和写操作,而rKB/s 和wKB/s 列以每秒千字节为单位显示了读和写的数据量如果这两对数据值都很高的话说明磁盘io操作是很频繁。
3、vmstat
vmstat 命令报告关于线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。
由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值,或者计算其总和。
[root@node6 ~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 746580 14280 167716 0 0 36 12 25 15 0 0 99 0 0
0 0 0 746540 14280 167716 0 0 0 0 33 11 0 0 100 0 0
0 0 0 746540 14288 167712 0 0 0 8 20 15 0 1 100 0 0
^C
[root@node6 ~]#
vmstat参数解释:
Procs
r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数 w: 被交换出去的可运行的进程数。此数由 linux 计算得出,但 linux 并不耗尽交换空间
Memory
swpd: 虚拟内存使用情况,单位:KB
free: 空闲的内存,单位KB
buff: 被用来做为缓存的内存数,单位:KB
Swap
si: 从磁盘交换到内存的交换页数量,单位:KB/秒
so: 从内存交换到磁盘的交换页数量,单位:KB/秒
IO
bi: 发送到块设备的块数,单位:块/秒
bo: 从块设备接收到的块数,单位:块/秒
System
in: 每秒的中断数,包括时钟中断
cs: 每秒的环境(上下文)切换次数
CPU
按 CPU 的总使用百分比来显示
us: CPU 使用时间
sy: CPU 系统使用时间
id: 闲置时间
如果发现等待的进程和处在非中断睡眠状态的进程数非常多,并且发送到块设备的块数和从块设备接收到的块数非常大,那就说明磁盘io比较多。
4、sar(查看磁盘IO)
可查看我的博客:http://renzhiyuan.blog.51cto.com/10433137/1748281
5、dstat
此命令整合了vmstat,iostat和ifstat三种命令。同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能够使你对比和整合不同的资源使用情况。通过不同颜色和区块布局的界面帮助你能够更加清晰容易的获取信息。它也支持将信息数据导出到cvs格式文件中,从而用其他应用程序打开,或者导入到数据库中。你可以用该命令来监控cpu,内存和网络状态随着时间的变化。
#yum install dstat -y
......
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如何测试磁盘的IO?
1、dd
在使用前首先了解两个特殊设备
/dev/null 伪设备,回收站.写该文件不会产生IO
/dev/zero 伪设备,会产生空字符流,对它不会产生IO
在磁盘测试中最关心的几个指标分别为:iops(每秒执行的IO次数)、bw(带宽,每秒的吞吐量)、lat(每次IO操作的延迟)。
当每次IO操作的block较小时,如512bytes/4k/8k等,测试的主要是iops。
当每次IO操作的block较大时,如256k/512k/1M等,测试的主要是bw。
eg:
[root@node6 ~]# time dd if=/dev/zero of=/root/test.dbf bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB)已复制,2.73916 秒,38.3 MB/秒
real 0m2.740s
user 0m0.000s
sys 0m1.971s
[root@node6 ~]#
磁盘读写有两种方式:BufferIO、DirectIO,DirectIO可以更好的了解纯磁盘读写的性能。
dd测试DirectIO
iops——写测试 dd if=/dev/zero of=./test.dbf bs=8k count=1M oflag=direct
iops——读测试 dd if=./test.dbf of=/dev/null bs=8k count=1M iflag=direct
bw——写测试 dd if=/dev/zero of=./test.dbf bs=1M count=8k oflag=direct
bw——读测试 dd if=./test.dbf of=/dev/null bs=1M count=8k iflag=direct
2、 iozone
3、fio(专业测试)
如何减缓磁盘IO?
1、SSD和SAS硬盘取代之前的SATA硬盘。
2、RAID阵列比如(RAID10|RAID5)。
3、tmpfs 临时分区能有效减缓磁盘IO,提高系统性能。(注意断电丢失的问题)
[root@node6 ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_node6-lv_root
ext4 19G 1.5G 16G 9% /
tmpfs tmpfs 515M 0 515M 0% /dev/shm
/dev/sda1 ext4 500M 27M 448M 6% /boot
/dev/sr0 iso9660 4.7G 4.7G 0 100% /opt/ren
[root@node6 ~]#
4、磁盘阵列
......
个人建议:中小公司用前三种即可,也可以选择一些云服务器。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
调整tmpfs大小大常用的两种方法:
tmpfs简单介绍
tmpfs是一种虚拟内存文件系统,而不是块设备。是基于内存的文件系统,创建时不需要使用mkfs等初始化它最大的特点就是它的存储空间在VM(virtual memory),VM是由linux内核里面的vm子系统管理的。linux下面VM的大小由RM(Real Memory)和swap组成,RM的大小就是物理内存的大小,而Swap的大小是由自己决定的。
Swap是通过硬盘虚拟出来的内存空间,因此它的读写速度相对RM(Real Memory)要慢许多,当一个进程申请一定数量的内存时,如内核的vm子系统发现没有足够的RM时,就会把RM里面的一些不常用的数据交换到Swap里面,如果需要重新使用这些数据再把它们从Swap交换到RM里面。如果有足够大的物理内存,可以不划分Swap分区。
1.可以根据实际需要挂载某个程序的临时文件的目录。
[root@node6 ~]# mkdir /opt/tmps
[root@node6 ~]# mount -t tmpfs -o size=20m tmpfs /opt/tmps/
[root@node6 ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_node6-lv_root
ext4 19G 1.5G 16G 9% /
tmpfs tmpfs 515M 0 515M 0% /dev/shm
/dev/sda1 ext4 500M 27M 448M 6% /boot
/dev/sr0 iso9660 4.7G 4.7G 0 100% /opt/ren
tmpfs tmpfs 21M 0 21M 0% /opt/tmps
[root@node6 ~]#
2./etc/fstab文件来修改/dev/shm的容量(增加size=100M选项即可),修改后,mount测试,重启即可:
[root@node6 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Apr 28 09:13:39 2016
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg_node6-lv_root / ext4 defaults 1 1
UUID=38c9e6d6-2b01-4bf9-a854-04a496fcebb1 /boot ext4 defaults 1 2
/dev/mapper/vg_node6-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
tmpfs /opt/tmps tmpfs defaults,size=100M 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[root@node6 ~]#
[root@node6 ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_node6-lv_root
ext4 19G 1.5G 16G 9% /
tmpfs tmpfs 515M 0 515M 0% /dev/shm
/dev/sda1 ext4 500M 27M 448M 6% /boot
tmpfs tmpfs 105M 0 105M 0% /opt/tmps
/dev/sr0 iso9660 4.7G 4.7G 0 100% /opt/ren
[root@node6 ~]#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--出自任志远个人看法,欢迎指正!
本文出自 “renzhiyuan@chinacfsc.com” 博客,谢绝转载!
聊聊磁盘的I/O!