จำกัด ลินุกซ์พื้นหลังล้าง (หน้าสกปรก)


26

การลบพื้นหลังบน Linux เกิดขึ้นเมื่อข้อมูลที่เขียนมากเกินไปกำลังรอดำเนินการ (ปรับได้ผ่าน / proc / sys / vm / dirty_background_ratio) หรือหมดเวลาสำหรับการเขียนที่รอดำเนินการ (/ proc / sys / vm / dirty_expire_centisecs) นอกจากจะมีการตีขีด จำกัด อื่น (/ proc / sys / vm / dirty_ratio) ข้อมูลที่เขียนเพิ่มเติมอาจถูกแคช การเขียนเพิ่มเติมจะปิดกั้น

ในทางทฤษฎีสิ่งนี้ควรสร้างกระบวนการพื้นหลังที่เขียนหน้าสกปรกโดยไม่รบกวนกระบวนการอื่น ในทางปฏิบัติมันจะรบกวนกระบวนการใด ๆ ที่ทำให้การอ่านไม่ได้หรือการเขียนแบบซิงโครนัส ไม่ดี. นี่เป็นเพราะการล้างพื้นหลังเขียนจริงที่ความเร็วอุปกรณ์ 100% และการร้องขออุปกรณ์อื่น ๆ ในเวลานี้จะล่าช้า (เพราะคิวและแคชการเขียนทั้งหมดบนถนนเต็มไป)

มีวิธี จำกัด จำนวนการร้องขอต่อวินาทีหรือไม่ที่กระบวนการล้างข้อมูลดำเนินการหรือจัดลำดับความสำคัญของอุปกรณ์ I / O อื่นได้อย่างมีประสิทธิภาพหรือไม่?


บางทีนี่อาจเป็นคำถามที่ดีที่ส่งไปยังลินุกซ์เคอร์เนลรายชื่อผู้รับจดหมายvger.kernel.org/vger-lists.html#linux-kernel

คุณใช้ตัวกำหนดเวลา IO อะไร
3dinfluence

ลองใช้หลายอย่าง (cfq, deadline) แต่ฉันเดาว่ามันจะทำงานได้อย่างน่าเชื่อถือเมื่อไม่มีแคชการเขียนสำรองแบตเตอรี่ เช่นเดียวกับดิสก์อาร์เรย์หนึ่งตัวฉันมีข้อมูล 1 GiB ที่ PCIe bus speed (RAM) จากนั้นก็ชนกับกำแพง หลายวินาทีเป็นศูนย์ I / O สำหรับ LUN ทั้งหมด การควบคุมปริมาณวูบวาบ (อย่างน้อยพื้นหลังอย่างใดอย่างหนึ่ง) ถึงการประมาณคร่าวๆของความเร็วอุปกรณ์จริงจะแก้ปัญหาความแออัดที่
korkman

1
ฉันเพิ่งรู้ว่า / sys / block / sdX / queue / nr_requests เป็น tunable ที่สำคัญ เปลี่ยนเป็นต่ำสุด (= 4 ในกรณีของฉัน) เพิ่มความล่าช้าในการโหลดพร้อมกันมาก: Sysbench fsync สุ่มเขียนต่อวินาทีเพิ่มขึ้นจาก 4 (!) เป็น 80-90 ในขณะที่เขียนด้วยความเร็วบัสด้วย dd ประสิทธิภาพที่ไม่ใช่โหลดดูเหมือนว่าจะไม่ได้รับผลกระทบ ตัวกำหนดเวลาเหมือนกันหมดไม่มีเวลาหรือกำหนดเวลาที่เหมาะสมที่สุด นี่อาจเป็นจริงสำหรับการกำหนดค่า BBWC ส่วนใหญ่
korkman

คำตอบ:


20

หลังจากการเปรียบเทียบกับ sysbench มากมายฉันมาถึงข้อสรุปนี้:

เพื่อความอยู่รอด (ประสิทธิภาพฉลาด) สถานการณ์ที่

  • กระบวนการคัดลอกที่ชั่วร้ายทำให้หน้าสกปรก
  • และฮาร์ดแวร์แคชการเขียนมีอยู่
  • และการอ่านหรือเขียนต่อวินาที (IOPS) แบบซิงโครนัสเป็นสิ่งสำคัญ

