Cài đặt trang_cleaner của MySQL InnoDB có thể không tối ưu


15

Xem ghi chú này trong mysqld.log:

[Note] InnoDB: page_cleaner: 1000ms intended loop took 15888ms. The settings might not be optimal. (flushed=200 and evicted=0, during the time.)

Dường như có đề cập đến một cái gì đó như thế này ở đây: ví dụ MySQL bị đình trệ "làm chỉ số SYNC"

Câu hỏi của tôi là: hành động nào nên được thực hiện, nếu có, khi ghi chú này được nhìn thấy trong nhật ký?

Các phiên bản MySQL và OS:
mysql-Community-server- 5.7.9 -1.el7.x86_64
centos-release-7-1.1503.el7.centos.2.8.x86_64

Chạy SHOW VARIABLES THÍCH 'innodb%'; như đề xuất cho thấy:

innodb_page_cleaners | 1

Câu trả lời:


10

Giá trị mặc định innodb_page_cleaners đã được thay đổi từ 1 thành 4 trong MySQL 5.7.8. Nếu số lượng chủ đề của trình dọn dẹp trang vượt quá số lượng phiên bản nhóm bộ đệm, innodb_page_cleaners sẽ tự động được đặt thành cùng giá trị với innodb_buffer_pool_instances

Kiểm tra innodb_buffer_pool_instances với:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_instances'

Bạn chỉ có thể đặt innodb_page_cleanerscao như innodb_buffer_pool_instances. Nếu bạn muốn innodb_page_cleaners=4thì bạn cũng cần innodb_buffer_pool_instances=4.


2
tôi cũng có cả innodb_buffer_pool_instances và innodb_page_cleaners được đặt thành 8 và thỉnh thoảng tôi thấy cảnh báo. Nó chỉ là một loạt các đĩa quay lớp máy tính để bàn sọc trong các hoạt động nặng như bảng tối ưu hóa và tương tự, tôi đoán đó là cách tinh tế để nói với bạn rằng đĩa của bạn quá chậm;)
Aleksandar Ivanisevic

5

Chúng tôi đã gặp vấn đề tương tự trên nhiều khách hàng khác nhau và phát hiện ra rằng sự cố là do đặt giá trị của innodb_lru_scan_depth từ mặc định 1024 xuống thấp đến 128. Mặc dù việc giảm giá trị làm giảm thời gian xử lý giao dịch, đặc biệt là trong khối lượng công việc bị ràng buộc ghi Tôi tin rằng việc đặt giá trị quá thấp sẽ khiến vùng đệm không thể theo kịp trong việc xóa một số bộ đệm và vùng đệm của trang bị bẩn.

Trong trường hợp của chúng tôi, chúng tôi đã thấy một sự cải thiện mạnh mẽ bằng cách tăng giá trị từ 128 lên 256 nhưng nhìn chung giá trị phù hợp phụ thuộc vào phần cứng và loại tải. Mẹo nhỏ là tìm giá trị phù hợp giữa việc tăng hiệu suất OLTP và để MySQL giữ sạch vùng đệm để không để page_cleaner cần thực hiện nhiều công việc, như đã nêu trong thông báo trên ( "InnoDB: page_cleaner: vòng lặp dự định 1000ms mất 15888ms " ).

Giá trị có thể được thay đổi linh hoạt mà không cần khởi động lại MySQL, ví dụ:

SET GLOBAL innodb_lru_scan_depth=256;

1
Nếu tôi khởi động lại MySQL innodb_lru_scan_depth trở lại 1024, vậy làm thế nào để thay đổi vĩnh viễn?
Karim Samir

@KarimSamir Thêm innodb_lru_scan_depth = 256một nơi nào đó trong my.cnfđường dẫn tải của bạn .
Quentin Skousen

0

StackOverflow này có thể hữu ích ...

/programming/41134785/how-to-solve-mysql-warning-innodb-page-cleaner-1000ms-intends-loop-took-xxx

Điều này về cơ bản có nghĩa là, DB của bạn nhận được quá nhiều ghi khiến BufferPool chứa đầy các giá trị bẩn. Điều này kích hoạt PageCleaner hành động và xóa các trang bẩn. Vì có quá nhiều trang bẩn hơn bình thường, phải mất nhiều thời gian hơn cho PageCleaner xóa bộ đệm.

innodb_lru_scan_depthbiến cụ thể kiểm soát mức độ quét vùng đệm nên được thực hiện để xóa. Đây có thể là một giá trị lớn hoặc thông lượng ghi của hệ thống thực sự cao gây ra số lượng lớn các trang bẩn.

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.