Hạn chế xóa nền Linux (trang bẩn)


26

Việc xóa nền trên Linux xảy ra khi có quá nhiều dữ liệu bằng văn bản đang chờ xử lý (có thể điều chỉnh qua / Proc / sys / vm / Dirt_background_ratio) hoặc thời gian chờ để ghi chờ xử lý (/ Proc / sys / vm / bẩn_recire_centisecs). Trừ khi một giới hạn khác đang được nhấn (/ Proc / sys / vm / Dirt_ratio), nhiều dữ liệu bằng văn bản hơn có thể được lưu trữ. Viết thêm sẽ chặn.

Về lý thuyết, điều này sẽ tạo ra một quy trình nền viết ra các trang bẩn mà không làm phiền các quy trình khác. Trong thực tế, nó không làm phiền bất kỳ quá trình thực hiện đọc không đồng bộ hoặc viết đồng bộ. Tệ. Điều này là do quá trình xóa nền thực sự ghi ở tốc độ thiết bị 100% và mọi yêu cầu thiết bị khác tại thời điểm này sẽ bị trì hoãn (vì tất cả các hàng đợi và bộ đệm ghi trên đường đều được lấp đầy).

Có cách nào để giới hạn số lượng yêu cầu mỗi giây mà quá trình xả thực hiện hoặc ưu tiên hiệu quả I / O của thiết bị khác không?


Có lẽ đây sẽ là một câu hỏi hay để gửi đến danh sách gửi thư hạt nhân linux vger.kernel.org/vger-lists.html#linux-kernel

Bạn đang sử dụng bộ lập lịch IO nào?
3dinfluence

Đã thử nhiều loại (cfq, hạn chót), nhưng tôi đoán chúng chỉ hoạt động đáng tin cậy khi không bao gồm bộ đệm ghi được hỗ trợ bằng pin. Giống như một mảng đĩa, tôi đã ăn 1 GiB dữ liệu ở tốc độ bus PCIe (RAM) và sau đó chạm vào tường thực tế. Vài giây không I / O cho tất cả các LUN. Điều chỉnh xả nước (ít nhất là nền) để ước tính sơ bộ tốc độ thiết bị thực tế sẽ giải quyết vấn đề tắc nghẽn đó.
korkman

1
Gần đây tôi đã nhận thức được / sys / block / sdX / queue / nr numquests là một điều chỉnh chính. Giảm nó xuống mức tối thiểu (= 4 trong trường hợp của tôi) cải thiện rất nhiều độ trễ tải đồng thời: Sysbench fsync ghi ngẫu nhiên mỗi giây đã tăng từ 4 (!) Lên 80-90 trong khi viết ở tốc độ bus bằng dd. Hiệu suất không tải dường như không bị ảnh hưởng. Lập lịch đều giống nhau, noop hoặc hạn chót có vẻ tối ưu. Điều này có thể đúng với hầu hết các cấu hình BBWC.
korkman

Câu trả lời:


20

Sau rất nhiều điểm chuẩn với sysbench, tôi đi đến kết luận này:

Để tồn tại (hiệu suất-khôn ngoan) một tình huống trong đó

  • một quá trình sao chép độc ác tràn ngập các trang bẩn
  • và bộ đệm ghi phần cứng có mặt (có thể không có điều đó)
  • và đọc hoặc ghi đồng bộ mỗi giây (IOPS) là rất quan trọng

chỉ cần đổ tất cả thang máy, hàng đợi và bộ đệm trang bẩn. Vị trí chính xác cho các trang bẩn là trong RAM của bộ đệm ghi phần cứng đó.

Điều chỉnh Dirt_ratio (hoặc Dirt_bytes mới) càng thấp càng tốt, nhưng hãy chú ý đến thông lượng tuần tự. Trong trường hợp cụ thể của tôi, 15 MB là tối ưu ( echo 15000000 > dirty_bytes).

Đây là một hack hơn là một giải pháp vì hiện tại gigabyte RAM chỉ được sử dụng để đọc bộ nhớ đệm thay vì bộ nhớ cache bẩn. Để bộ đệm bẩn hoạt động tốt trong tình huống này, bộ tạo nền hạt nhân Linux sẽ cần trung bình ở tốc độ mà thiết bị bên dưới chấp nhận các yêu cầu và điều chỉnh xả nền phù hợp. Không dễ.