เพียงทิ้งลิฟท์, คิวและหน้าแคชทั้งหมด ตำแหน่งที่ถูกต้องสำหรับเพจที่สกปรกอยู่ใน RAM ของฮาร์ดแวร์การเขียนแคช

ปรับ dirty_ratio (หรือ dirty_bytes ใหม่) ให้ต่ำที่สุดเท่าที่จะทำได้ แต่คอยดูปริมาณงานต่อเนื่อง ในกรณีของฉัน 15 MB นั้นเหมาะสมที่สุด ( echo 15000000 > dirty_bytes)

นี่เป็นแฮ็คมากกว่าโซลูชันเนื่องจากมีหน่วยความจำกิกะไบต์ในขณะนี้ใช้สำหรับอ่านแคชเท่านั้นแทนที่จะใช้แคชที่สกปรก เพื่อให้แคชสกปรกทำงานได้ดีในสถานการณ์นี้เคอร์เนลพื้นหลังลินุกซ์จะต้องเฉลี่ยที่ความเร็วของอุปกรณ์ที่รองรับการร้องขอและปรับการล้างพื้นหลังตามลำดับ ไม่ใช่เรื่องง่าย.


ข้อมูลจำเพาะและมาตรฐานสำหรับการเปรียบเทียบ:

ผ่านการทดสอบในขณะที่ddเรียกเลขศูนย์ไปยังดิสก์ sysbench พบว่าประสบความสำเร็จอย่างมากโดยเพิ่ม 10 เธรด fsync ให้เขียนที่ 16 kB จาก 33 เป็น 700 IOPS (จำกัด การใช้งาน: 1500 IOPS) และเธรดเดี่ยวตั้งแต่ 8 ถึง 400 IOPS

หากไม่มีโหลด IOPS จะไม่ได้รับผลกระทบ (~ 1500) และปริมาณงานจะลดลงเล็กน้อย (จาก 251 MB / s เป็น 216 MB / s)

dd โทร:

dd if=/dev/zero of=dumpfile bs=1024 count=20485672

สำหรับ sysbench, test_file.0 ได้เตรียมที่จะไม่หยาบกับ:

dd if=/dev/zero of=test_file.0 bs=1024 count=10485672

sysbench เรียก 10 เธรด:

sysbench --test=fileio --file-num=1 --num-threads=10 --file-total-size=10G --file-fsync-all=on --file-test-mode=rndwr --max-time=30 --file-block-size=16384 --max-requests=0 run

sysbench เรียกหนึ่งเธรด:

sysbench --test=fileio --file-num=1 --num-threads=1 --file-total-size=10G --file-fsync-all=on --file-test-mode=rndwr --max-time=30 --file-block-size=16384 --max-requests=0 run

ขนาดบล็อกที่เล็กกว่าแสดงจำนวนที่มากขึ้น

--file-block-size = 4096 ที่มี 1 GB dirty_bytes:

sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
1 files, 10Gb each
10Gb total file size
Block size 4Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Calling fsync() after each write operation.
Using synchronous I/O mode
Doing random write test
Threads started!
Time limit exceeded, exiting...
Done.

Operations performed:  0 Read, 30 Write, 30 Other = 60 Total
Read 0b  Written 120Kb  Total transferred 120Kb  (3.939Kb/sec)
      0.98 Requests/sec executed

Test execution summary:
      total time:                          30.4642s
      total number of events:              30
      total time taken by event execution: 30.4639
      per-request statistics:
           min:                                 94.36ms
           avg:                               1015.46ms
           max:                               1591.95ms
           approx.  95 percentile:            1591.30ms

Threads fairness:
      events (avg/stddev):           30.0000/0.00
      execution time (avg/stddev):   30.4639/0.00

--file-block-size = 4096 ที่มี 15 MB dirty_bytes:

sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
1 files, 10Gb each
10Gb total file size
Block size 4Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Calling fsync() after each write operation.
Using synchronous I/O mode
Doing random write test
Threads started!
Time limit exceeded, exiting...
Done.

Operations performed:  0 Read, 13524 Write, 13524 Other = 27048 Total
Read 0b  Written 52.828Mb  Total transferred 52.828Mb  (1.7608Mb/sec)
    450.75 Requests/sec executed

Test execution summary:
      total time:                          30.0032s
      total number of events:              13524
      total time taken by event execution: 29.9921
      per-request statistics:
           min:                                  0.10ms
           avg:                                  2.22ms
           max:                                145.75ms
           approx.  95 percentile:              12.35ms

