Vấn đề là điển hình của một phiên bản MySQL nơi bạn có tỷ lệ thay đổi cao đối với cơ sở dữ liệu. Bằng cách chạy quá trình nhập 5GB của mình, bạn đang tạo ra các trang bẩn một cách nhanh chóng. Khi các trang bẩn được tạo, chuỗi trình dọn dẹp trang chịu trách nhiệm sao chép các trang bẩn từ bộ nhớ sang đĩa.
Trong trường hợp của bạn, tôi cho rằng bạn không nhập 5GB mọi lúc. Vì vậy, đây là tốc độ tải dữ liệu đặc biệt cao và nó chỉ là tạm thời. Bạn có thể bỏ qua các cảnh báo vì InnoDB sẽ dần bắt kịp.
Dưới đây là giải thích chi tiết về các yếu tố bên trong dẫn đến cảnh báo này.
Mỗi giây một lần, trình dọn dẹp trang sẽ quét vùng đệm để tìm các trang bẩn để xả từ vùng đệm sang đĩa. Cảnh báo bạn đã thấy cho thấy rằng nó có rất nhiều trang bẩn cần xả và mất hơn 4 giây để xả một loạt trang đó vào đĩa, khi nó sẽ hoàn thành công việc đó trong vòng chưa đầy 1 giây. Nói cách khác, nó cắn xé nhiều hơn những gì nó có thể nhai.
Bạn đã điều chỉnh điều này bằng cách giảm innodb_lru_scan_depth
từ 1024 xuống 256. Điều này làm giảm khoảng cách vào vùng đệm mà luồng dọn dẹp trang tìm kiếm các trang bẩn trong chu kỳ một lần mỗi giây của nó. Bạn đang yêu cầu nó ăn những miếng nhỏ hơn.
Lưu ý rằng nếu bạn có nhiều cá thể vùng đệm, nó sẽ khiến quá trình xả nước thực hiện nhiều công việc hơn. Nó cắn đứt innodb_lru_scan_depth
số lượng công việc cho mỗi phiên bản vùng đệm. Vì vậy, bạn có thể đã vô tình gây ra tắc nghẽn này bằng cách tăng số lượng vùng đệm mà không giảm độ sâu quét.
Tài liệu cho innodb_lru_scan_depth
cho biết "Cài đặt nhỏ hơn mặc định thường phù hợp với hầu hết các khối lượng công việc." Có vẻ như họ đã đặt cho tùy chọn này một giá trị quá cao theo mặc định.
Bạn có thể đặt giới hạn cho IOPS được sử dụng bằng cách xả nền, với innodb_io_capacity
và innodb_io_capacity_max
tùy chọn. Tùy chọn đầu tiên là giới hạn mềm về thông lượng I / O mà InnoDB sẽ yêu cầu. Nhưng giới hạn này là linh hoạt; nếu tốc độ xả trang giảm thấp hơn tốc độ tạo trang bẩn mới, InnoDB sẽ tự động tăng tốc độ xả vượt quá giới hạn này. Tùy chọn thứ hai xác định giới hạn chặt chẽ hơn về mức độ InnoDB có thể tăng tốc độ xả.
Nếu tốc độ xả nước có thể theo kịp tốc độ tạo trang bẩn mới trung bình, thì bạn sẽ không sao. Nhưng nếu bạn liên tục tạo các trang bẩn nhanh hơn mức có thể được rửa sạch, thì cuối cùng vùng đệm của bạn sẽ đầy các trang bẩn, cho đến khi các trang bẩn vượt quá innodb_max_dirty_page_pct
của vùng đệm. Tại thời điểm này, tốc độ xả sẽ tự động tăng và một lần nữa có thể khiến page_cleaner gửi cảnh báo.
Một giải pháp khác là đặt MySQL trên một máy chủ có đĩa nhanh hơn. Bạn cần một hệ thống I / O có thể xử lý thông lượng mà trang của bạn yêu cầu.
Nếu bạn luôn thấy cảnh báo này dưới lưu lượng truy cập trung bình, có thể bạn đang cố gắng thực hiện quá nhiều truy vấn ghi trên máy chủ MySQL này. Có thể đã đến lúc mở rộng quy mô và chia nhỏ các lần ghi trên nhiều phiên bản MySQL, mỗi phiên bản có hệ thống đĩa riêng của chúng.
Đọc thêm về trình dọn dẹp trang:
- Giới thiệu chuỗi page_cleaner trong InnoDB (bản lưu trữ)
- MySQL-5.7 cải thiện khối lượng công việc theo định hướng DML