我有一台带 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 年前提出的,你现在找到解决方案了吗?