磁盘I/O性能问题
1、 磁盘I/O的规划与监控:
影响系统性能的第四个重要的方面就是磁盘I/O,而且往往这个方面的影响程度与出问题的概率要高于前几个方面。尤其对于很多应用系统的性能问题,如果追查下去往往都会归结到I/O问题上。因此这个部分的关注度我认为更应该加大。
我有一个观点,就是磁盘性能关键在于安装时的规划与配置,而不是事后采用很多“先进手段”去监控,然后绞尽脑汁的去分析调整。这意味着管理员要对系统业务逻辑和应用程序行为有一定的了解。通常磁盘的I/O有两种类型:顺序I/O和随机I/O。所谓顺序I/O就是按照磁盘块的顺序,一块接着一块的读取,在初始的寻道达到起点后,这种类型的I/O速度受到传送速率的影响。而随机I/O读取数据不按特定的顺序进行。这意味着磁头必须经常移动,以获得需要读取的数据,这种类型的I/O速率巡道时间决定了它的整体性能,应该使它尽量达到最小。
如何提高系统磁盘I/O性能,主要从以下三个方面考虑:
.磁盘硬件选择:
通常如果购买好的硬件设备,那么就会取得好的性能。当然要想购买好的硬件,那就必须付出更多的资金。当然还是有一些选择原则的,这里提供两个公式以供参考:
对于顺序访问:
(每磁道扇区数*RPM*512)/60000000,通过这个公式可以得出磁盘的内部传送速率,单位为MB。
对于随机访问:
1000/(平均寻道时间+30000/RPM),通过这个公式可以估算出每秒的I/O速率。
另外在选择磁盘时要注意,通常情况下磁盘的实际吞吐率很少能够达到厂商所宣传的,只能在比较不同磁盘时把它作为相对数。还要注意磁盘控制器的速度,快速的磁盘在普通的磁盘控制器下很难表现出应有的性能。还有一点更加重要,不要使磁盘控制器过载,把磁盘放到多个磁盘控制器上,是提高I/O吞吐率的一种办法。在配制系统时,一定要把每个磁盘适配器的最大传送速率和它所控制的所有磁盘最大传送速率的总和进行比较。如果磁盘控制上的负荷过大,只会降低磁盘性能。一种保守的观点认为,应该把磁盘的最大传送速率的总和限制在控制器的最大速度的85%-90%以内。
.数据分布规划
在系统硬件安装配置之后,接下来就是要考虑数据分布如何规划,换言之就是那些数据放到那些磁盘上。我认为这一步也是决定I/O性能的最为关键性的一步。在进行规划时,主要的思想其实就是“平均”与“分治”,要很好的做到这两点,就需要对系统业务逻辑和应用程序行为有一定的了解。下面这些事例情形说明了以上的原则:
如果系统的大多数I/O是由用户进程产生的,那么使它们使用的文件分布到多个磁盘之上,通常比存放到单个磁盘上要好。这就是所谓的“平均”思想,也就是说在各控制器和磁盘上尽可能均匀的分步预计的磁盘I/O,这样可以减少磁盘读写竞争也可防止热点文件的产生,从而提升磁盘I/O性能。比如在一个大型数据库系统上,通常会将表和索引分开存放到不同的磁盘之上(通常会建立不同的表空间),同时会将不同的联机日志组存放在不同的磁盘上而且考虑到交互效率,通常会选择速度快的磁盘来存放联机日志文件,另外有时会对那些并发访问的大型表以及频繁读写使用的表会独立放在一个磁盘之上(建立独立的表空间)。
如果系统需要运行多个需要大量I/O的进程,那么通常会把这些进程或作业需要使用的文件或者读取的数据存放到独立的磁盘上(理想情况下是放到不同的磁盘控制器之上)。这就是所谓的“分治”思想,通过这种“分治”可以减少作业之间的相互干扰(减少对那些频繁执行且只需要少量I/O进程的干扰)。
在很多Linux和Unix系统上,都提供了很多命令和工具对I/O进行监控。如FreeBSD系统中的iostat命令,在输出中可以看到很多I/O状态值,其中比较重要的有磁盘的tps(每秒转移操作数)和MB/s(每秒传输速度)。在AIX、HP-UNIX、Linux系统中可以使用sar命令来监控磁盘I/O,sar命令语法结构如下:
sar –d interval [count]其中interval是报告的间隔时间,count是生成报告的总数(默认为1)。
2、 调整磁盘I/O性能:
.顺序预读取:
有些系统如:AIX、Linux在进程已顺序方式访问数据文件时尝试进行判断。若判断是使用顺序访问时,就通过执行预读取操作来辅助进程,也就是说从文件中预先读取比进程实际需要的更多的数据。比如:它可能以此读取2页而不是1页。只要顺序访问在执行,操作系统就会加倍每次读取的页数,直到达到某个极限值。这种预先读取的好处在于,在进程请求数据时,数据已经预先读入内存中,因而避免了磁盘操作。
在AIX系统中可以使用vmtune –r min –R max命令来更改预读取默认设置,其中min顺序读取起始页数,max顺数读取最大页数。
在Linux系统中可以通过修改/proc/sys/vm文件中的参数值,来更改预先读取默认设置。这些参数主要有page-cluster决定以此读取操作所读取的页数。实际的数目是参数值的平方。默认为4,则默认以此读取的页数为16;min-readahead和max—readahead指定了用于预读的最小和最大页数,默认为3和31。在Linux系统允许在创建逻辑卷时指定预读取大小如:
lvcreate –L 800M –n bio_lv –r 8 –C y vg1
-r指定了预读取大小为8个扇区。
.磁盘I/O调步:
AIX系统还提供了一个工具用来防止大型I/O操作对系统交互性能造成损害。默认情况下,写请求按照排队顺序由操作系统来处理。但当大型I/O操作出现时,可能会生成许多未决的I/O请求,而此时需要访问磁盘的用户必须等待它们完成。磁盘I/O调步就是用来防止这种大型I/O对交互性的损害的,默认情况下是禁用的。
通过AIX系统的chdev命令来修改minpout和maxpout系统参数可以激活这个功能。当这个功能被激活后,如果进程试图写某个文件,但是已经有maxpout个或者更多的未决写操作存在,则进程将被挂起,直到未决的请求降到minpout之下。maxpout必须等于4的倍数加1,minpout必须是4的倍数至少要大于4。AIX文档建议分别使用33和16并观察效果。如:
chdev –l sys0 –a maxpout=33 –a minpout=16
如果交互性能达不到要求试着降低这些参数值;而如果执行大型写操作的性能受到很大影响,则增加它们。
3、 监控磁盘空间使用:
.监控磁盘使用情况:
无论你的系统磁盘空间有多大,总归是有限的,有限的资源总是宝贵的冰值得珍惜的。系统磁盘空间更是如此,因为磁盘空间不足往往会使系统无法运转下去造成不可估量的损失,同时如果磁盘空间过度使用(通常使用量达到或超过磁盘总量的90%),对磁盘性能也会造成非常大的损害。因此作为系统管理员来说,监控磁盘空间使用是你责无旁贷的责任,一定要在问题出现或者变严重之前发现并解决。
通常在Unix和Linux系统中有很多用于监控磁盘空间使用的命令,主要有如下一些命令:
df –k:该命令会生成一个报告,描述所有文件系统他们的总量以及可用的空闲空间(单位:KB)。
du –k:该命令会报告一个或多个指定目录下所有文件和子目录使用的磁盘空间,按每个子目录列出(单位:文件块数)。如:du –k /home/wangcai会列出/home/wangcai目录下的所有子目录占用的磁盘空间大小。du命令输出很长,可以使用-s选项来进行过滤。如:du –k –s /home/wangcai会报告/home/wangcai目录的磁盘空间占用总量,而不会报告每个子目录的磁盘空间使用情况。还可以使用管道,将du命令的输出传递给其他命令。如:du –k / | sort –rn该命令将du命令的输出按照首字母倒序排序。
quot:该命令将会报告一个文件系中各用户的磁盘使用信息。除了Linux系统没有此命令,大多数Unix系统都支持此命令。如:quot /该命令将会列出根磁盘中各用户使用的磁盘大小。
.解决磁盘空间不足问题:
对于这个问题最理想的解决办法就是购买新的磁盘,但这只是理想;最现实快速的办法就是删除长时间不使用的文件以释放空间,但这显得有些独裁而且可能会激怒文件拥有者;最合理的办法就是使用监控工具或者自己编写监控脚本,来对系统磁盘空间使用情况进行监控和预警。另外还可以通过限制某些文件的增长来节省空间使用。还可以对用户启用磁盘配额,这部分我们不再论述,请查阅相关系统的用户手册。
.定位和释放磁盘空间:
可以使用find命令来定位可能需要删除和归档的文件。如:
find / -name “.BAK.*” –o –name “*~” –print
该命令会输出以BAK开头或以~结尾的文件,这两个文件都是由文本编辑器产生的备份文件。
也可以通过find命令定位后直接删除。如:
find / /bio /corp –atime +7 /(-name “.BAK.*” / -o –name “*~” /) –type f –xdev –exec rm –f {} /
该命令会删除超过一星期的所有编辑器产生的备份文件。
.限制日志文件增长:
系统管理员要负责从日志文件中获取所需数据,并限制日志文件在一个合理大小范围之内,日志文件主要包括如下文件:
./usr/adm或/var/adm下的各种系统日志文件,包括:sulog,messages和通过/etc/syslog.conf设置的文件。
./usr/adm或/var/adm下的记账文件,尤其是wtmp和acct(BSD系统)或者是pacct以及/var/adm/acct/sum和/var/adm/acct/fiscal下的文件以及ASCII报告文件(System V系统)。
通常可以使用如:cat /dev/null > /var/adm/sulog命令来删除日志文件,或者使用tail命令来只保留当前日志的一小部分如:
cd /var/adm
tail -100 sulog > tmp
cat tmp > sulog