我使用 Ubuntu 15.04 和 MD RAID1、LVM 以及 LXC 作为 Web 服务器。我的正常负载平均值约为 1-2,在我执行任何大规模 IO 操作之前,一切都运行良好。奇怪的是,我在未使用的磁盘上执行这些操作。因此,例如,sdc 和 sdd 在 Web 服务器使用的 RAID1 中,我正在执行 dd if=/dev/zero of=/dev/sdb,或者只是运行 du。几秒钟后,负载平均值跳升至 10 甚至更多,系统几乎无法使用。Nmon 显示所有磁盘都已过载,如果我不停止操作,过载将继续增加。
我正在附加 nmon 的屏幕截图。使用 dd if=/dev/zero of=/dev/sdb 进行重载。
uname 的输出:
... 3.19.0-39-generic #44-Ubuntu SMP 2015 年 12 月 1 日星期二 14:39:05 UTC x86_64 x86_64 x86_64 GNU/Linux
更新:
我已更改磁盘配置,将系统磁盘替换为更强大的 HGST。系统重启后,系统磁盘别名已更改。
lsblk 的输出:
NAME FSTYPE SIZE MOUNTPOINT
sda 1,8T
├─sda1 1M
├─sda2 linux_raid_member 50G
│ └─md0 LVM2_member 50G
│ ├─system-swap swap 10G [SWAP]
│ └─system-root ext4 40G /
└─sda3 linux_raid_member 881,5G
└─md1 LVM2_member 881,4G
├─lxc-hosting ext3 450G
├─lxc-ns1-real 1G
│ ├─lxc-ns1 ext3 1G
│ └─lxc-ns1--snap6 ext3 1G
└─lxc-ns1--snap6-cow 1G
└─lxc-ns1--snap6 ext3 1G
sdb 1,8T
├─sdb1 1M
├─sdb2 linux_raid_member 50G
│ └─md0 LVM2_member 50G
│ ├─system-swap swap 10G [SWAP]
│ └─system-root ext4 40G /
├─sdb3 linux_raid_member 881,5G
│ └─md1 LVM2_member 881,4G
│ ├─lxc-hosting ext3 450G
│ ├─lxc-ns1-real 1G
│ │ ├─lxc-ns1 ext3 1G
│ │ └─lxc-ns1--snap6 ext3 1G
│ └─lxc-ns1--snap6-cow 1G
│ └─lxc-ns1--snap6 ext3 1G
└─sdb4 ext4 931,5G
sdc linux_raid_member 931,5G
└─md2 LVM2_member 931,4G
└─reserve-backups ext4 931,4G /var/backups/mounted
sdd linux_raid_member 931,5G
└─md2 LVM2_member 931,4G
└─reserve-backups ext4 931,4G /var/backups/mounted
lsscsi 的输出:
[0:0:0:0] disk ATA HGST HUS726020AL W517 /dev/sda
[1:0:0:0] disk ATA HGST HUS726020AL W517 /dev/sdb
[2:0:0:0] disk ATA WDC WD1002FBYS-0 0C06 /dev/sdc
[3:0:0:0] disk ATA WDC WD1002FBYS-0 0C06 /dev/sdd
我已经用 pv 进行了新的测试(参见使用 pv < /dev/zero > /dev/md2 加载)。现在情况好多了。对磁盘 sdc 和 sdd 的操作仍然影响 sda 的性能,但平均负载保持在 6-7,系统没有过载。现在我想我明白问题的原因了。由于 sda 和 sdb(作为 RAID 的一部分)用于 Web 服务器,因此它们有恒定的并行请求流。硬盘必须不断移动磁头,从而降低 IO 性能,但系统 IO 缓存(我相信 linux 会将所有可用内存用于此目的)有助于最大限度地减少磁盘访问次数。当我开始大量使用其他磁盘时,缓存就会被新数据填满,这就是这会增加主磁盘负载的原因。如果我是对的,增加 RAM 数量会有所帮助。现在只有 16 GB。
答案1
最有可能的是,所有磁盘都位于同一个控制器上,而控制器就是瓶颈。也就是说,所有磁盘的 io 总吞吐量是有限制的,因此当您开始大量使用一个磁盘时,其他磁盘的可用容量就会减少。
答案2
您可以尝试不同的磁盘调度程序。检查磁盘上当前正在使用的内容(即 sda):
cat /sys/block/sda/queue/scheduler
你可能会看到:
noop 预期截止时间 [cfq]
然后,您可以根据磁盘的类型(ssd、hdd)或它们所在的控制器来决定每个磁盘使用哪个调度程序。只需通过键入以下内容将其设置为不同的调度程序:
echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler
因此,如果你想使用 deadline星展银行这将是:
echo 截止期限> /sys/block/sda/queue/scheduler
你可能会发现使用最后期限在服务器上,在高负载下可以获得更好的响应能力。
如果要更改所有磁盘的调度程序:
编辑 /etc/default/grub:
sudo nano /etc/default/grub
您需要添加 elevator=deadline。将 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 更改为
GRUB_CMDLINE_LINUX_DEFAULT="安静溅水电梯=截止日期"
然后运行
sudo 更新-grub2
然后重新启动。