全部博文(2065)
分类: LINUX
2010-02-03 11:53:37
本篇将继续讲述 Linux 性能调优的方法
7 文件系统的调优
总体而言,所有数据都要从磁盘获取并都要保存到磁盘。磁盘访问速度通常以毫秒来计算,比其它组件要慢上千倍(如内存、PCI 操作是以纳秒或者微秒来计算的)。Linux 文件系统定义了数据存储和访问的方式。
Linux 可用的文件系统有多种,它们的性能和可扩展性各不相同。除了保存和管理磁盘数据,文件系统还负责保证数据的完整性。新版的 Linux 缺省安装已经包括日志文件系统(journaling file systems),日志文件系统可防止系统崩溃时导致的数据不一致问题。对文件系统元数据(metadata)的更改都被保存在一份单独的日志里,当发生 系统崩溃时可以根据日志正确地恢复数据。除此之外,日志使系统重新启动时不必进行文件系统的检查,从而缩短了恢复时间。
同其他方面的计算一样,性能和完整性是相互平衡的。然而,因 Linux 服务器多用于企业环境及数据中心,因此要求具备更高的可用性。
这里,我们将介绍 Red Hat Enterprise Linux AS和 SUSE LINUX Enterprise Server 的文件系统及其性能调优。
7.1 安装 x 的发行版本对 CPU、硬盘和内存方面均有明确的安装要求。然而,对于如何设置磁盘子系统的说明远远不够。由于 Linux 服务器被广泛的应用于各种环境,数据中心的服务器整合,我们首先要回答的问题就是:“该服务器的功能是什么?”
磁盘子系统可能是整个服务器系统性能的主要方面。了解服务器的功能是判断I/O 子系统对性能产生多大影响的关键。
下面几种服务器的磁盘 I/O 性能不是最重要的:
磁盘技术的选择
除了理解服务器功能,还要了解磁盘容量的部署。下面是当前几种可选的磁盘技术及其容量、特点:
技术 | 花费 | 功能 | 容量及其限制 |
EIDE | 最低 | 直连、本地存储低端服务器,如 x305 | 每控制器最多2块盘 |
SCSI | 低 | 直连、本地存储中、高端服务器, 如 x346、x365 | 已经使用了10年的标准;对数据线的长度和磁盘数量均有限制单个通道的并发访问数量也有所限制,限制了群集功能 |
SATA | 低 | 中端数据存储应用 | 2002年开始出现,是 EIDE 技术的延续;点对点协议,每个驱动器都有一个独立的通道,增强扩展能力;连续的磁盘访问性能可与 SCSI 相比;支持 RAID |
iSCSI | 较低 | 中端数据存储,如 Web /文件服务器 | 定位于中端存储和远程启动;节省基础架构的开销提供了TCP/IP/Ethernet 的灵活性和可靠性;TCP/IP 的高延迟影响性能;目前 Red Hat Enterprise Linux 还不支持 |
Fibre Channel | 高 | 高端的企业存储,如数据库服务器 | 低延迟、高吞吐量,长传输距离可达 10公里 2Gbps 传输速率;路径冗余功能提高可靠性;一个光纤环路支持 127 个设备,共享带宽,实现大规模群集 |
提示:通常增加硬盘数量是提高磁盘性能的一个最有效方法。
更多的内容,请参考如下文档的第121页Chapter 7, “Disk subsystem”
7.2 Ext3:Red Hat 的缺省文件系统
从 Red Hat 7.2 开始,缺省文件系统为 Ext3。相对于 Ext2,增加了日志。其主要特点为:
另外,许多第三方厂家兼容 Ext3 file systems,如 PartitionMagic。
7.3 ReiserFS:SUSE LINUX 的缺省文件系统
从SUSE LINUX 7.1 开始,缺省安装的文件系统即为由 Hans Reiser 开发的ResierFS。在其设计之初便包括如下性能方面的考虑 From its initial design, key performance
aspects have included:
目前 SUSE LINUX Enterprise Server 8 的 ReiserFS 为 V3.6,下一代文件系统是 Reiser4。Reiser4 提供的是不间断的文件系统,通过实现“atomic”文件系统避免系统崩溃,保证完成 I/O 操作;使用新的访问算法来获取2到5倍的性能提高。
提示:Red Hat Enterprise Linux AS 不支持 ReiserFS
7.4 通过 Linux kernel 对文件系统调优
缺省文件系统的设置或许适合大多数应用环境。尽管如此,我们还是提供了如下几个提高磁盘性能的方法:
访问时间更新
linux 文件系统当文件被访问,创建,更新的时候会保留纪录。默认的,当文件读写操作的时候,系统会更新 last-time-read 属性。因为写操作是比较耗费资源的操作减少不必要的 i/o 可以整体上提高磁盘性能。
在挂接文件系统的时候,加入 noatime 参数可以禁止 inode 节点访问时间的修改。如果文件更新时间对于特定的应用不是很重要的话,比如 web 服务,就可以把 noatime 参数加入 /etc/fstab 文件中。
比如:
/dev/sdb1 /mountlocation ext3 defaults,noatime 1 2
推荐利用单独的分区作为挂接点并打开 noatime 开关
Tuning the elevator algorithm(调整阶梯算法)
磁盘 I/O 阶梯算法产生于 V2.4 kernel。它是通过控制 I/O 请求获得服务前在队列中等待时间,来调整块 I/O 的运算法则。
这是由调整阶梯算法的读写值实现的。通过增加延迟(更大的读、写值),I/O 请求在队列中等待更长时间,给 I/O scheduler更好地完成 I/O 操作,改进性能。
对应用于大量磁盘 I/O 的 Linux 服务器,要在吞吐量和延迟方面找到一个合理的平衡点。Linux文件系统使用块设备,因此改进块读写的频率可以改进文件系统的性能。一个准则是,小缓存、 平横的长延迟读写有利于大量磁盘I/O的 Linux 服务器。阶梯算法的调整是一个交互的过程,首先要获得基准性能曲线然后改动设置,观察效果。Example 10-1 给出了如何用/sbin/elvtune 命令显示当前设置以及如何改动读写队列的数值。
提示:Red Hat 建议您将读延迟(-r)调整为写延迟(-w)的一半。
做过改动之后,确保 /sbin/elvtune call 被加到 /etc/rc.d/rc.local(Red Hat)或者 /etc/init.d/boot.local(SUSE LINUX)中,使设置在系统重新启动后生效。
redhat 推荐调整升降算法来让读延迟是写延迟的一半
注意:2.6 核心的 linux 指出elvtune 命令已经作废,取而代之的是调整/sys/block 结构
选择 Ext3 文件系统的日志模式
Ext3文件系统可选三种日志模式,使用 mount 命令来完成:
三种方法改变日志模式:
Tuning ReiserFS(调整 ReiserFS)
ReiserFS 的优势之一是支持大量的小文件。取代传统 Linux 文件系统的块结构 ReiserFS 使用树型结构,保存小文件的全部内容和大文件的结尾。ReiserFS 不使用固定的块大小,避免出现碎片而浪费磁盘空间。
挂载 ReiserFS 文件系统时,有一个选项可以改进系统性能,但是会消耗更多的磁盘空间。使用 notai l来关闭“tail packing”选项,具体方法如下:
Setting bdflush
通
过调整虚拟内存子系统也可以改进文件系统性能。Bdflush 内核进程保证dirty
buffers(任何当前被修改的只存在于易失性内存的数据)与磁盘一致。修改 /proc/sys/vm/bdflush
变量,来改变写入磁盘速率,避免磁盘竞争问题。对 /proc 下的任何修改即刻生效,但是重新启动后会恢复到原来状态。在
/etc/rc.d/rc.local 文件中加入 echo 命令使所做的修改永久生效。
1. 对于 2.4 Linux kernels,在 /proc/sys/vm/bdflush 包括九个变量:nfract:dirty
buffers在 buffer cache 中的最大百分比。Nfract 值越大,写入磁盘的延迟越长。当内存不足时,大量的 I/O
操作被处理。为使磁盘 I/O 操作均匀分布,保持较低的值。
2. Ndirty:bdflush process 可以一次写入磁盘的最大 dirty buffers 值。该值过大会导致大量 I/O 请求,过小会在 bdflush daemon 执行不够频繁的时候导致内存不足。
3. dummy2 未使用
4. dummy3 未使用
5. interval 唤醒 kupdate 的最低速率。缺省是5秒,最小0秒,最大600秒。
6. age_buffer 操作系统将 buffer cache 写入磁盘前等待的最长时间。缺省30秒,最小1秒,最大 6000秒。
7. nfract_sync 激活 bdflush 同步的 dirty buffers 百分比,缺省为60%。
8. nfract_stop 停止 bdflush 的dirty buffers 百分比,却省为 20%。
9. dummy5 未使用
下面是更改 bdflush 变量的示例:
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 的设置,不必重新编译内核。可以在 /etc/modules.conf 中添加如下两行内容,指定参数aic7xxx=global_tag_depth:xx
Block sizes 块大小
数
据块大小是对磁盘读写的最小单位,直接影响服务器性能。如果服务器处理的多为小文件,那么较小的数据块尺寸会更有效。反之,如果服务器处理的多为大文件大
的数据尺寸块会提高系统性能。如果要改变数据块的大小必须重新格式化磁盘。做了 RAID 的磁盘,stripe size
就是数据块的容量(光纤盘采用
segment)。根据应用的不同合理选择正确的块大小,通常的原则是顺序读写应用宜使用大的块容量,象数据库这样的随机读写操作使用等同于记录大小的块
容量更合适。
不同系统版本,可选的块大小不同:
分区设置的原则
Linux 缺省安装创建三个分区:
关于 Linux 磁盘分区的优化存在许多的争论。如果只有一个根分区的话,对于将来要增加新分区时会比较麻烦。而分区太多对文件系统的管理又会变的复杂 Linux 安装过程中,允许创建多个分区。
创建多个磁盘分区的好处:
设计分区时要考虑到备份工具,要了解备份工具是以分区为边界或是以更细颗粒度级别,如文件系统为边界。下表列出了要考虑与根分区分开的五个分区,这些分区的划分可以改进性能和灵活性。Block sizes 块大小
数
据块大小是对磁盘读写的最小单位,直接影响服务器性能。如果服务器处理的多为小文件,那么较小的数据块尺寸会更有效。反之,如果服务器处理的多为大文件大
的数据尺寸块会提高系统性能。如果要改变数据块的大小必须重新格式化磁盘。做了 RAID 的磁盘,stripe size
就是数据块的容量(光纤盘采用
segment)。根据应用的不同合理选择正确的块大小,通常的原则是顺序读写应用宜使用大的块容量,象数据库这样的随机读写操作使用等同于记录大小的块
容量更合适。
要更深层了解 Linux 文件系统和分区,访问如下关于文件系统层次的网页
7.5 交换分区
当物理内存被全部占用,而系统又需要更多的内存时,交换设备发挥作用。这时,系统会将
内存中很少使用的数据交换到磁盘的交换分区,释放物理内存。最初的交换分区在安装系统的过程建立,原则上是两倍的物理内存大小。Linux
kernels 2.4 支持每分区24GB的交换分区,32-bit 系统理论上支持最大8T 分区大小。交换分区存在于独立的磁盘。
对于安装好的系统,增加内存时,需要设置更多的交换空间。两种方法可以实现:
另外一种改进性能的方法是创建多个交换空间,实现并行读写磁盘。增加了交换分区或交换文件后,/etc/fstab 文件包含如Example 10-5 所示内容:
通
常情况下,Linux 首先使用 /dev/sda2 交换分区,然后是
/dev/sdb2,依次类推,直到获得足够的交换空间。也就是说,当没有更大空间需求的话,只有 /dev/sda2
被使用。将数据分散到更多的交换分区可以改进性能,这是因为所有的读写请求是被并行处理的。如果按照 Example 10-6
改变文件配置,可以给前三个分区赋予更高的优先级。
交换分区是从最高优先级开始使用的(32767 最高,0 为最低),给前三个分区赋予相同的优先级使数据被写到三个磁盘中;而不是写满一个再写下一个。三个分区并行使用,以提高性能。当前三个分区用满之后,第四 个分区开始启用。也可以将所有分区设置为同一个优先级,但是假如这里有一块磁盘的速度比其它磁盘慢的话,性能就会下降。通常的做法是把交换分区放在最快的 磁盘中。
提示:交换分区不是物理内存的替代品,它存在于物理磁盘中,性能远远低于内存访问速度
8 网络子系统的调优
操作系统安装完毕,就要对网络子系统进行调优。对其它子系统的影响:影响 CPU 利用率,尤其在有大量 TCP 连接、块尺寸又非常小时,内存的使用会明显增加。
如何预防性能下降
如下的 sysctl 命令用于改变安全设置,但是它也可以防止网络性能的下降。这些命令被设置为缺省值。
关闭如下参数可以防止黑客对服务器 IP 地址的攻击
开启 TCP SYN cookies,保护服务器避免受 syn-flood
攻击,包括服务取决denial-of-service(DoS)或者分布式服务拒绝 distributed denial-of-service
(DDoS)(仅适用 Red Hat Enterprise Linux AS)
以下命令使服务器忽略来自被列入网关的服务器的重定向。因重定向可以被用来进行攻击,所以我们只接受有可靠来源的重定向。
另
外,你可以配置接受或拒绝任何 ICMP 重定向。ICMP 重定向是路由器传输路由信息的机制比如,当网关接收到来自所接网络主机的
Internet
数据报时,网关可以发送重定向信息到一台主机。网关检查路由表获得下一个网关的地址,第二个网关将数据报路由到目标网络。关闭这些重定向得命令如下:
如果这个服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能:
配置服务器拒绝接受广播风暴或者 smurf 攻击 attacks:
忽略所有 icmp 包或者 pings:
有些路由器针对广播祯发送无效的回应,每个都产生警告并在内核产生日志。这些回应可以被忽略:
针对TCP和UDP的调优
下边的命令用来对连接数量非常大的服务器进行调优。
对于同时支持很多连接的服务器,新的连接可以重新使用 TIME-WAIT 套接字。这对于 Web 服务器非常有效:
如果你使用该命令,还要启动 TIME-WAIT 套接字状态的快速循环功能:
图 Figure 10-7 显示出将这些功能启用,连接数量明显降低。因为每个 TCP 传输都包含远程客户端的协议信息缓存,所以有利于提高性能。缓存中存放 round-trip 时间、最大 segment 大小、拥塞窗口的信息。
参数 tcp_fin_timeout 是套接字关闭时,保持 FIN-WAIT-2 状态的时间。一个TCP 连接以
three-segment SYN 序列开始,以 three-segment FIN 序列结束.均不保留数据.通过改变
tcp_fin_timeout 的值,从 FIN
序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进。改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出。
服务器的一个问题是,同一时刻的大量 TCP 连接里有很多的连接被打开但是没有使用 TCP 的 keepalive 功能检测到这些连接,缺省情况下,在2小时之后丢掉。2个小时的可能导致内存过度使用,降低性能.因此改成 1800 秒(30分钟)是个更好的选择:
对于所有协议的队列,设置最大系统发送缓存(wmem)和接收缓存(rmem)到8MB
这些设置指定了创建 TCP 套接字时为其分配的内存容量。另外,使用如下命令发送和接收缓存。该命令设定了三个值:最小值、初始值和最大值:
第三个值必须小于或等于 wmem_max 和 rmem_max。
(SUSE LINUX Enterprise Server 适用)通过保留路径验证来源数据包。缺省情况下,路由器转发所有的数据包,即便是明显的异常网络流量。通过启动和是的过滤功能,丢掉这些数据包:
当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致 half-open 连接数量的增加。这对于 Web 服务器很来讲很平常,尤其有很多拨号客户时。这些 half-open 连接保存在 backlog connections 队列中。将这个值最少设置为 4096(缺省为 1024)。即便是服务器不接收这类连接,设置这个值还能防止受到 denial-of-service(syn-flood )的攻击。
设置 ipfrag 参数,尤其是 NFS 和 Samba 服务器。这里,我们可以设置用于重新组合 IP 碎片的最大、最小内存。当 ipfrag_high_thresh 值被指派,碎片会被丢弃直到达到 ipfrag_low_thres 值。