Thỉnh thoảng, máy chủ Linux LAMP của chúng tôi (sử dụng PHP-FPM, XFS trên LVM mỏng trên HW RAID, Centos8) không thể truy cập được và ngừng phản hồi các yêu cầu HTTP(S).
Thông qua ghi nhật ký tập trung, chúng tôi phát hiện ra rằng trong những trường hợp đó, trung bình tải nhanh chóng tăng lên hàng trăm, trong khi ngày càng nhiều quy trình (systemd-journald, quy trình php, luồng xfs/dm nhân...) rơi vào trạng thái D. Theo iostat và pidstat, CPU và đĩa hoàn toàn không được tải nhiều trong khi tải trung bình dao động quanh mức 170, điều này khá lạ. Từ đầu ra htop/ps, không có một hoặc nhóm quy trình giả mạo nào có thể giải thích hành vi này. Đó chỉ là các quy trình tiêu chuẩn dường như gặp phải một loại "ngăn đường" nào đó.
Điều kỳ lạ duy nhất khác với giám sát đĩa là trong các sự kiện quá tải đó, iostat liên tục báo cáo w_await cho phân vùng /var (2500-5000ms, trong khi các phân vùng khác như /var/log, /var/lib/mysql hầu như không vượt qua 10ms). Phân vùng này hầu như luôn ở chế độ im lặng, vì vậy không rõ tại sao iostat lại báo cáo số lần w_await lớn như vậy ở đó.
Giải pháp duy nhất sau đó là cấp nguồn cho máy chủ.
Điều này xảy ra trên hai máy chủ cùng loại, không xảy ra trên các máy chủ khác. Nó dường như là một số loại trục trặc của FS/lớp khối/bộ điều khiển/đĩa; nhiều quá trình đột nhiên bắt đầu chờ đĩa hoặc thứ gì đó khác trong kernel, nhưng theo iotop/iostat, đĩa không hoạt động nhiều.
Có cách nào để truy vấn trình điều khiển FS/lớp khối/bộ điều khiển nhân Linux chính xác họ đang làm gì với bộ lưu trữ và thay mặt cho quy trình nào không? Các công cụ tiêu chuẩn như iotop/iostat chỉ cho tôi biết tên của các quy trình đang hoạt động I/O và hoạt động của phân vùng ổ đĩa, nhưng không cho biết quy trình nào truy cập vào phân vùng ổ đĩa nào và chính xác chúng đang làm gì ở đó.