2015-05-16 20 views
6

Tôi có thiết lập sản xuất để chạy công nhân cần tây để thực hiện yêu cầu POST/GET đối với dịch vụ từ xa và lưu trữ kết quả, xử lý tải khoảng 20k tác vụ mỗi 15 phút.Nhân viên cần cẩu treo mà không có bất kỳ lỗi nào

Vấn đề là người lao động bị tê liệt không có lý do, không có lỗi, không cảnh báo.

Tôi cũng đã thử thêm đa xử lý, cùng một kết quả.

Trong log Tôi thấy sự gia tăng trong thời điểm thực hiện nhiệm vụ, giống như thành công trong việc s

Để biết thêm chi tiết nhìn vào https://github.com/celery/celery/issues/2621

+0

là "Lưu trữ các phản ứng trong MongoDB" một phần không đồng bộ? Có nhật ký cho điều đó? –

Trả lời

11

Nếu người lao động cần tây bạn gặp khó khăn đôi khi, bạn có thể sử dụng strace & lsof để tìm hiểu mà hệ thống gọi nó bị kẹt.

Ví dụ:

$ strace -p 10268 -s 10000 
Process 10268 attached - interrupt to quit 
recvfrom(5, 

10268 là pid của người lao động cần tây, recvfrom(5 có nghĩa người lao động dừng lại ở nhận dữ liệu từ bộ mô tả tập tin.

Sau đó, bạn có thể sử dụng lsof để kiểm tra xem 5 trong quy trình công nhân này là gì.

lsof -p 10268 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF  NODE NAME 
...... 
celery 10268 root 5u IPv4 828871825  0t0  TCP 172.16.201.40:36162->10.13.244.205:wap-wsp (ESTABLISHED) 
...... 

Nó chỉ ra rằng người lao động gặp khó khăn tại một kết nối tcp (bạn có thể nhìn thấy 5u trong FD cột).

Một số gói python như requests đang chặn để chờ dữ liệu ngang hàng, điều này có thể khiến nhân viên cần tây bị treo, nếu bạn đang sử dụng requests, hãy đảm bảo đặt đối số timeout.


Bạn đã thấy trang này:

https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/

Các vấn đề liên quan