Threads fairness:
      events (avg/stddev):           13524.0000/0.00
      execution time (avg/stddev):   29.9921/0.00

--file-block-size = 4096 ที่มี 15 MB dirty_bytes บนระบบว่าง:

sysbench 0.4.12: มาตรฐานการประเมินผลระบบมัลติเธรด

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
1 files, 10Gb each
10Gb total file size
Block size 4Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Calling fsync() after each write operation.
Using synchronous I/O mode
Doing random write test
Threads started!
Time limit exceeded, exiting...
Done.

Operations performed:  0 Read, 43801 Write, 43801 Other = 87602 Total
Read 0b  Written 171.1Mb  Total transferred 171.1Mb  (5.7032Mb/sec)
 1460.02 Requests/sec executed

Test execution summary:
      total time:                          30.0004s
      total number of events:              43801
      total time taken by event execution: 29.9662
      per-request statistics:
           min:                                  0.10ms
           avg:                                  0.68ms
           max:                                275.50ms
           approx.  95 percentile:               3.28ms

Threads fairness:
      events (avg/stddev):           43801.0000/0.00
      execution time (avg/stddev):   29.9662/0.00

การทดสอบระบบ:

  • Adaptec 5405Z (นั่นคือ 512 MB เขียนแคชพร้อมการป้องกัน)
  • Intel Xeon L5520
  • 6 GiB RAM @ 1066 MHz
  • เมนบอร์ด Supermicro X8DTN (ชิปเซ็ต 5520)
  • 12 Seagate Barracuda ดิสก์ 1 TB
    • 10 ในซอฟต์แวร์ Linux RAID 10
  • เคอร์เนล 2.6.32
  • ระบบไฟล์ xfs
  • เดเบียนไม่เสถียร

โดยสรุปตอนนี้ฉันมั่นใจว่าการกำหนดค่านี้จะทำงานได้ดีในการใช้งานโหลดสูงและแม้กระทั่งสถานการณ์การโหลดเต็มสำหรับการรับส่งข้อมูลฐานข้อมูลที่อื่นจะได้รับการหิวโหยโดยลำดับการรับส่งข้อมูล ปริมาณงานต่อเนื่องนั้นสูงกว่าลิงก์กิกะบิตสองตัวที่สามารถให้บริการได้ดังนั้นจึงไม่มีปัญหาในการลดบิตลง


วิธีการของคุณในการมาถึงส่วน '15MB สำหรับ dirty_buffers นั้นดีที่สุด' คืออะไร
Marcin

1
ลองผิดลองถูก ชอบเปลี่ยนครึ่งหนึ่งของจำนวนเงินในครั้งถัดไปเป็นต้นจนกว่าฉันจะลงเอยด้วยเพียง 15 MB และ OK IOPS เคอร์เนลปัจจุบัน 3.2 อาจทำงานแตกต่างกันมาก BTW
korkman

2
แค่อยากจะบอกว่าขอบคุณที่ทำให้ฉันถูกทาง พบปัญหาที่คล้ายกันบางอย่างกับโหนด XenServer กลายเป็นแคช PHP-FPM / APC ทำให้หน้าเว็บสกปรก การปรับโมเดลหน่วยความจำแคช APC ช่วยแก้ปัญหาสำหรับเรา DiskIO เปลี่ยนจากการใช้ประโยชน์ 20% เป็น 0.
jeffatrackaid

เหตุผลdirty_bytesควรสูงพอที่จะไม่หยุดซีพียูในขณะที่กระบวนการกำลังเขียนถ้ากระบวนการกำลังเขียนโดยเฉลี่ยด้วยปริมาณงานของอุปกรณ์ หากรหัสแอปพลิเคชันของคุณกำลังทำการประมวลผลขนาดใหญ่ตามมาด้วยการเขียนข้อมูลจำนวนมากหากเป็นการยากที่จะปรับให้เหมาะสมเพราะค่าเฉลี่ยระยะเวลาสั้น ๆ นั้นแตกต่างอย่างมากจากค่าเฉลี่ยระยะยาว ทางออกที่ถูกต้องคือปรับdirty_bytesการตั้งค่าเฉพาะของกระบวนการแต่ Linux ไม่รองรับสิ่งต่าง ๆ เท่าที่ฉันรู้
Mikko Rantalainen