Thông số kỹ thuật và điểm chuẩn để so sánh:

Đã thử nghiệm trong khi nhập ddsố không vào đĩa, sysbench cho thấy thành công lớn , tăng 10 luồng fsync ghi ở 16 kB từ 33 lên 700 IOPS (giới hạn không tải: 1500 IOPS) và luồng đơn từ 8 đến 400 IOPS.

Không tải, IOPS không bị ảnh hưởng (~ 1500) và thông lượng giảm nhẹ (từ 251 MB / s xuống còn 216 MB / s).

dd gọi điện:

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

đối với sysbench, test_file.0 đã được chuẩn bị để không phổ biến với:

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

sysbench gọi cho 10 chủ đề:

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 gọi cho một chủ đề:

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

Kích thước khối nhỏ hơn cho thấy số lượng thậm chí còn quyết liệt hơn.

--file-block-size = 4096 với 1 GB Dirt_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 với 15 MB Dirt_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 với 15 MB Dirt_bytes trên hệ thống nhàn rỗi:

sysbench 0.4.12: điểm chuẩn đánh giá hệ thống đa luồng

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

Hệ thống thử nghiệm:

  • Adaptec 5405Z (đó là bộ nhớ cache ghi 512 MB có bảo vệ)
  • Intel Xeon L5520
  • RAM 6 GiB @ 1066 MHz
  • Bo mạch chủ Supermicro X8DTN (chipset 5520)
  • 12 đĩa Seagate Barracuda 1 TB
    • 10 trong phần mềm Linux RAID 10
  • Hạt nhân 2.6.32
  • Hệ thống tập tin xfs
  • Debian không ổn định

Tóm lại, bây giờ tôi chắc chắn rằng cấu hình này sẽ hoạt động tốt trong các tình huống nhàn rỗi, tải cao và thậm chí đầy tải cho lưu lượng cơ sở dữ liệu mà nếu không sẽ bị bỏ đói bởi lưu lượng tuần tự. Thông lượng tuần tự cao hơn hai liên kết gigabit có thể cung cấp dù sao, vì vậy không có vấn đề giảm nó một chút.


Phương pháp của bạn để đạt đến mức '15 MB cho Dirt_buffers là tối ưu' là gì?
Marcin

1
Phep thử va lôi sai. Giống như, thay đổi một nửa số tiền vào lần tới, v.v., cho đến khi tôi kết thúc với chỉ 15 MB và OK IOPS. Nhân 3.2 hiện tại có thể hoạt động rất khác nhau, BTW.
korkman

2
Chỉ muốn nói lời cảm ơn vì đã đưa tôi đi đúng hướng. Có một số vấn đề tương tự với nút XenServer. Hóa ra là bộ đệm PHP-FPM / APC gây ra các trang bẩn. Điều chỉnh mô hình bộ nhớ cache APC đã giải quyết vấn đề cho chúng tôi. DiskIO đã tăng từ mức sử dụng 20% ​​xuống còn 0.
jeffatrackaid

Về mặt logic, dirty_byteschỉ cần đủ cao để không làm chậm CPU trong khi các tiến trình đang ghi nếu quá trình đang viết trung bình với thông lượng của thiết bị. Nếu mã ứng dụng của bạn đang thực hiện các chu kỳ tính toán khổng lồ sau đó bằng cách ghi lượng dữ liệu khổng lồ, thì sẽ rất khó để tối ưu hóa vì trung bình thời gian ngắn khác rất nhiều so với trung bình thời gian dài. Giải pháp chính xác sẽ là điều chỉnh dirty_bytescài đặt cụ thể của quy trình nhưng Linux không hỗ trợ những thứ như tôi biết.
Mikko Rantalainen

3

Mặc dù việc điều chỉnh các tham số kernel đã ngăn chặn sự cố, nhưng thực tế có thể các sự cố về hiệu suất của bạn là do lỗi trên bộ điều khiển Adaptec 5405Z đã được sửa trong bản cập nhật firmware ngày 1 tháng 2 năm 2012. Ghi chú phát hành cho biết "Đã khắc phục sự cố trong đó phần sụn có thể bị treo khi căng thẳng I / O cao." Có lẽ việc phát tán I / O như bạn đã làm là đủ để ngăn chặn lỗi này được kích hoạt, nhưng đó chỉ là dự đoán.

