Chúng tôi đang chạy một ngăn xếp LAMP bao gồm MariaDB 10.5.15 trên Centos 7. Đó là một máy chủ chuyên dụng với 4 CPU và 8GB RAM.
Chưa bao giờ gặp sự cố cho đến vài tuần trước, khi tôi nhận thấy các truy vấn chậm mất 8-9 giây trong nhật ký truy vấn chậm.
Các truy vấn này đối với nhiều cơ sở dữ liệu INNODB, nhưng luôn là các bảng lớn (tức là hơn 10.000 hàng). Chúng luôn xảy ra trong khoảng thời gian từ 6 giờ sáng đến 8 giờ sáng.
Các bảng được đề cập có các chỉ mục và thông thường các truy vấn tương tự thực hiện trong chưa đầy một giây.
Tôi thấy rằng bằng cách đăng nhập vào máy chủ lúc 8 giờ sáng Chủ nhật và truy vấn các bảng lớn này bằng các câu lệnh chọn đơn giản, chúng sẽ mất 8-9 giây để thực thi. Sau đó, trong phần còn lại của ngày, thậm chí sau nửa đêm, mọi truy vấn đối với bảng đó sẽ nhanh chóng.
6h – 8h cũng là lúc mọi thứ “hồi sinh” trở lại sau khoảng thời gian bất động vào đầu giờ.
Có vẻ như có một số loại bộ đệm đang bị nguội và cần được làm nóng, nhưng tôi không chắc tại sao điều này đột nhiên bắt đầu xảy ra sau nhiều năm sử dụng miễn phí gặp sự cố. Tôi biết rằng không có tiến trình lớn nào chạy trên máy chủ qua đêm và máy chủ không tải khi điều này xảy ra.
Chúng tôi theo dõi tải CPU 24/7 và kiểm tra định kỳ số lượng kết nối tới Apache và MariaDB, những kết nối này vẫn ở mức thấp vừa phải trong suốt cả ngày. Thông thường, có khoảng 3GB bộ nhớ trống không bao gồm bộ đệm và bộ đệm.
Chỉnh sửa
Xấu hổ thay, tôi phát hiện ra rằng các truy vấn chậm được đề cập thực sự không sử dụng chỉ mục và đang thực hiện quét toàn bộ bảng. Một truy vấn ban đầu có thể mất vài giây, sau đó trong thời gian còn lại của ngày, thậm chí việc quét toàn bộ bảng chỉ mất chưa đến một giây. Tôi cho rằng đây là một loại bộ đệm đĩa sẽ bị nguội qua đêm.
Mặc dù việc quét toàn bộ bảng có vấn đề về hiệu suất có vẻ không phải là bất thường, nhưng vẫn có vẻ kỳ lạ là điều này đột nhiên trở thành một vấn đề bất ngờ.