Dịch từ wiki chính thức: https://github.com/facebook/rocksdb/wiki/Write-Stalls Vui lòng ghi rõ nguồn in lại: https://www.cnblogs.com/morningli/p/16791706.html.
viết gian hàng
Khi việc nén hoặc xả không thể theo kịp tốc độ ghi, rockdb có hệ thống bỏ qua để làm chậm tốc độ ghi. Nếu không có hệ thống như vậy, nếu người dùng tiếp tục ghi nhiều dữ liệu hơn mức phần cứng có thể xử lý thì các vấn đề sau sẽ xảy ra trong cơ sở dữ liệu:
- Tăng khuếch đại không gian sẽ dẫn đến hết dung lượng đĩa
- Tăng khả năng khuếch đại đọc, gây tổn hại nghiêm trọng đến hiệu suất đọc
Ý tưởng là làm chậm quá trình ghi đến tốc độ mà cơ sở dữ liệu có thể xử lý. Tuy nhiên, đôi khi cơ sở dữ liệu quá nhạy cảm với các đợt ghi tạm thời hoặc đánh giá thấp khả năng xử lý của phần cứng, do đó, bạn có thể thấy tình trạng chậm hoặc hết thời gian chờ truy vấn không mong muốn.
Để tìm hiểu xem cơ sở dữ liệu của bạn có vấn đề về việc ngừng ghi hay không, bạn có thể kiểm tra:
- LOG, tệp này sẽ chứa nhật ký thông tin khi xảy ra tình trạng ngừng ghi.
- Tìm số liệu thống kê nén trong tệp LOG
Lý do ngừng viết
Việc ngừng hoạt động có thể được kích hoạt vì những lý do sau:
-
Có quá nhiều bảng ghi nhớ. Khi số lượng memtable đang chờ xóa lớn hơn hoặc bằng max_write_buffer_number, quá trình ghi sẽ ngừng ghi hoàn toàn và đợi quá trình xóa kết thúc. Ngoài ra, nếu max_write_buffer_number lớn hơn 3 và khả năng ghi nhớ đang chờ xóa lớn hơn hoặc bằng max_write_buffer_number-1, quá trình ghi sẽ bị đình trệ. Trong những trường hợp này, bạn sẽ nhận được nhật ký thông tin tương tự như sau trong tệp LOG:
Dừng ghi vì chúng ta có 5 memtable bất biến (đang chờ flush), max_write_buffer_number được đặt thành 5.
Việc ghi bị đình trệ vì chúng ta có 4 memtable bất biến (đang chờ flush), max_write_buffer_number được đặt thành 5.
-
Quá nhiều tệp sst lớp 0. Khi số lượng tệp sst ở cấp 0 đạt đến cấp độ0_slowdown_writes_trigger, quá trình ghi sẽ bị đình trệ. Khi số lượng file sst ở cấp độ 0 đạt đến cấp độ0_stop_writes_trigger, việc ghi sẽ dừng hoàn toàn và chờ nén từ cấp độ 0 xuống cấp độ 1 để giảm số lượng tệp ở cấp độ 0. Trong những trường hợp này, bạn sẽ nhận được nhật ký thông tin tương tự như sau trong tệp LOG:
Việc ghi bị đình trệ vì chúng ta có 4 tệp cấp độ 0.
Dừng ghi vì chúng ta có 20 tệp cấp độ 0 。
-
Quá nhiều byte đang chờ nén. Khi số byte ước tính đang chờ nén đạt đến soft_pending_compaction_bytes, quá trình ghi sẽ bị đình trệ. Khi số byte chờ đánh giá đạt đến hard_pending_compaction_bytes, việc ghi sẽ hoàn toàn ngừng chờ nén. Trong những trường hợp này, bạn sẽ nhận được nhật ký thông tin tương tự như sau trong tệp LOG:
Việc ghi bị đình trệ do ước tính có 500000000 byte nén đang chờ xử lý.
Dừng ghi vì số byte nén đang chờ ước tính là 1000000000 。
Bất cứ khi nào tình trạng ngừng hoạt động được kích hoạt,rockdb sẽ giảm tốc độ ghi xuống delay_write_rate. Nếu số byte chờ nén vẫn tăng, nó có thể bị giảm xuống tốc độ thấp hơn delay_write_rate. Cần lưu ý rằng trình kích hoạt làm chậm/dừng và giới hạn byte để chờ nén được định cấu hình riêng cho từng họ cột, nhưng trạng thái ngừng ghi được áp dụng cho toàn bộ cơ sở dữ liệu, có nghĩa là nếu một họ cột kích hoạt trạng thái ngừng ghi, toàn bộ cơ sở dữ liệu sẽ bị đình trệ.
ghi không chặn
Nếu quá trình ghi chậm/dừng được kích hoạt, luồng chương trình thực thi Đặt/Hợp nhất/Xóa, v.v. sẽ bị chặn. Nếu tình trạng chậm lại xảy ra, mỗi lần ghi sẽ ở chế độ ngủ trong một khoảng thời gian (thường là 1 mili giây) trước khi được xử lý. Nếu quá trình ghi bị đình trệ, luồng có thể bị chặn vô thời hạn. Nếu bạn không muốn luồng bị chặn, ứng dụng có thể tránh điều này bằng cách đặt no_slowdown = true trong WriteOptions. Trong tùy chọn này, nếu yêu cầu ghi không được hoàn thành do chậm/treo, Status::Incomplete() sẽ được trả về ngay lập tức.
Trong nội bộ, để tăng hiệu suất,rockdb cố gắng ghi hàng loạt các yêu cầu từ các luồng khác nhau trước khi ghi vào WAL. Tuy nhiên, việc viết yêu cầu với bộ no_slowdown sẽ không thực hiện được điều này, điều này có thể dẫn đến hiệu suất bị phạt nhẹ.
Giảm bớt tình trạng ngừng viết
Có nhiều tùy chọn bạn có thể điều chỉnh để giảm thiểu tình trạng ngừng ghi. Nếu bạn có một số khối lượng công việc có thể chịu đựng được tình trạng ngừng ghi và một số thì không thể, bạn có thể đặt một số yêu cầu ghi thành Ghi có mức độ ưu tiên thấp để ngăn các yêu cầu ghi nhạy cảm với độ trễ bị đình trệ.
Nếu tình trạng ngừng ghi xảy ra do quá trình xóa đang chờ xử lý, bạn có thể thử:
- Tăng max_background_jobs để sử dụng nhiều luồng tuôn ra hơn
- Tăng max_write_buffer_number và giảm kích thước có thể ghi nhớ của tuôn ra (có gì sai ở đây không??)
Nếu tình trạng ngừng ghi xảy ra do có quá nhiều tệp cấp 0 hoặc quá nhiều byte chờ nén thì quá trình nén không thể theo kịp tốc độ ghi. Lưu ý rằng bất kỳ thao tác nào làm giảm khả năng khuếch đại ghi sẽ làm giảm số byte cần ghi để nén, do đó làm cho quá trình nén nhanh hơn. Các tùy chọn để thử:
- Tăng max_background_jobs để sử dụng nhiều luồng nén hơn
- Tăng write_buffer_size để có khả năng ghi nhớ lớn hơn và giảm khuếch đại ghi
- Thay đổi min_write_buffer_number_to_merge
Bạn có thể đặt bộ kích hoạt dừng/chậm và giới hạn số byte được nén thành một số lớn để tránh tình trạng ngừng ghi. Nếu bạn đang nhập dữ liệu vào rocksdb theo đợt, bạn cũng có thể xem phần "Cách nhanh nhất để tải dữ liệu vào RocksDB là gì?" trong Câu hỏi thường gặp.
viết gian hàng quản lý bộ đệm
WriteBufferManager cung cấp tùy chọn allow_stall có thể được chuyển tới hàm tạo của WriteBufferManager. Nếu được đặt thành true, tất cả quá trình ghi sẽ bị dừng khi mức sử dụng bộ nhớ vượt quá buffer_size (giới hạn mềm). Nó sẽ đợi quá trình làm mới hoàn tất và mức sử dụng bộ nhớ giảm xuống. Các ứng dụng có thể tránh điều này bằng cách đặt no_slowdown=true trong cài đặt WriteOptions.
Cuối cùng, bài viết về [Dịch]rockdbwritestall kết thúc tại đây. Nếu bạn muốn biết thêm về [Dịch]rockdbwritestall, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!