一个磁盘上的操作导致其他磁盘过载

一个磁盘上的操作导致其他磁盘过载

我使用 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

然后重新启动。

相关内容