3

แม้ว่าการปรับพารามิเตอร์ของเคอร์เนลจะหยุดปัญหา แต่ที่จริงแล้วอาจเป็นไปได้ว่าปัญหาด้านประสิทธิภาพของคุณเป็นผลมาจากข้อผิดพลาดในคอนโทรลเลอร์ Adaptec 5405Z ที่ได้รับการแก้ไขในการอัปเดตเฟิร์มแวร์เมื่อวันที่ 1 ก.พ. 2012 บันทึกประจำรุ่นบอกว่า "แก้ไขปัญหาที่เฟิร์มแวร์อาจค้างในระหว่างที่มีปัญหา I / O สูง" บางทีกระจาย I / O ออกไปอย่างที่คุณทำก็เพียงพอที่จะป้องกันข้อผิดพลาดนี้จากการถูกทริกเกอร์ แต่นั่นเป็นเพียงการเดา

นี่คือบันทึกประจำรุ่น: http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf

แม้ว่านี่ไม่ใช่กรณีสำหรับสถานการณ์เฉพาะของคุณ แต่ฉันคิดว่านี่อาจเป็นประโยชน์ต่อผู้ใช้ที่เจอโพสต์นี้ในอนาคต เราเห็นข้อความบางอย่างเช่นข้อความต่อไปนี้ในเอาต์พุต dmesg ซึ่งในที่สุดก็นำเราไปสู่การอัปเดตเฟิร์มแวร์:

aacraid: Host adapter abort request (0,0,0,0)
[above was repeated many times]
AAC: Host adapter BLINK LED 0x62
AAC0: adapter kernel panic'd 62.
sd 0:0:0:0: timing out command, waited 360s
sd 0:0:0:0: Unhandled error code
sd 0:0:0:0: SCSI error: return code = 0x06000000
Result: hostbyte=DID_OK driverbyte=DRIVER_TIMEOUT,SUGGEST_OK
sd 0:0:0:0: timing out command, waited 360s
sd 0:0:0:0: Unhandled error code
sd 0:0:0:0: SCSI error: return code = 0x06000028
Result: hostbyte=DID_OK driverbyte=DRIVER_TIMEOUT,SUGGEST_OK
sd 0:0:0:0: timing out command, waited 360s
sd 0:0:0:0: Unhandled error code
sd 0:0:0:0: SCSI error: return code = 0x06000028

นี่คือหมายเลขรุ่นของ Adaptec RAID controllers ซึ่งแสดงรายการไว้ในบันทึกย่อประจำรุ่นสำหรับเฟิร์มแวร์ที่มีการแก้ไข I / O แฮงสูง: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445


1
ว้าวขอบคุณสำหรับข้อมูลของคุณ แม้ว่านี่จะไม่ใช่กรณีของฉัน แต่คุณก็ให้ฉันอีกเหตุผลหนึ่งในการหลีกเลี่ยง HW RAID ทั้งหมดและไปที่การตั้งค่า HBA เท่านั้น HW RAID ยังคงมีข้อได้เปรียบ BBWC แต่ด้วยสิ่งต่าง ๆ เช่น bcache ที่ย้ายเข้าไปในเคอร์เนลแม้มันจะหายไป ด้านแย้งสำหรับ HW RAID เป็นประเภทของข้อบกพร่องของเฟิร์มแวร์ที่คุณอธิบาย ฉันมีระบบอื่นที่มีการตั้งค่า DRBD และการโหลด I / O สูงทำให้เกิดการรีเซ็ตเฟิร์มแวร์ดังนั้นจึงไม่ใช่เรื่องยากที่จะเจอ
korkman

1

เคอร์เนลซึ่งรวมถึง "WBT":

การปรับปรุงในเลเยอร์บล็อก LWN.net

