Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách giải quyết cảnh báo mysql:InnoDB:page_cleaner:Vòng lặp dự định 1000ms mất XXX ms. Cài đặt có thể không tối ưu?

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_capacityinnodb_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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AWS MySQL RDS so với AWS DynamoDB

  2. Chuỗi tới joda LocalDate ở định dạng dd-MMM-yy

  3. Cách chọn bản ghi 3 phút cuối từ MySQL với PHP

  4. Làm cách nào để tôi có thể dễ dàng chuyển đổi ứng dụng Django từ mySQL sang PostgreSQL?

  5. ROW_NUMBER trong SQL - Chọn ví dụ hàng đầu trong SQL và SQL Server