分类: LINUX
2007-11-13 15:52:24
3.12 调优文件系统
最终所有数据都是要存储在硬盘上的,硬盘访问的速度通常都是毫秒级别的,这个速度与内存和PCI设备纳秒和微秒级别的访问速度要慢上千倍。Linux文件系统是在硬盘上进行数据存储和管理的方法。
Linux
有多种可用的文件系统,它们的性能和可扩展性各有特点。除了存储和管理硬盘上的数据,文件系统也负责保持数据的一致性。新的Linux发行版本包括日志文
件系统做为默认安装的一部分。日志可以在系统宕机时保持数据的一致性,所有对文件系统元数据的修改都被维护在一个单独的日志中,并且可以在系统宕机后恢复
数据的一致状态。日志也可以加快恢复时间,因为在系统重新启动不需要进行文件系统检查的操作。另一方面,你也需要平和性能和数据完整性之间的关系,但使用
在数据中心或者企业级应用中的Linux服务器对高可用性是有着严格的要求的。在这部分我们介绍Red Hat Enterprise Linux
AS默认的和其他文件系统的一些简单的调优方法。
3.12.1 安装Linux系统前的硬件准备
目前的Linux发行版本都有文档来要求安装系统
的硬件配置的最小要求,比如最小的CPU频率和内存大小,也会提供完全安装系统所需的最小的磁盘空间。然而这些文档都没有提供如何初始化磁盘子系统,因为
Linux服务器可以适应各种不同的应用环境,所以我们需要面对的第一个问题是:需要安装的Linux服务器的应用环境是什么?
服务器的磁盘子系统是系统性能的主要组成部分,判断I/O子系统是否会对系统性能产生直接影响首先需要理解服务器所运行的应用。下面例子帮助我们理解I/O子系统和应用的关系,
磁盘I/O对性能影响很大的服务器例子:
·一个文件和打印服务器必须快速的在用户和磁盘子系统间移动数据,因为文件服务器的目
的就是分发文件到各个客户端,服务器对磁盘上的数据有大量的访问操作。
·一个数据库服务器最终目的是查找和处理存储在磁盘上的数据。即使有足够的内存,大多数数据库服务器还是需要执行大量的磁盘I/O操作来进行内存和硬盘之间的数据交换。
磁盘I/O对性能影响很小的服务器例子:
·一个邮件服务器的功能是对电子邮件进行存储和发送,通常会产生大量的网络通信负载,在这样的服务器里网络是更重要的参数。
·一个web服务器的功能是提供对web页面的访问支持(包括静态的、动态的或者两者都有),对这样的服务器来讲,网络和内存子系统是更好的调优选择。
磁盘技术的选择
在安装部署服务器之前需要了解应用的规模,目前不同磁盘子系统技术所适合的应用环境也是不相同的,下表列出了在ibm xSeries服务器上所用到的磁盘技术和相关特性。
技术 | 价格 | 功能 | 限制和容量 |
EIDE | 低价格 | 直连存储;例如低端服务器的本地硬盘(x305) | 是用来连接内部存储的增强型IDE,每个EIDE控制器支持两个硬盘 |
SCSI | 低价格 | 直连存储:中端或者高端服务器的本地存储(x346,x365) | 虽然scsi标准有超过10年的发展历史,但目前高端服务器的I/O需求已经超过了scsi的能力,scsi技术的限制包括线缆长度,总线上连接服务器数量,传输速度,总线上可访问的设备数量等,这些都影响了集群系统的可扩展性。 |
Serial ATA(SATA) | 低价格 | 中端数据存储应用 | 从2002年发展起来的SATA新标准在硬盘/主板接口上继承了EIDE的技术,是点对点的传输协议,为每个设备提供了一个单独的通道。在顺序磁盘访问应用上SATA可以与SCSI相比,在随机磁盘访问上稍逊于SCSI技术,SATA技术也支持RAID功能。 |
iSCSI | 适中的价格 | 中端存储,例如文件或者web服务器 | iSCSI技术主要适合中端存储和远程启动需要,主要的优点是相对较低的成本和无盘服务器,也提供了基于TCP/IP/以太网的可扩展性和可靠性。同时TCP/IP的高延迟也对性能产生了一些影响。 |
Fibre Channel | 高价格 | 企业级存储,例如数据库 | 提供了低延迟和高吞吐量能力并且克服了scsi技术的一些限制,通过光纤链路线缆距离可以扩展到10km, 2Gbps传输速度,提供冗余链路改善可靠性,理论上可以连接1600万个设备,在loop拓扑中,127个存储设备或者服务器可以共享同一个光纤通道连 接,允许部署更大规模的集群。 |
关于ibm存储的更多信息请访问下面链接
磁盘的数量
磁盘的数量会对系统的性能产生重要的影响,因为每个硬盘都会对整个系统的吞吐量做出贡
献。在配置服务器硬盘数量的时候,磁盘的容量要求通常被作为唯一的参考。吞吐量要求经常没有被很好的考虑甚至被完全忽略。一个性能良好的磁盘子系统的关键
是最优化可以提供I/O请求的读写操作。
通过RAID(redundant array of
independent
disks)技术,可以将I/O请求分成条带化处理,在Linux环境下部署RAID有两种选择:软件RAID和硬件RAID。你可以通过Linux发行
版本自带的软件RAID来配置,如果需要,也能升级使用更有效率的硬件RAID解决方案。在Linux
2.4内核中,软件阵列的实现是通过md设备驱动来实现的,这个驱动的实现是不依靠设备类型的,因此可以灵活的部署多种磁盘子系统,比如EIDE或者
SCSI磁盘都可以配置软件阵列。软件RAID支持的阵列级别有RAID-0(条带化),RAID-1(镜像)和RAID5(带校验位的条带化),可以在
初始化安装的过程中或者使用mdadm工具进行配置。
如果必须部署一个硬件RAID阵列,你的系统需要一个RAID控制器,在这种情况下磁带子系统包括物理磁盘和控制器,IBM提供了完整的磁盘控制器产品线。
注:通常增加硬盘是最有效的改变服务器性能的方法之一。
3.12.2 其他日志文件系统
下面是Linux可用的文件系统,但在Red Hat Enterprise Linux安装过程中并不可用。
·ReiserFS
ReiserFS是一个快速日志文件系统,特点是可以提供优化的磁盘利用率和快速的crash恢复,是SUSE LINUX默认的文件系统。
·JFS
JFS是一个全64bit的文件系统可以支持更大的文件和分区。JFS是由IBM为AIX系统开发的,现在可用于GPL license。在HPC和数据库应用中JFS是一个理想的文件系统,因为可以提供更大的分区和文件容量。
·XFS
XFS是一个SGI开发的高性能的日志文件系统。特性和使用与IBM的JFS很相似。
3.12.3 在2.4内核中调整elevator算法
磁盘I/O elevator算法是Linux 2.4内核的一个特性,通过调整elevator算法的读写值可以增加延迟时间使I/O请求在队列中等待更多的时间,从而使得I/O调度器可以有更多的时间来完成I/O操作,可以提高系统的吞吐量。
如果你的Linux服务器应用于大量的磁盘I/O操作的环境,在吞吐量和延迟方面找到一个合理的平衡点是很重要的。Linux文件系统
使用块设备,因此改变块读写的频率可以改善未经系统的性能。一个方针是,较小的缓存和平衡的高延迟读写对I/O操作比较重的服务器是有益的。
像其他系统的调优参数一样,对elevator算法的调整是一个重复的过程。你需要对现有磁盘性能做出评估,然后做出改变,最后再测试出改变参数所产生的影响。下面是使用/sbin/elvtune命令去查看当前参数值随后做出改变的例子:
Red Hat建议您将读延迟(-r)调整为写延迟(-w)的一半。如果对算法进行的调整,需要把/sbin/elvtune调用加到/etc/rc.d/rc.local文件中以确定在下次系统重新启动后改变依然生效。
下面是查看默认值并且做出改变的示例
3.12.4在Linux 2.6内核中选择正确的I/O elevator算法
对大多数应用来说,complete fair queuing(CFQ) elevator算法是一个合适的选择,它已经对一个典型的多用户、多处理器环境做了相应的优化。但是,一些特定的环境下选择其他的I/O elevator可能会获得更好的效果。
·智能的磁盘子系统
benchmark
测试结果显示NOOP elevator在高端服务器环境下可以给性能带来有趣的变化,当使用IBM ServeRAID或者TotalStorage
DS系列磁盘子系统的情况下,缺少命令能力的NOOP elevator显示出了它的优势,因为智能磁盘子系统例如IBM
ServeRAID和TotalStrrage DS系统磁盘子系统用自己的I/O命令能力弥补了NOOP
elevator的缺点。企业级的磁盘子系统通常包括多个SCSI或者光纤通道磁盘,每个磁盘都有独立的磁盘头和数据条带。对操作系统来说正确的处理如此
复杂的I/O特性子系统是很困难的,因此你会观察到在获得性能相同的情况下使用NOOP I/O elevator会带来更少的系统资源开销。
·数据库系统
因为大多数数据库应用需要进行大量的寻址操作,所以在选择deadline elevator的情况下会获得更好的性能体现。
·虚拟机
虚
拟机系统,无论是VMware或者zSeries上的VM都只在虚拟层和下面的硬件层进行通信,因此虚拟机不知道它被指派的磁盘设备是一个单独的SCSI
磁盘设备或者是多个光纤磁盘组成的磁盘阵列设备。虚拟层只关注必需的I/O记录和与物理设备之间的通信。因此,我们建议为虚拟机选择使用NOOP
elevator以确保更少的系统资源开销。
·单独ATA或者SATA磁带子系统
如果你选择使用单独ATA或者SATA的磁盘子系统,考虑使用anticipatory I/O elevator会获得比较好的性能。
3.12.5 访问时间更新
Linux文件系统当文件被创建、更新和访问的情况下都会进行记录,默
认情况操作包括更新最近读取时间属性(last-time-read)当文件被读写的时候,因为写操作是一个“昂贵”的操作,排除不必要的I/O操作可以
提升整个系统的性能。Mount文件系统的时候加入noatime和nodirtime选项可以避免inode时间访问记录被更新,如果文件和目录的更新
时间对你的应用来说并不关键,比如一个web服务器环境,系统管理员应该选择mount文件系统附上noatime和nodirtime选项来改善性能,
可以将改变写入/etc/fstab来实现长期的改变,下面是一个更新/etc/fstab的示例:
tips:通常为/var建立独立的分区并且mount附上noatime选项是一个好的建议。
3.12.6 增加操作文件数量
系统有一个重要的参数就是允许操作文件的数量,标准的Linux配
置的数量可能过低从而影响性能。查看/proc/sys/file-nr对比全部指派文件数量和最大文件操作数量(第一个或最后一个值)。可以通过改变
/proc/sys/fs/file-max来改变这个参数的值。
3.12.7 选择ext3文件系统的目录模式
ext3文件系统有三个可选的日志模式,可以通过在mount命令的附加data项来进行改变。
·data=journal
journal选项通过将文件数据和元数据都设置为日志模式,提供了最高级别的数据一致性保障。同时也带来了较高的性能开销。
·data=ordered(default)
顺序方式写入,文件数据先写入然后是元数据。
·data=writeback
提供最快的访问速度,但是牺牲了数据的一致性。元数据仍然被记录到日志,从而确保元数据的完整。文件数据会在系统崩溃之后恢复到原先的状态。
三种方法可以改变日志模式:
·使用mount 命令:
mount -o data=writeback /dev/sdb1 /mnt/mountpoint 这里/dev/sdb1 是挂载的文件系统
·在/etc/fstab文件的选项中:
/dev/sdb1 /testfs ext3 defaults,journal=writeback 0 0
·更改root分区的data=ordered,更改上述/etc/fstab 文件,执行mkinitrd命令来扫描/etc/fstab 文件并创建新的印象文件。升级grub或lilo指向新的印象文件。更多有关Ext3的介绍,请参考下面链接:
3.12.8 SCSI设备的Tagged command queuing(TCQ)
SCSI磁
盘的Tagged command queuing
(TCQ),产生于SCSI-2标准,是一种将到达SCSI驱动器的指令序列进行打标签和重新排序的方法。对于繁重、随机访问的I/O负荷,这种方法通过
对I/O请求的重排序,使驱动器磁头位置最优化,改进I/O性能。
一些IBM
xSeries服务器集成了Adaptec AIC-7xxx SCSI控制器。执行命令:cat
/proc/scsi/aic7xxx/0来检查当前TCQ的设置,可以在/usr/src/linux-
2.4/drivers/scsi/README.aic7xxx中查看scsi设备设定的细节。
不必重新编译内核。可以在/etc/modules.conf中添加如下两行内容,指定参数aic7xxx=global_tag_depth:xx,
注:如果在/etc/modules.conf里更改了initrd中的模块,需要使用mkinitrd命令重新生成initrd image。
3.12.9 Block sizes大小
数据块大小是对磁盘读写的最小单位,直接影响服务器性
能。如果服务器处理的多为小文件,那么较小的数据块尺寸会更有效。反之,如果服务器处理的多为大文件,大的数据尺寸块会提高系统性能。如果要改变数据块的
大小必须重新格式化磁盘。做了RAID的磁盘,stripe size
就是数据块的容量(光纤盘采用segment)。根据应用的不同合理选择正确的块大小,通常的原则是顺序读写应使用大的块容量,象数据库这样的随机读写操
作使用等同于记录大小的块容量更合适。
Red Hat Enterprise Linux允许的block sizes有1K,2K和4K。
3.12.10 分区设置的原则
一个分区是磁盘上一组连续的数据块,就好像是独立的磁盘一样。Red Hat Enterprise Linux 3默认只安装三个简单的分区,在Red Hat Enterprise Linux 4中通过使用逻辑卷提供了更灵活的分区划分。
关于Linux磁盘分区的优化存在许多的争论。如果只有一个根分区的话,对于将来要增加新分区时会比较麻烦。而分区太多对文件系统的管理又会变的复杂。Linux安装过程中,允许创建多个分区。
创建多个磁盘分区的好处:
·文件系统出色的颗粒度属性使安全性得到改进。例如,允许所有用户和进程容易地访问/var和/tmp分区,并防止恶意访问。通过将这些分区分布到不同的磁盘,可在不影响系统正常运行的情况下对一些分区进行重建和恢复。
·某块磁盘故障导致的数据丢失不影响其他磁盘的数据,改进数据完整性。
·全新的安装或升级不影响其它分区。
·更有效的备份过程