ด้วยการควบคุมปริมาณการเขียนข้อมูลกลับ [เลเยอร์บล็อก] พยายามรับประสิทธิภาพสูงสุดโดยไม่มีเวลาแฝง I / O มากเกินไปโดยใช้กลยุทธ์ที่ยืมมาจากตัวกำหนดเวลาเครือข่าย CoDel CoDel ติดตามเวลาแฝงต่ำสุดที่สังเกตได้ของแพ็คเก็ตเครือข่ายและหากเกินค่าเกณฑ์มันจะเริ่มทิ้งแพ็กเก็ต การเขียนที่ลดลงถูก frowned ต่อในระบบย่อย I / O แต่กลยุทธ์ที่คล้ายกันมีการติดตามในที่เคอร์เนลตรวจสอบเวลาแฝงต่ำสุดของทั้งการอ่านและการเขียนและถ้าที่เกินกว่าค่าเกณฑ์ก็เริ่มลดจำนวนของการเขียนพื้นหลัง ที่กำลังทำ พฤติกรรมนี้ถูกเพิ่มใน 4.10; Axboe กล่าวว่าเห็นผลลัพธ์ที่ดีพอสมควร

WBT ไม่ต้องการเปลี่ยนเป็นเลเยอร์บล็อก blk-mq ใหม่ ที่กล่าวมาจะไม่ทำงานกับตัวกำหนดเวลา CFQ หรือ BFQ I / O คุณสามารถใช้ WBT กับกำหนดเวลา / mq-deadline / noop / none schedulers ฉันเชื่อว่ามันใช้งานได้กับตารางเวลา I / O ใหม่ของ "kyber"

เช่นเดียวกับการปรับขนาดคิวเพื่อควบคุมเวลาในการตอบสนองรหัส WBT จำกัด จำนวนการร้องขอการเขียนแบ็คกราวน์เบื้องหลังตามสัดส่วนของขีด จำกัด คิวที่คำนวณได้

