复制导致大量 iowait

复制导致大量 iowait

我有一台带 3 个硬盘的专用服务器。系统盘、备份盘(与系统盘相同)和数据盘。当我使用 cp 复制大量数据(例如,在备份盘和数据盘之间)时,平均负载会飞涨。

例如,目前的平均负载约为 0.57,但复制数据时可能会超过 50 甚至更多。

复制rsync and with --bwlimit=10000没有问题。值越高,负载就越高。

文件系统是ext3。

sda-系统磁盘:

% hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   13444 MB in  2.00 seconds = 6730.82 MB/sec
 Timing buffered disk reads:  232 MB in  3.02 seconds =  76.73 MB/sec

sdb-数据盘:

% hdparm -Tt /dev/sdb

/dev/sdb:
 Timing cached reads:   13740 MB in  2.00 seconds = 6879.30 MB/sec
 Timing buffered disk reads:  430 MB in  3.00 seconds = 143.10 MB/sec

sdc-备份磁盘:

% hdparm -Tt /dev/sdc

/dev/sdc:
 Timing cached reads:   13796 MB in  2.00 seconds = 6907.75 MB/sec
 Timing buffered disk reads:  336 MB in  3.01 seconds = 111.45 MB/sec

iostat -x 1(不复制时): http://pastebin.com/4WKU7YPa

iostat -x 1(复制时:sdc > sdb): http://pastebin.com/fHafRCa8

% cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

其他两个磁盘现在处于“截止”状态,但它们也处于“cfq”状态。只是想看看是否会有差异。没有。

任何占用更多磁盘空间的操作都会让服务器崩溃。如果某个进程占用更多内存,需要交换,负载就会变得非常高。有时我必须关闭某些服务,这样负载才能降低。有时由于交换,负载会达到 500。

服务器有 4GB RAM 和 Xeon X3220 @ 2.40GHz。当 RAM 不足时,我可以接受糟糕的性能,但仅仅复制不应该导致服务器崩溃。这似乎不太对劲。

知道可能是什么问题吗?我还应该检查什么?可能是主板控制器坏了?

添加:

%fdisk-l

磁盘 /dev/sda:500.1 GB,500107862016 字节
 255 个磁头、63 个扇区/磁道、60801 个磁柱
 单位 = 16065 * 512 = 8225280 字节的柱面

    设备启动开始结束块ID系统
 /dev/sda1 * 1 13 104391 83 Linux
 /dev/sda2 14 1318 10482412+ 83 Linux
 /dev/sda3 1319 2623 10482412+ 83 Linux
 /dev/sda4 2624 60801 467314785 5 扩展
 /dev/sda5 2624 3928 10482381 83 Linux
 /dev/sda6 3929 4189 2096451 82 Linux 交换 / Solaris
 /dev/sda7 4190 60670 453683601 83 Linux
 /dev/sda8 60671 60801 1052226 83 Linux

 磁盘 /dev/sdb:2000.3 GB,2000398934016 字节
 255 个磁头、63 个扇区/磁道、243201 个磁柱
 单位 = 16065 * 512 = 8225280 字节的柱面

    设备启动开始结束块ID系统
 /dev/sdb1 1 243201 1953512001 83 Linux

 磁盘 /dev/sdc:500.1 GB,500107862016 字节
 255 个磁头、63 个扇区/磁道、60801 个磁柱
 单位 = 16065 * 512 = 8225280 字节的柱面

    设备启动开始结束块ID系统
 /dev/sdc1 * 1 60801 488384001 83 Linux

%猫/ proc / scsi / scsi

附加设备:
 主机:scsi0 通道:00 ID:00 Lun:00
   供应商:ATA 型号:WDC WD5002ABYS-0 修订版:02.0
   类型:直接访问 ANSI SCSI 修订版:05
 主机:scsi0 通道:00 ID:01 Lun:00
   供应商:ATA 型号:WDC WD2003FYYS-0 修订版:01.0
   类型:直接访问 ANSI SCSI 修订版:05
 主机:scsi1 通道:00 ID:00 Lun:00
   供应商:ATA 型号:WDC WD5002ABYS-0 修订版:02.0
   类型:直接访问 ANSI SCSI 修订版:05

答案1

我认为你的情况和我的情况一样生成大量脏页阻碍同步写入

kjournald 跻身顶级流程之列。

您正在使用类似 ext3 的日志文件系统,这显然导致同步写入受阻。

你可以试试

减少进程能够创建的脏内存量:

echo 100000000 > /proc/sys/vm/dirty_background_bytes
echo 200000000 > /proc/sys/vm/dirty_bytes 

执行复制的进程不能一次写入太多数据。它将写入一段数据,然后确保在写入下一段数据之前将此数据刷新到磁盘。它将确保日志线程没有太多数据需要处理,并且在复制过程中仍能处理来自其他进程的请求。

您可以尝试的另一件事是使用 dd 进行复制并确保您正在同步写入:

dd if=foo of=bar bs=4096 oflag=sync

这也将确保块被一点一点地写入。

此外,如果符合您的使用情况,您可以删除目标文件夹上的日志记录(如果您了解风险)。您可以使用以下选项重新挂载(我猜是 ext3?)文件系统:

data=writeback

这些是我在系统中尝试过的东西。这个问题是 2 年前提出的,你现在找到解决方案了吗?

相关内容