如何提高服务器磁盘性能

如何提高服务器磁盘性能

我有一台运行 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

答案1

不幸的是,条带缓存仅适用于 RAID5 和 6 - 没有与 RAID 0/1/10 等效的缓存。

您的各个驱动器的性能(按照hdparm)看起来不错 - 它们都按照该类驱动器的预期性能运行。

我的建议:

  1. 检查 BIOS 中是否启用了 AHCI,以及内置驱动器是否未使用旧式 IDE 模式。MicroServer 有一个破解版 BIOS,它也能为 eSATA 端口启用 AHCI(请参阅此链接了解更多信息)——可能值得调查外部机箱中的驱动器,尽管它们仍然受到端口倍增器后面的限制。
  2. 为所有驱动器启用 NCQ,看看是否有区别(可能有,也可能没有)。
  3. 确保文件系统设置已优化(挂载 noatime、nodiratime)。你也可以禁用写屏障,但这可能太冒险了。
  4. 检查切换 I/O 调度程序是否有什么好处(noop 可能在这里有帮助)。
  5. 调整 md 和 LVM 设备的预读缓冲区: blockdev --setra <size> /dev/md1例如(其中<size>是 512 字节扇区)。但这只会对读取有帮助。

另外两个可能影响性能的因素是分区对齐和文件系统创建参数(步幅等),但由于您使用的是现代工具,所以这应该不是问题。

相关内容