Đêm qua, pipeline render của chúng tôi gặp hiện tượng kỳ lạ: ComfyUI vẫn phản hồi HTTP bình thường, hàng đợi công việc vẫn chạy, nhưng GPU không tiêu thụ bất kỳ phần trăm nào. Toàn bộ công việc render bị treo mà không có lỗi rõ ràng để xem. Ghi chú này là câu chuyện về hiện tượng "wedge" và thang phục hồi tự động mà chúng tôi đã thêm vào pipeline.

Hiện tượng wedge gặp phải

Có 3 dấu hiệu xuất hiện đồng thời:

  1. Tiến trình server vẫn sống, phản hồi được mọi yêu cầu HTTP ở tất cả endpoint
  2. Hàng đợi công việc "dường như" đang chạy nhưng không có render nào chảy ra
  3. Giá trị sử dụng GPU (gpu_util) liên tục ở mức 0 trong hơn 60 giây, mặc dù hàng đợi có công việc đang chờ

Hiện tượng này nguy hiểm hơn việc tắt hoàn toàn vì hệ thống giám sát (monitor) chỉ kiểm tra "có phản hồi không" sẽ cho rằng mọi thứ bình thường, trong khi sản xuất đã dừng.

Phương pháp phát hiện: Đừng chỉ tin vào HTTP

Bài học quan trọng là health check phải đo "công việc có chảy không" chứ không chỉ "server có phản hồi không". Vì vậy chúng tôi thêm giám sát giá trị gpu_util — nếu hàng đợi có công việc nhưng gpu_util liên tục ở mức 0 trong hơn 60 giây, hệ thống coi đó là wedge và bắt đầu quy trình phục hồi ngay lập tức.

Thang COMFY_HEAL

Khi phát hiện wedge, hệ thống sẽ leo thang phục hồi từng bước, có giới hạn thời gian 180 giây mỗi vòng, không để restart lặp vô tận:

Bước Hành động Điều kiện
1 Restart chỉ tiến trình bị wedge (chỉ định bằng PID, không phải tên) Phát hiện wedge trên GPU chính
2 Chuyển sang GPU dự phòng trên cùng máy Restart rồi vẫn không hoạt động trở lại
3 Hủy toàn bộ công việc an toàn, thông báo cho team Hai bước đầu không thành công

Điểm cần thận trọng nhất là việc restart — phải chỉ đóng tiến trình của riêng chúng tôi, xác định bằng PID, không bao giờ đóng bằng tên chương trình vì trên cùng máy có nhiều service có tên tương tự.

Kết quả kiểm tra

Kết quả selftest của thang COMFY_HEAL
Kết quả selftest: Phát hiện wedge từ gpu_util, restart chỉ PID, giá trị sử dụng GPU trở lại 96%
  • Selftest offline vượt qua đầy đủ 6/6 trường hợp (phát hiện, restart, kiểm tra lại, chuyển dự phòng, giới hạn thời gian, hủy an toàn)
  • Cơ chế restart đã được chứng minh với sự cố thực tế trong quá trình sản xuất clip — công việc bị treo được render lại và phát sóng bình thường
  • Sau khi phục hồi, gpu_util trở lại mức 96% trong vòng hai phút
Màn hình ComfyUI sau khi phục hồi từ wedge
Màn hình ComfyUI mà hệ thống đã phục hồi — hàng đợi tiếp tục chạy, graph không mất, không cần bắt đầu lại toàn bộ công việc

Kế hoạch tiếp theo

Bước tiếp theo là áp dụng loại health check "đo công việc chảy" này cho các service khác trong toàn bộ fleet, bao gồm ghi lại thống kê wedge hàng tuần để xem hiện tượng này có liên quan đặc biệt đến loại công việc nào không — hãy theo dõi trong Lab Notes số tới.