如何提升服务器磁盘性能

我有一台运行Ubuntu 10.04 LTS的HP Microserver。它是一台低功耗服务器,具有5个内部驱动器插槽。我用它来通过网络备份我的远程服务器、VPS和本地笔记本电脑。我希望从硬盘中获得最佳性能,但我不知道是否设置得最优化,所以我正在寻求一些建议。
我的服务器每天多次运行rsnapshot来备份远程主机。实际的增量备份部分所需的时间很少。大部分时间都花在诸如以下任务上:
/bin/cp -al /srv/rsnapshot/hourly.0 /srv/rsnapshot/hourly.1

大约需要2个小时。我意识到那里有无数微小的文件。

$ sudo du -hs hourly.1
659G    hourly.1

当rsnapshot删除旧备份时,可能需要很长时间。
/bin/rm -rf /srv/rsnapshot/daily.6/

大约需要半小时。

我的问题如下,服务器配置和一些IO统计数据如下所示。如果需要,我当然可以提供更多的调试信息:

我如何确定瓶颈在哪里?

我是否已经达到了这个盒子的能力极限(就IO而言)?

有没有什么性能优化的技巧可以使用?

我应该使用不同的RAID级别吗?

将内部RAID磁盘中的两个(每个镜像的一半)与外部阵列上的另外两个“其他镜像的一半”进行交换是否有意义?

注意:我不太倾向于做一些像编译自己的内核这样的事情。理想情况下,我希望继续使用10.04 LTS,除非后续版本中有一些魔法可以让所有工作更快。

服务器内部有1x160GB SATA启动磁盘和4x2TB磁盘:

Disk /dev/sde: 160.0 GB, 160041885696 bytes
Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdh: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdi: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdg: 2000.4 GB, 2000398934016 bytes

四个内部2TB硬盘以软件MD RAID10设置方式运行:
md0 : active raid10 sdg1[3] sdh1[0] sdi1[2] sdf1[1]
      3907023872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

此外,我还有一个外部的EDGE10硬盘盒,通过PCI-E eSATA卡连接,并包含四个容量为500GB的硬盘:
Disk /dev/sda: 500.1 GB, 500107862016 bytes
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
Disk /dev/sdc: 500.1 GB, 500107862016 bytes
Disk /dev/sdd: 500.1 GB, 500107862016 bytes

这也被设置为一个MD RAID10阵列

md1 : active raid10 sdb1[1] sda1[0] sdd1[3] sdc1[2]
      976767872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

md0和md1被合并成一个大的LVM。注意:我最近才添加了外部阵列,所以它几乎是空白的,我不认为现在上面有任何块。这被呈现为一个LVM卷:
--- Logical volume ---
LV Name                /dev/data/data
VG Name                data
LV UUID                amZCgU-sQLi-R363-dUFx-Bcdf-iwlt-ZNnDp8
LV Write Access        read/write
LV Status              available
# open                 1
LV Size                4.54 TiB
Current LE             1190134
Segments               2
Allocation             inherit
Read ahead sectors     auto
- currently set to     512
Block device           251:0

格式化为EXT4并挂载为/srv的是哪个?
/dev/mapper/data-data on /srv type ext4 (rw)

有很多免费的空间。
/dev/mapper/data-data
                      4.5T  2.2T  2.1T  51% /srv

其他可能有用的信息:
$ uname -a
Linux ubuntuserver 2.6.32-32-server #62-Ubuntu SMP Wed Apr 20 22:07:43 UTC 2011 x86_64 GNU/Linux

.

00:11.0 SATA controller: ATI Technologies Inc SB700/SB800 SATA Controller [AHCI mode] (rev 40)
02:00.0 RAID bus controller: Silicon Image, Inc. SiI 3132 Serial ATA Raid II Controller (rev 01)

在rsnapshot期间执行cp命令时,我在iostat中看到以下内容:
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.55    0.00    5.47   66.14    0.00   27.85

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.10    0.00     0.80     0.00     8.00     0.00    0.00   0.00   0.00
sdf               0.00   407.50    0.00   66.80     0.00  3790.40    56.74   124.86 1524.88  13.55  90.50
sdh               0.00   406.90    0.00   66.90     0.00  3790.40    56.66    92.89 1230.52  13.21  88.40
sdi               0.00   407.80    5.50   70.20    44.00  3824.00    51.10   113.83 1333.84  12.34  93.40
sdg               0.00   406.80    6.10   71.60    48.80  3827.20    49.88    64.32  787.68  11.69  90.80
md0               0.00     0.00   11.50 1484.60    92.00 11876.80     8.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00   11.50 1484.70    92.00 11877.60     8.00  5331.18  471.91   0.63  94.70
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

