ฉันมีเซิร์ฟเวอร์เฉพาะที่มี 3 HDD ดิสก์ระบบ ดิสก์สำรอง (เหมือนกับดิสก์ระบบ) และดิสก์ข้อมูล เมื่อฉันคัดลอกข้อมูลจำนวนมากด้วย 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 เนื่องจากการสลับ

เซิร์ฟเวอร์มี RAM 4GB และ Xeon X3220 @ 2.40GHz ฉันสามารถยอมรับประสิทธิภาพต่ำเมื่อมี RAM ไม่เพียงพอ แต่เพียงแค่คัดลอกไม่ควรฆ่าเซิร์ฟเวอร์ แค่นี้ไม่เข้าท่า

มีความคิดว่าจะมีปัญหาอะไรไหม? ฉันควรตรวจสอบอะไรอีกบ้าง อาจเป็นตัวควบคุมเมนบอร์ดที่ไม่ดี?

เพิ่ม:

% fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
 255 heads, 63 sectors/track, 60801 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /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  Extended
 /dev/sda5            2624        3928    10482381   83  Linux
 /dev/sda6            3929        4189     2096451   82  Linux swap / Solaris
 /dev/sda7            4190       60670   453683601   83  Linux
 /dev/sda8           60671       60801     1052226   83  Linux

 Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 
 255 heads, 63 sectors/track, 243201 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdb1               1      243201  1953512001   83  Linux

 Disk /dev/sdc: 500.1 GB, 500107862016 bytes
 255 heads, 63 sectors/track, 60801 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdc1   *           1       60801   488384001   83  Linux

% cat /proc/scsi/scsi

 Attached devices:
 Host: scsi0 Channel: 00 Id: 00 Lun: 00
   Vendor: ATA      Model: WDC WD5002ABYS-0 Rev: 02.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
 Host: scsi0 Channel: 00 Id: 01 Lun: 00
   Vendor: ATA      Model: WDC WD2003FYYS-0 Rev: 01.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
 Host: scsi1 Channel: 00 Id: 00 Lun: 00
   Vendor: ATA      Model: WDC WD5002ABYS-0 Rev: 02.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
answer

ฉันคิดว่าคุณอยู่ในกรณีเดียวกับที่ฉันสร้างเพจสกปรกจำนวนมากกำลังบล็อกการเขียนแบบซิงโครนัส

kjournald among top processes.

คุณกำลังใช้ระบบไฟล์เจอร์นัลเช่น 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 ปีที่แล้ว คุณพบวิธีแก้ปัญหาในระหว่างนี้หรือไม่?