Sự cố Production lúc 2 giờ sáng: Khi SSH ngừng phản hồi
Bây giờ là 2:14 sáng. Pager của bạn réo liên hồi với cảnh báo lỗi 504 gateway timeout chưa được xử lý trên primary node PostgreSQL. Bạn mở terminal và gõ ssh [email protected]. Không có phản hồi nào cả. Kết nối bị treo vô thời hạn ngay ở bước bắt tay (handshake) ban đầu.
Trong nỗ lực kiểm tra tình trạng máy chủ, bạn mở console IPMI hoặc VNC out-of-band từ nhà cung cấp cloud. Màn hình đơ hoàn toàn, chỉ hiển thị con trỏ nhấp nháy cùng mức load average vượt ngưỡng 140. Không hề có stack trace nào của kernel panic xuất hiện. Thay vào đó, hiện tượng rò rỉ bộ nhớ nghiêm trọng hoặc nút thắt cổ chai I/O quá lớn đã khiến userspace rơi vào tình trạng tê liệt tuyệt đối.
Con trỏ chuột của bạn bắt đầu di chuyển về phía nút “Hard Reset” màu đỏ trên bảng điều khiển hypervisor. Đừng bấm nút đó! Việc ngắt nguồn đột ngột sẽ lập tức làm mất hàng megabyte dữ liệu chưa kịp ghi trong page cache. Các transaction đang xử lý dở dang của database sẽ rơi vào trạng thái nửa vời (half-committed), và 30 giây restart nóng vội của bạn có thể nhanh chóng biến thành 45 phút chạy lại journal của ext4 hoặc làm hỏng luôn InnoDB tablespace. Kernel Linux cung cấp một lối thoát an toàn hơn rất nhiều: phím Magic SysRq.
Khái niệm cốt lõi: Cách SysRq vượt qua userspace bị tê liệt
Khi Linux bị treo, phần mềm chạy ở userspace hầu như luôn là thủ phạm. Các daemon như sshd, systemd hay shell của bạn bị cạn kiệt CPU slice hoặc kẹt cứng khi chờ đợi disk sleep không thể gián đoạn (trạng thái D).
Tuy nhiên, bản thân kernel Linux thường vẫn hoạt động bình thường. Nó vẫn xử lý các bộ định thời phần hardware (hardware timers) và phản hồi lại các ngắt bàn phím (keyboard interrupt) ở tầng thấp.
Magic SysRq móc nối trực tiếp vào tầng xử lý ngắt này. Khi bạn gửi tín hiệu SysRq, driver bàn phím hoặc serial bus của virtual terminal sẽ chuyển quyền thực thi thẳng cho các hàm xử lý cốt lõi của kernel. Những hàm này chạy ngay lập tức, bất chấp CPU đang quá tải, thiếu thốn page nhớ hay shell đã hoàn toàn mất phản hồi.
SysRq Bitmask: Hiểu rõ các giá trị điều khiển
Vì SysRq có thể dump toàn bộ nội dung bộ nhớ hoặc kill bất kỳ tiến trình nào, các bản phân phối production thường giới hạn tính năng này. Linux quản lý quyền truy cập qua file /proc/sys/kernel/sysrq bằng một bitmask:
- 0: Tắt hoàn toàn SysRq.
- 1: Bật tất cả các chức năng.
- 2: Cho phép điều chỉnh console log-level.
- 4: Cho phép điều khiển bàn phím (SAK và unraw mode).
- 8: Cho phép dump thông tin debug của tiến trình và CPU.
- 16: Cho phép thực thi lệnh sync khẩn cấp.
- 32: Cho phép remount lại các filesystem ở chế độ chỉ đọc (read-only).
- 64: Cho phép gửi tín hiệu đến tiến trình (
SIGTERMvàSIGKILL). - 128: Cho phép reboot và poweroff khẩn cấp.
- 256: Cho phép thay đổi độ ưu tiên (nice) của các tác vụ real-time.
Bạn kết hợp các giá trị này bằng phép cộng bitwise. Ví dụ: đặt giá trị thành 176 (16 + 32 + 128) sẽ cho phép sync các dirty buffer, remount filesystem thành read-only và kích hoạt reboot. Sự kết hợp này mang lại đầy đủ các bước cứu hộ cần thiết khi crash, đồng thời chặn các lệnh dump bộ nhớ tiềm ẩn rủi ro bảo mật.
Quy trình khôi phục: Chuỗi phím REISUB
Để hạ cánh an toàn một hệ thống đang bị treo, hãy ghi nhớ câu thần chú kinh điển: “Raising Elephants Is So Utterly Boring”. Các chữ cái này tương ứng với quy trình shutdown tuần tự do chính kernel trực tiếp xử lý:
- R (unRaw): Chuyển driver bàn phím từ chế độ raw (dùng cho X11 hoặc Wayland) trở về chế độ XLATE, khôi phục khả năng nhập phím cơ bản.
- E (tErminate): Gửi
SIGTERM(tín hiệu 15) đến toàn bộ tiến trình trừ PID 1, cho phép các daemon kịp flush buffer và thoát an toàn. - I (kIll): Gửi đồng loạt
SIGKILL(tín hiệu 9) để tiêu diệt các luồng ngoan cố không chịu dừng theo yêu cầu. - S (Sync): Đẩy toàn bộ dirty cache từ bộ nhớ xuống thẳng NVMe, SSD hoặc HDD.
- U (Unmount): Remount lại mọi phân vùng lưu trữ đang active sang chế độ chỉ đọc (read-only) để ngăn ghi đè ngẫu nhiên và đảm bảo trạng thái journal sạch sẽ.
- B (reBoot): Kích hoạt reset phần cứng tức thì thông qua bo mạch chủ.
Thực hành: Kích hoạt và sử dụng SysRq
Bước 1: Kiểm tra và kích hoạt SysRq
Đầu tiên, hãy kiểm tra quyền SysRq hiện tại trên hệ thống của bạn:
cat /proc/sys/kernel/sysrq
Các image server Debian và Ubuntu thường mặc định là 176 hoặc 438. Nhiều bản AMI cloud đã được làm cứng (hardened) thường hạ giá trị này xuống 0 hoặc 16. Nếu cần toàn quyền điều khiển để xử lý lỗi chuyên sâu, bạn có thể bật toàn bộ tính năng ngay tức thì:
sudo sysctl -w kernel.sysrq=1
Để duy trì cấu hình này qua những lần reboot tiếp theo, hãy lưu vào file cấu hình sysctl riêng biệt:
echo "kernel.sysrq = 1" | sudo tee /etc/sysctl.d/99-sysrq.conf
sudo sysctl --system
Lưu ý các chính sách bảo mật: nếu máy chủ của bạn xử lý các workload multi-tenant hoặc dữ liệu tuân thủ quy chuẩn nghiêm ngặt, hãy dùng 176 hoặc 244 thay vì 1 để hạn chế các lệnh dump bộ nhớ.
Bước 2: Khôi phục khẩn cấp qua bàn phím hoặc out-of-band console
Nếu bạn đang cắm bàn phím vật lý trực tiếp, đang ở trong phiên AWS serial console hoặc IPMI KVM, hãy gửi chuỗi phím này. Nhấn giữ tổ hợp Alt và SysRq (thường dùng chung phím vật lý với Print Screen), sau đó nhấn lần lượt từng phím chữ. Hãy tạm dừng giữa các phím để hệ thống hoàn tất từng tác vụ:
Alt + SysRq + R (Chờ 2 giây - Bàn phím chuyển sang chế độ XLATE)
Alt + SysRq + E (Chờ 10 giây - Cho MySQL, Nginx hoặc Redis thời gian flush dữ liệu và thoát)
Alt + SysRq + I (Chờ 5 giây - Buộc dừng các tác vụ treo ở trạng thái D và tiến trình mồ côi)
Alt + SysRq + S (Chờ 10 giây - Đợi thông báo "Emergency Sync complete" trên console)
Alt + SysRq + U (Chờ 5 giây - Đợi xác nhận "Emergency Remount R/O")
Alt + SysRq + B (Hệ thống reboot ngay lập tức)
Quan sát kỹ log console trong quá trình này. Khi bạn bấm S, chỉ số disk I/O sẽ tăng vọt do hệ thống đang xả hết các dirty page chưa ghi. Đừng vội vàng nhảy từ S sang B ngay lập tức, điều đó sẽ làm hỏng toàn bộ quy trình; hãy cho controller ổ cứng đủ thời gian để dọn sạch hàng đợi ghi.
Bước 3: Kích hoạt SysRq qua command line và script tự động
Đôi khi máy chủ chưa chết hẳn mà chỉ phản hồi vô cùng chậm chạp. Một cron job chạy quá tải có thể đẩy load lên hơn 80, khiến mỗi ký tự gõ qua SSH mất tới hai giây mới hiện lên. Nếu vẫn còn giữ được phiên root prompt, bạn có thể truyền thẳng các lệnh kích hoạt vào virtual endpoint của kernel tại /proc/sysrq-trigger.
Chạy script sau để tự động hóa quá trình reboot an toàn:
#!/usr/bin/env bash
# Khởi động lại an toàn server đang quá tải qua sysrq-trigger
set -euo pipefail
echo "Gửi tín hiệu SIGTERM đến các tiến trình..."
echo e > /proc/sysrq-trigger
sleep 10
echo "Buộc dừng các tiến trình còn sót lại..."
echo i > /proc/sysrq-trigger
sleep 3
echo "Đẩy bộ đệm filesystem xuống ổ cứng..."
echo s > /proc/sysrq-trigger
sleep 10
echo "Mount lại các filesystem ở chế độ chỉ đọc (read-only)..."
echo u > /proc/sysrq-trigger
sleep 5
echo "Kích hoạt kernel reboot..."
echo b > /proc/sysrq-trigger
Bước 4: Thu thập dữ liệu chẩn đoán trước khi reboot
Reboot sẽ giải quyết sự cố downtime tức thời, nhưng nó cũng xóa sạch các dấu vết quý giá. Nếu máy chủ vẫn còn nhận diện được từng lệnh SysRq đơn lẻ, hãy nhanh chóng trích xuất dữ liệu chẩn đoán trước khi hạ nó xuống:
# Xuất thông tin cấp phát RAM, slab data và swap stats hiện tại
echo m > /proc/sysrq-trigger
# Xuất danh sách runnable task, backtrace và blocked lock
echo t > /proc/sysrq-trigger
# Xuất danh sách tất cả CPU lock đang giữ (yêu cầu hỗ trợ lockdep)
echo d > /proc/sysrq-trigger
Các lệnh này sẽ ghi trực tiếp vào kernel ring buffer. Sau khi máy chủ online trở lại, bạn có thể kiểm tra nhật ký lưu trữ bằng lệnh journalctl -k -b -1 hoặc xem lại log từ out-of-band serial để tìm ra nguyên nhân gốc rễ.
Khôi phục an toàn luôn tốt hơn Hard Reset
Cold-reboot một server bị treo tạo cảm giác nhanh gọn, nhưng công đoạn khắc phục hậu quả sau sự cố mất điện đột ngột có thể ngốn hàng giờ xử lý. Việc cấu hình SysRq bitmask hợp lý sẽ mang đến cho bạn một kênh cứu hộ out-of-band đắc lực, hoạt động ngay cả khi phần còn lại của hệ điều hành đã bất lực. Hãy ghi nhớ quy tắc REISUB, thiết lập giá trị sysctl chuẩn hóa trên toàn hệ thống, và biến những pha cứu hộ nửa đêm trở nên bình tĩnh, chuẩn xác và an toàn tuyệt đối.