การกำหนดค่า runtime /sys/class/block/*/queue/wbt_lat_usecคือใน

ตัวเลือกการกำหนดค่าการสร้างที่จะมองหาคือ

/boot/config-4.20.8-200.fc29.x86_64:CONFIG_BLK_WBT=y
/boot/config-4.20.8-200.fc29.x86_64:# CONFIG_BLK_WBT_SQ is not set
/boot/config-4.20.8-200.fc29.x86_64:CONFIG_BLK_WBT_MQ=y

คำแถลงปัญหาของคุณได้รับการยืนยัน 100% โดยผู้เขียน WBT - ทำได้ดีมาก :-)

[PATCHSET] บล็อก: การควบคุมปริมาณการเขียนข้อมูลแบบบัฟเฟอร์

ตั้งแต่รุ่งอรุณของเวลาแบ็คกราดด์แบ็คกราวน์บัฟเฟอร์ของเราได้ถูกดูด เมื่อเราทำการแบ็คแบ็คแบ็คกราวน์แบ็คบัฟเฟอร์มันจะมีผลกระทบเล็กน้อยต่อการทำงานเบื้องหน้า นั่นคือคำจำกัดความของกิจกรรมพื้นหลัง ... แต่ตราบใดที่ฉันยังจำได้นักเขียนที่มีบัฟเฟอร์จำนวนมากไม่ได้ทำตัวแบบนั้น ตัวอย่างเช่นถ้าฉันทำอะไรเช่นนี้:

$ dd if=/dev/zero of=foo bs=1M count=10k

บนแล็ปท็อปของฉันแล้วลองและเริ่ม Chrome โดยพื้นฐานแล้วจะไม่เริ่มก่อนที่การเขียนข้อมูลบัฟเฟอร์จะเสร็จสิ้น หรือสำหรับเวิร์กโหลดเชิงเซิร์ฟเวอร์ที่การติดตั้ง RPM ขนาดใหญ่ (หรือคล้ายกัน) ส่งผลลบต่อการอ่านหรือซิงค์ฐานข้อมูล เมื่อสิ่งนั้นเกิดขึ้นฉันจะทำให้ผู้คนตะโกนใส่ฉัน

ผลการทดสอบล่าสุดสามารถพบได้ที่นี่:

https://www.facebook.com/axboe/posts/10154074651342933

ดูการโพสต์ก่อนหน้าสำหรับคำอธิบายที่ใหญ่กว่าของชุดแพทช์


ฉันยินดีที่จะเห็นปัญหาได้รับการยอมรับและจัดการกับเคอร์เนลในขณะนี้ อย่าเก็บไว้ในใจ BLK-MQ ค่อนข้างใหม่และอาจจะไม่เป็นผู้ใหญ่เลย
korkman

@korkman ถอนหายใจฉันคิดว่าฉันจะทำให้งงงวยคำพูดเพื่อหลีกเลี่ยงความหมายที่ผิดพลาด ฉันยอมรับว่านี่คือสิ่งที่เพิ่มเข้ามาในช่วงสองสามปีที่ผ่านมาอาจยังคงมีการถดถอยหรือแย่ลง AFAIR ผู้ดูแลระบบยกเลิกการแก้ไขข้อมูลเสียหายในแง่ที่ว่าเป็นความบังเอิญ หากคุณกำลังใช้เคอร์เนลเวอร์ชันที่ blk-mq ได้รับการพัฒนามันสามารถพิสูจน์ได้ว่าการใช้เลเยอร์บล็อก "ดั้งเดิม" จะหลีกเลี่ยงข้อบกพร่อง ข้อผิดพลาดที่ระงับที่ฉันแก้ไขคือข้อผิดพลาดที่เกิดขึ้นใน blk-mq จากนั้นจะมีการปรับโครงสร้างใหม่หรือบางสิ่ง & ได้รับผลกระทบทั้งสองอย่าง github.com/torvalds/linux/commit/1dc3039bc87a
sourcejedi

0

ค่าเฉลี่ยของคุณสำหรับ Dirty in / proc / meminfo คืออะไร? โดยปกติไม่ควรเกิน / proc / sys / vm / dirty_ratio ของคุณ ในไฟล์เซิร์ฟเวอร์เฉพาะฉันได้ตั้งค่า dirty_ratio เป็นเปอร์เซ็นต์ของหน่วยความจำสูงมาก (90) เนื่องจากฉันจะไม่เกินมัน dirty_ration ของคุณต่ำเกินไปเมื่อคุณกดมันทุกอย่างจะออกมายกระดับ


ปัญหาไม่ได้เป็นกระบวนการที่ถูกบล็อกเมื่อกดปุ่ม dirty_ratio ฉันไม่เป็นไร แต่กระบวนการ "แบ็คกราวน์" จะเขียนข้อมูลสกปรกลงในดิสก์เพื่อเติมคิวโดยไม่ต้องใช้ความเมตตาและฆ่าประสิทธิภาพของ IOPS มันเรียกว่าการอดอาหาร IO ฉันคิดว่า ในความเป็นจริงการตั้งค่า dirty_ratio_bytes ต่ำมาก (เช่น 1 MB) จะช่วยได้มากเนื่องจากการล้างข้อมูลจะเกิดขึ้นเกือบจะในทันทีและคิวจะถูกเก็บไว้ว่างเปล่า ข้อเสียเปรียบอาจเป็นทรูพุตต่อเนื่องที่ต่ำกว่า แต่ก็โอเค
korkman

คุณปิดลิฟต์ทั้งหมดหรือไม่ มีอะไรอีกที่คุณปรับแต่งจากระบบวานิลลา?
ลุค

1
ดูคำตอบของฉัน ในตอนท้ายของเรื่องคือการลบแคชที่สกปรกและออกจากส่วนนั้นไปที่ตัวควบคุม HW ลิฟท์ไม่มีความเกี่ยวข้องกับ HW write-cache คอนโทรลเลอร์มีอัลกอริทึมลิฟต์เป็นของตนเองดังนั้นการมีลิฟท์ใด ๆ ในซอฟต์แวร์จะเพิ่มค่าใช้จ่ายเท่านั้น
korkman

Elevevator ในซอฟต์แวร์เป็นการแลกเปลี่ยนที่เสียสละเวลาแฝงเพื่อปรับปรุงแบนด์วิดท์ ตัวอย่างเช่นลองนึกภาพการเขียน 100K ในคิวซอฟต์แวร์ที่ส่งไปตามลำดับแบบสุ่ม หากลิฟต์ซอฟต์แวร์สามารถสั่งซื้อ ops เหล่านั้นโดยใช้บัฟเฟอร์ขนาดใหญ่อาจเป็นการส่งคำขอขนาดใหญ่กว่า 5K ไปยังอุปกรณ์เท่านั้น อย่างไรก็ตามเป็นผลให้เวลาในการตอบสนองต้องเพิ่มขึ้น 100K ops เพราะอาจเป็นได้ว่า 2K ops แรกและ 1K ops สุดท้ายนั้นอยู่ใกล้กันบนอุปกรณ์ หากไม่มีเวลาแฝงเพิ่มจะเป็นไปไม่ได้ที่จะรวมสิ่งเหล่านั้น
Mikko Rantalainen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.