磁盘 I/O 和网络

请记住一个要点:在安装全新的 AIX 6 或 7 时,会自动地设置新的内存可调项默认值。如果是从 AIX 5.3 迁移系统,那么在 AIX 5.3 中设置的所有可调项会随同迁移。在执行迁移之前,建议记录已经修改的所有可调项(取得 /etc/tunables/nextboot 的拷贝),然后把可调项恢复为默认值。在迁移之后,检查 nextboot 并确保其中没有任何内容。现在,讨论需要为 AIX 6 或 7 修改的可调项。

磁盘 I/O

许多最常见的性能问题与 I/O 问题相关。尤其是,与管理员可以设置的任何 I/O 可调项相比,数据布局对性能的影响更大。因为以后更改数据布局非常困难,所以通过提前计划避免这些问题是很重要的。

目前的行业趋势是为服务器配置更少但更大的 hdisk。例如,服务器可能配置一个 500 GB 的 hdisk,它分散在磁盘子系统中的几个磁盘上,而不是配置 10 个 50 GB 或 5 个 100 GB 的磁盘。但是,I/O 性能取决于带宽而不是大小。即使数据分散在后端的多个磁盘上,这对于前端的 I/O 排队问题也没有帮助。在服务器上,hdisk 驱动程序有一个正在处理队列和一个等待队列。在 JFS2 缓冲区中建立 I/O 时,它排队访问 LUN (hdisk)。hdisk (LUN) 的 queue_depth 表示它在任何时刻能够承担的 I/O 数量。

hdisk 的正在处理队列可以包含最多 queue-depth 个 I/O,hdisk 驱动程序把这些 I/O 提交给适配器驱动程序。这为什么很重要?如果 LVM 把您的数据分散在 5 个 hdisk 上,那么就可以同时处理更多 I/O。对于单一大 hdisk,就要排队。子系统设备驱动程序 (subsystem device driver,SDD) 等多路径 I/O 驱动程序向 hdisk 提交的 I/O 不会多于 queue_depth 个,这会影响性能。需要提高 queue_depth 或者禁用此限制。在 SDD 中,使用 "datapath qdepth disable" 命令。

一些厂商在 queue_depth 设置方面做得比较好,但是如果要使用后端中多个磁盘上的大量逻辑单元,仍然需要提高设置。可以使用 iostat -D 或 sar -d 命令检查排队情况。交互式 nmon 也有 -D 选项,可以用它监视 sqfull。如果使用 sddpcm,那么可以使用 "pcmpath query devstats" 监视 sqfull,使用 "pcmpath query adaptstats" 监视适配器排队。

尤其是要查看 avgsqsz、avgwqsz 和 sqfull 字段,以此判断是否需要提高 queue_depth。不要把 queue_depth 提高到超过磁盘厂商建议的范围。lsattr -El hdisk? 显示当前的 queue_depth 设置。修改 queue_depth 之后需要重新引导。

对于 Fibre Channel,适配器也有正在处理队列,可以包含最多 num_cmd_elems 个 I/O。适配器把这些 I/O 提交给磁盘系统并使用直接内存访问 (DMA) 执行 I/O。可能应该考虑修改适配器上的两个设置。在默认情况下,num_cmd_elems 设置为 200,max_xfer_size 设置为 0x100000。后者相当于 16 MB 的 DMA 大小。对于沉重的 I/O 负载,我会把 DMA 提高到 0x200000 (128 MB) 并把 num_cmd_elems 设置为 2,048,但是我一般先设置为 1,024。这必须在分配 hdisk 之前完成,否则必须删除它们才能设置这些值。lsattr -El fcs? 显示当前设置。修改这些设置之前,请咨询您的磁盘厂商。可以使用 fcstat 命令监视这些设置。应该查看以下条目:

FC SCSI Adapter Driver Information
  No DMA Resource Count: 0               
  No Adapter Elements Count: 2567

No Command Resource Count: 34114051

在上面的输出中可以看出 num_cmd_elems 不够高,DMA 区域也需要增加。修改这些设置之后需要重新引导。

在使用 VIO 服务器时,应该在 VIO 服务器上设置 max_xfer_size 和 num_cmd_elems;如果使用 N_Port ID Virtualization (NPIV),还需要在 NPIV 客户机 LPAR 上设置它们。在 NPIV 客户机 LPAR 上设置的值不要高于 VIO 服务器;我这样做过并导致我的 LPAR 无法引导,因此这么做肯定是超越限制了。

卷组和文件系统