Dưới đây là các ghi chú phát hành: http://doad.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf

Ngay cả khi đây không phải là trường hợp cụ thể của bạn, tôi cho rằng điều này có thể mang lại lợi ích cho những người dùng gặp phải bài đăng này trong tương lai. Chúng tôi đã thấy một số thông báo như sau trong đầu ra dmesg của chúng tôi, cuối cùng dẫn chúng tôi đến bản cập nhật firmware:

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

Dưới đây là số kiểu của bộ điều khiển RAID Adaptec được liệt kê trong ghi chú phát hành cho phần sụn có sửa lỗi treo I / O cao: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.


1
Wow, cảm ơn cho đầu vào của bạn. Mặc dù đây không phải là trường hợp của tôi, nhưng bạn cho tôi một lý do khác để tránh hoàn toàn RAID RAID và chuyển sang thiết lập chỉ HBA. HW RAID vẫn có lợi thế BBWC, nhưng với những thứ như bcache di chuyển vào kernel, thậm chí điều đó sẽ biến mất. Phía con cho HW RAID chính xác là loại lỗi phần mềm bạn mô tả. Tôi đã có một hệ thống khác với thiết lập DRBD và tải I / O cao gây ra việc cài đặt lại phần sụn, vì vậy đây không phải là trường hợp hiếm gặp (có thể chính xác là lỗi đó).
korkman

1

Một hạt nhân bao gồm "WBT":

Những cải tiến trong lớp khối , LWN.net

Với điều chỉnh viết lại, [lớp khối] cố gắng đạt được hiệu suất tối đa mà không có độ trễ I / O quá mức bằng cách sử dụng chiến lược mượn từ bộ lập lịch mạng CoDel. CoDel theo dõi độ trễ tối thiểu quan sát được của các gói mạng và nếu vượt quá giá trị ngưỡng, nó bắt đầu loại bỏ các gói. Việc ghi giảm được chấp nhận trong hệ thống con I / O, nhưng một chiến lược tương tự được thực hiện theo đó là hạt nhân giám sát độ trễ tối thiểu của cả đọc và ghi và nếu vượt quá giá trị ngưỡng, nó sẽ bắt đầu giảm mức độ ghi nền điều đó đã được thực hiện Hành vi này đã được thêm vào trong 4.10; Axboe nói rằng kết quả khá tốt đã được nhìn thấy.

WBT không yêu cầu chuyển sang lớp khối blk-mq mới. Điều đó nói rằng, nó không hoạt động với các bộ lập lịch I / O CFQ hoặc BFQ. Bạn có thể sử dụng WBT với thời hạn / mq-deadline / noop / không có lịch trình. Tôi tin rằng nó cũng hoạt động với bộ lập lịch I / O "kyber" mới.

Cũng như điều chỉnh kích thước hàng đợi để kiểm soát độ trễ, mã WBT giới hạn số lượng yêu cầu ghi lại nền dưới dạng tỷ lệ của giới hạn hàng đợi được tính toán.

