我有一台服务器正在为用户的主目录执行 NFSv4 导出。大约有 25 个用户(主要是开发人员/分析师)和大约 40 台服务器正在挂载主目录导出。性能很糟糕,用户经常会看到简单命令(如 ls,或编写一个小的文本文件)出现数秒的延迟。有时主目录挂载会完全挂起分钟,用户会收到“权限被拒绝”错误。
硬件是 Dell R510,配备双 E5620 CPU 和 8 GB RAM。有八个 15k 2.5 英寸 600 GB 驱动器(Seagate ST3600057SS),配置为硬件 RAID-6,带有一个热备用。RAID 控制器是 Dell PERC H700,带 512MB 缓存(Linux 将其视为 LSI MegaSAS 9260)。操作系统是 CentOS 5.6,主目录分区是 ext3,选项为“rw,data=journal,usrquota”。
我已将 HW RAID 配置为向操作系统显示两个虚拟磁盘:/dev/sda 用于操作系统(启动、根和交换分区),/dev/sdb 用于主目录。
我觉得奇怪和可疑的是,sda 设备的利用率通常非常高,即使它只包含操作系统。我预计这个虚拟驱动器几乎一直处于空闲状态。根据“free”和“vmstat”,系统没有交换。为什么这个设备会有很大的负载?
以下是来自 iostat 的 30 秒快照:
Time: 09:37:28 AM
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 44.09 0.03 107.76 0.13 607.40 11.27 0.89 8.27 7.27 78.35
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 44.09 0.03 107.76 0.13 607.40 11.27 0.89 8.27 7.27 78.35
sdb 0.00 2616.53 0.67 157.88 2.80 11098.83 140.04 8.57 54.08 4.21 66.68
sdb1 0.00 2616.53 0.67 157.88 2.80 11098.83 140.04 8.57 54.08 4.21 66.68
dm-0 0.00 0.00 0.03 151.82 0.13 607.26 8.00 1.25 8.23 5.16 78.35
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.67 2774.84 2.80 11099.37 8.00 474.30 170.89 0.24 66.84
dm-3 0.00 0.00 0.67 2774.84 2.80 11099.37 8.00 474.30 170.89 0.24 66.84
好像iotop是用于发现此类问题的理想工具。但我使用的是 CentOS 5.6,它的内核不够新,不足以支持该程序。
我在看确定哪个进程导致磁盘 I/O 负担过重?,除了 iotop 之外,其中一个建议是执行“echo 1 > /proc/sys/vm/block_dump”。我这样做了(在将内核消息定向到 tempfs 之后)。在大约 13 分钟内,我进行了大约 700k 次读取或写入,大约一半来自 kjournald,另一半来自 nfsd:
# egrep " kernel: .*(READ|WRITE)" messages | wc -l
768439
# egrep " kernel: kjournald.*(READ|WRITE)" messages | wc -l
403615
# egrep " kernel: nfsd.*(READ|WRITE)" messages | wc -l
314028
值得一提的是,在过去一个小时内,主目录驱动器的利用率一直超过 90%。我的 30 秒 iostat 一直显示如下输出:
Time: 09:36:30 PM
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 6.46 0.20 11.33 0.80 71.71 12.58 0.24 20.53 14.37 16.56
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 6.46 0.20 11.33 0.80 71.71 12.58 0.24 20.53 14.37 16.56
sdb 137.29 7.00 549.92 3.80 22817.19 43.19 82.57 3.02 5.45 1.74 96.32
sdb1 137.29 7.00 549.92 3.80 22817.19 43.19 82.57 3.02 5.45 1.74 96.32
dm-0 0.00 0.00 0.20 17.76 0.80 71.04 8.00 0.38 21.21 9.22 16.57
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 687.47 10.80 22817.19 43.19 65.48 4.62 6.61 1.43 99.81
dm-3 0.00 0.00 687.47 10.80 22817.19 43.19 65.48 4.62 6.61 1.43 99.82
答案1
更简单的方法是升级您的操作系统包。
CentOS 5.7绝对可以使用 iotop. Red Hat 反向移植每个进程的 IO 统计进入 2.6.18-144 内核,我开始看到 iotop 在 2011 年的某个时候通过 RPMForge 包工作。Red Hat 成为iotop
标准操作系统的一部分在 2012 年。在 5.7 系统上......
[root@Tantalalicious ~]# cat /etc/issue
CentOS release 5.7 (Final)
Kernel \r on an \m
[root@Tantalalicious ~]# uname -a
Linux Tantalalicious 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:21:01 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
[root@Tantalalicious ~]# iotop
Total DISK READ: 25.54 M/s | Total DISK WRITE: 87.03 K/s
TID PRIO USER< DISK READ DISK WRITE SWAPIN IO COMMAND
31441 be/4 465 0.00 B/s 0.00 B/s 0.00 % 0.00 % -bash
31540 be/4 465 0.00 B/s 0.00 B/s 0.00 % 0.00 % dbc
22587 be/4 admin 0.00 B/s 0.00 B/s 0.00 % 0.00 % sh
22588 be/4 admin 0.00 B/s 0.00 B/s 0.00 % 0.00 % sh
不要以为这是逃避答案……但目前,没有理由运行旧操作系统。EL 5.8 已经稳定下来,修复了大量错误,并让你能够访问所需的分析工具 (iotop)。我假设你已经修改了你的Linux I/O 电梯和调整硬件 RAID 控制器目前为止。
答案2
您可以使用lsof
列出打开的文件,它可能有助于确定正在使用的文件。
研究常规性能调整,例如,确保在 RAID 控制器上启用了写回缓存,使用 noatime 挂载 ext3 和 nfs 共享,调整 rsize/wsize,除非必须,否则不要使用 noac 挂载 nfs。