正确地设置 Fibre-Channel 卡和 hdisk 之后,应该查看卷组、逻辑卷 (LV) 和文件系统的设置。我尽量使用包含多个磁盘的少量卷组,因为这样可以更灵活方便地使用镜像技术转移文件系统。这让我可以在不停机的情况下在磁盘之间转移文件系统。我见过每个文件系统一个卷组的设置,这对解决性能问题时的灵活性没好处。

异步和并发 I/O

异步 I/O (AIO) 是在 OS 级上设置的,Oracle 需要知道已经配置了 AIO。AIO 用于提高原始 LV 和文件系统的 I/O 性能。在 AIX 5.3 和 AIX 6.1/7 上设置 AIO 的方法不一样。在 5.3 上,使用 chdev 设置三个参数:minservers、maxservers 和 maxreqs。在 6.1 和 7 上,使用 ioo。如果在 6.1/7 系统上执行 "ioo -a | grep aio",就会看到新的参数。使用 "iostat -A" 命令收集统计数据。可以通过这些数据看出正在使用多少个 AIO。另外,如果看到 maxg 接近 maxreqs,那么应该提高 maxreqs。

在 6.1 和 7 上,现在默认装载 AIO 修改和子系统。aio0 设备和新的 aioo 命令取消了。另外,在默认情况下启用 AIO,需要调整的值通常只有 aio_maxservers 或 posix_aio_maxservers 选项。这用 ioo 命令来设置。

并发 I/O (CIO) 是 JFS2 采用的 AIX 特性,它绕过缓冲区缓存,可以减少双重缓冲(即把 I/O 存储到内存中,然后复制到应用程序缓冲区中)。CIO 还会取消写操作期间文件系统的 inode 锁,所以应该只在由应用程序负责数据序列化的情况下使用它。对于 Oracle,这意味着应该对 DataBase file (DBF)、重做日志、控制文件和 flashback 日志文件使用 CIO。对于 Oracle 二进制代码或存档日志文件不应该使用它。对于混合型或随机访问的工作负载,使用 CIO 会对内存使用量(减少分页)、CPU 使用率(不再在两个内存位置之间复制内存页面)和总体性能产生显著影响。但是,因为它绕过提前读取,顺序操作的性能可能不好。

网络

在图 1 中,提供对设置网络可调项的建议。这些建议针对 Gbit 网卡。在 netstat -v 输出中,寻找溢出和内存分配失败等错误。例如,如果出现 "Software Xmit Q Overflows",就说明数据包溢出适配器上的传输队列。溢出的另一个迹象是数据包由于内存分配失败被丢弃。要想查明调用的传输队列,需要运行 "lsattr -El ent0"(或 ent1 ....)命令。这个字段从 AIX 5.3 到 6 到 7 一直在增加,还因适配器是 100 Mb、1Gb 或 10Gb 而异。

图 1. 网络可调项的建议
图 1. 网络可调项的建议

在设置网络可调项时,应该使用 no 执行全局设置,但是还需要检查各个适配器,因为系统可以覆盖全局设置。使用 "ifconfig -a" 检查设置的网络参数是否被覆盖了。如果 ifconfig 输出中的值比较小,那么考虑使用 ifconfig 把它们设置为新的值。

另一个要考虑的网络可调项是 tcp_nodelay,它在默认情况下是禁用的。对于只发送很少的数据并等待响应的请求/响应工作负载,这会造成很长的延迟。TCP 实现延迟的确认,因为它期望通过响应数据包发送回 TCP 确认。这个延迟通常为 200 ms。为了减少这个延迟,应该启用 tcp_nodelay。使用 no 命令启用它。

收集性能数据

我多年使用 nmon 收集历史性能数据并监视系统。现在,nmon 已经集成在系统中了,所以我使用 IBM 提供的 nmon 并在每天午夜启动一个新的 cron 作业。它运行的脚本包含以下代码:

#!/bin/ksh
#
cd /usr/local/perf
/usr/bin/nmon -ft -A -M -L -^ -s 150 -c 576
#

上面的脚本收集 24 小时的系统信息,包括 AIO、大页面和最忙的进程。然后可以下载产生的 .nmon 文件,使用 nmon analyzer、nmon consolidator 和其他许多工具(包括 rrd)处理数据。

简单的修改,重大的影响

AIX 6 和 7 大大减少了需要关注的内存可调项数量。但是,仍然需要注意 I/O 缓冲区、总体 I/O 和网络调优。简单的修改可能对系统产生重大的影响,所以应该全面测试再投入生产,但是在许多情况下上面提供的建议应该有助于提高性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值