所以基本上有很多写入操作,大量的IO等待。
现在这台机器是空闲的,我已经挂起了所有的任务。
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdf               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdh               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdi               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdg               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

看起来很棒!
$ sudo hdparm -T -t /dev/sd[a-i]

/dev/sda:
 Timing cached reads:   2532 MB in  2.00 seconds = 1265.95 MB/sec
 Timing buffered disk reads:  270 MB in  3.02 seconds =  89.53 MB/sec

/dev/sdb:
 Timing cached reads:   2516 MB in  2.00 seconds = 1258.07 MB/sec
 Timing buffered disk reads:  264 MB in  3.02 seconds =  87.37 MB/sec

/dev/sdc:
 Timing cached reads:   2442 MB in  2.00 seconds = 1220.80 MB/sec
 Timing buffered disk reads:  272 MB in  3.00 seconds =  90.60 MB/sec

/dev/sdd:
 Timing cached reads:   2520 MB in  2.00 seconds = 1259.64 MB/sec
 Timing buffered disk reads:  272 MB in  3.02 seconds =  90.07 MB/sec

/dev/sde:
 Timing cached reads:   2524 MB in  2.00 seconds = 1261.48 MB/sec
 Timing buffered disk reads:  306 MB in  3.01 seconds = 101.56 MB/sec

/dev/sdf:
 Timing cached reads:   2366 MB in  2.00 seconds = 1183.28 MB/sec
 Timing buffered disk reads:  388 MB in  3.01 seconds = 128.88 MB/sec

/dev/sdg:
 Timing cached reads:   2536 MB in  2.00 seconds = 1267.52 MB/sec
 Timing buffered disk reads:  400 MB in  3.00 seconds = 133.12 MB/sec

/dev/sdh:
 Timing cached reads:   2538 MB in  2.00 seconds = 1269.08 MB/sec
 Timing buffered disk reads:  426 MB in  3.00 seconds = 141.90 MB/sec

/dev/sdi:
 Timing cached reads:   2538 MB in  2.00 seconds = 1268.57 MB/sec
 Timing buffered disk reads:  402 MB in  3.01 seconds = 133.69 MB/sec

嗯,我讨厌将磁盘结构分散在不同的硬件上,因为这样会使像这样的问题变得很难排查。通常我会建议分别在每个阵列上运行类似bonnie++的工具,以便为它们获取基本的速度基准。我对LVM的经验不是很丰富,所以我不确定是否可以将它们解耦。 - Oli
外部阵列真的不是问题。它上面没有任何限制。我希望能够获得内部磁盘的良好性能。 - popey
1个回答

很遗憾,条带缓存只适用于RAID5和6,对于RAID 0/1/10没有相应的功能。
根据hdparm显示,您的各个硬盘的性能都很好 - 它们都按照该类别的硬盘的预期表现。
我的建议是:
  1. 检查BIOS中是否启用了AHCI,并且内部安装的驱动器未使用传统的IDE模式。MicroServer有一个可用的黑客BIOS,还可以为eSATA端口启用AHCI(更多信息请参见this link)- 可以考虑为外部机箱中的驱动器进行调查,尽管它们仍会受到端口倍增器的限制。
  2. 为所有驱动器启用NCQ,并查看是否有所不同(可能有,也可能没有)。
  3. 确保文件系统设置已经优化(挂载noatime、nodiratime)。您也可以disable write barriers,但这可能太冒险。
  4. 检查是否从切换I/O调度程序中获得任何好处(noop在这里可能有帮助)。
  5. 调整对md和LVM设备的预读缓冲区: blockdev --setra <size> /dev/md1,例如(其中<size>是512字节扇区)。那只能帮助读取操作。
两个可能会影响性能的因素是分区对齐和文件系统创建参数(步幅等),但由于您正在使用现代工具,这不应该是一个问题。

已经使用hdparm命令对磁盘进行了多次添加,并编辑了fstab文件(并重新挂载)以使用noatime和nodiratime选项。将保持这种状态24小时。 - popey