Cấu hình thời gian chạy là trong /sys/class/block/*/queue/wbt_lat_usec.

Các tùy chọn cấu hình xây dựng cần tìm là

/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

Báo cáo vấn đề của bạn được xác nhận 100% bởi tác giả của WBT - cũng được thực hiện :-).

Khối [PATCHSET]: điều chỉnh lưu trữ bộ đệm

Kể từ buổi bình minh của thời gian, tác phẩm đệm nền của chúng tôi đã bị hút. Khi chúng tôi thực hiện ghi đệm nền, nó sẽ có ít tác động đến hoạt động tiền cảnh. Đó là định nghĩa của hoạt động nền ... Nhưng miễn là tôi có thể nhớ, các nhà văn đệm nặng đã không hành xử như vậy. Chẳng hạn, nếu tôi làm một cái gì đó như thế này:

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

trên máy tính xách tay của tôi, sau đó thử và khởi động chrome, về cơ bản, nó sẽ không bắt đầu trước khi quá trình ghi đệm được thực hiện. Hoặc, đối với khối lượng công việc theo định hướng của máy chủ, trong đó việc cài đặt RPM lớn (hoặc tương tự) ảnh hưởng xấu đến việc đọc hoặc ghi đồng bộ hóa cơ sở dữ liệu. Khi điều đó xảy ra, tôi khiến mọi người la hét với tôi.

Kết quả từ một số thử nghiệm gần đây có thể được tìm thấy ở đây:

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

Xem các bài đăng trước để biết mô tả lớn hơn về patchset.


Tôi rất vui khi thấy vấn đề được nhận ra và xử lý bên trong kernel. Hãy nhớ rằng blk-mq còn khá mới và có thể chưa trưởng thành .
korkman

@korkman thở dài, tôi đoán tôi sẽ đọc trích dẫn để tránh hàm ý sai. Tôi đồng ý đây là công cụ được thêm vào trong vài năm qua, vẫn có thể có hồi quy hiệu suất hoặc tệ hơn. AFAIR nhà bảo trì loại bỏ sửa chữa tham nhũng dữ liệu theo nghĩa đó là một sự cố. Nếu bạn đang sử dụng các phiên bản kernel nơi blk-mq được phát triển, có thể tranh cãi rằng việc sử dụng lớp khối "di sản" sẽ tránh được bao nhiêu lỗi. Lỗi tạm ngưng tôi đã sửa là một lỗi bắt nguồn từ blk-mq, sau đó nó đã được tái cấu trúc hoặc một cái gì đó & ảnh hưởng đến cả hai. github.com/torvalds/linux/commit/1dc3039bc87a
sourcejedi

0

Trung bình của bạn cho Bẩn trong / Proc / meminfo là gì? Điều này thường không vượt quá / Proc / sys / vm / Dirt_ratio của bạn. Trên một máy chủ tệp chuyên dụng, tôi đã đặt bẩn_ratio với tỷ lệ bộ nhớ rất cao (90), vì tôi sẽ không bao giờ vượt quá nó. Dirt_ration của bạn quá thấp, khi bạn đánh nó, mọi thứ sẽ biến mất, nâng nó lên.


Vấn đề không phải là các quy trình bị chặn khi nhấn bẩn_ratio. Tôi ổn với điều đó. Nhưng quá trình "nền" ghi dữ liệu bẩn vào các đĩa sẽ lấp đầy hàng đợi mà không thương xót và giết chết hiệu suất IOPS. Tôi nghĩ đó là cái chết đói IO. Trên thực tế, việc đặt bẩn_ratio_bytes cực thấp (như 1 MB) sẽ giúp ích rất nhiều, vì việc xả nước sẽ xảy ra gần như ngay lập tức và hàng đợi sẽ được giữ trống. Nhược điểm có thể là thông lượng thấp hơn cho tuần tự, nhưng không sao.
korkman

Bạn đã tắt tất cả thang máy? Những gì khác bạn đã tinh chỉnh từ một hệ thống vanilla?
Luke

1
Xem tự trả lời của tôi. Kết thúc của câu chuyện là loại bỏ bộ nhớ đệm bẩn và để phần đó vào bộ điều khiển CTNH. Thang máy không liên quan với bộ nhớ đệm ghi CT. Bộ điều khiển có thuật toán thang máy riêng, do đó, có bất kỳ thang máy nào trong phần mềm chỉ thêm chi phí.
korkman

Elevevator trong phần mềm là một sự đánh đổi: hy sinh độ trễ để cải thiện băng thông. Ví dụ, hãy tưởng tượng ops ghi 100K trong hàng đợi phần mềm được gửi theo thứ tự ngẫu nhiên; nếu thang máy phần mềm có thể ra lệnh cho các op đó sử dụng bộ đệm lớn thì cuối cùng chỉ có thể gửi 5K yêu cầu lớn hơn cho thiết bị. Tuy nhiên, do đó, độ trễ cần phải tăng thêm 100K op vì có thể các op 2K đầu tiên và op 1K cuối cùng thực sự ở gần nhau trên thiết bị. Nếu không thêm độ trễ, sẽ không thể hợp nhất những thứ đó.
Mikko Rantalainen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.