2013-07-08 21 views
12

Tôi có sau thiết lập:Làm thế nào để theo dõi sức khỏe hàng đợi trong cần tây

  • Generic hồ bơi công nhân với 100 công nhân
  • ưu tiên cao Bể lao động với 50 công nhân
  • Tôi đã từng như vậy với số lượng lớn vì hầu hết thời gian nhiệm vụ của tôi dành cho I/O chờ thời gian chờ rất dài (thực hiện các yêu cầu HTTP có thể mất đến 20 giây để trả lời)
  • Sử dụng RabbitMQ làm nhà môi giới
  • Tôi đã thiết lập celeryd làm deamon bằng cách sử dụng init .d scripts từ celery'd github, với các thông số sau: CELERYD_OPTS="--time-limit=600 -c:low_p 100 -c:high_p 50 -Q:low_p low_priority_queue_name -Q:high_p high_priority_queue_name"

Vấn đề của tôi là, đôi khi hàng đợi dường như "sao lưu" ... đó là nó sẽ ngừng nhiệm vụ tiêu thụ. Có vẻ như có các kịch bản cho việc này:

  • Có một chậm build-up thông điệp "không được thừa nhận" trong môi giới, mặc dù celery inspect active sẽ cho thấy rằng không phải tất cả người lao động được sử dụng hết - nghĩa là, tôi sẽ chỉ xem một số tác vụ đang hoạt động
  • Hàng đợi sẽ ngừng tiêu thụ các tác vụ mới mà không cần tích lũy.
  • Khi nó trạng thái "chết", sử dụng strace trên nhân xử lý lợi nhuận không có gì ... hoàn toàn không hoạt động từ người lao động

tôi sẽ đánh giá cao bất kỳ thông tin hoặc gợi ý về:

  • thế nào Tôi có thể gỡ lỗi nó. Tôi có thể sử dụng strace để xem quy trình công nhân đang làm gì, nhưng cho đến nay đã hữu ích khi nói với tôi rằng nhân viên đang treo
  • Cách tôi có thể giám sát việc này và có thể tự động khôi phục. Có rất nhiều công cụ để quản lý cần tây (flowerevents nhưng chúng đều tuyệt vời trong thời gian thực - nhưng không có bất kỳ chức năng giám sát/báo động tự động nào). Tôi có tốt hơn khi viết các công cụ theo dõi của riêng mình với supervisord không?

Ngoài ra, tôi đang bắt đầu nhiệm vụ của tôi từ django-cần tây

+0

Cuối cùng bạn đã giải quyết được vấn đề này chưa? – bouke

+0

Đây là cũ, nhưng hai nguyên nhân của hàng đợi sao lưu mà tôi biết là: (1) bạn đang tạo các tác vụ trong các tác vụ. Nếu bạn làm điều đó, cuối cùng bạn sẽ nhận được điểm mà bạn không có một nhân viên để tiêu thụ nhiệm vụ trong một nhiệm vụ, và bạn sẽ đóng băng. (2) Nếu bạn đang sử dụng các yêu cầu, để thực hiện nhiều lượt tải xuống hoặc bất kỳ nội dung tải xuống nào, nó không có thời gian chờ mặc định, vì vậy nó có thể đóng băng hoàn toàn nếu bạn gặp lỗi tải xuống. Một khi một công nhân bị đóng băng, nó đã xong. – mlissner

Trả lời

3

@ Goro, nếu bạn đang làm cho các yêu cầu với các dịch vụ nước ngoài, bạn nên cố gắng thực hiện gevent or eventlet hồ bơi thay vì đẻ trứng 100.500 công nhân. Tôi cũng gặp vấn đề, khi công nhân cần tây ngừng việc tiêu thụ, nó gây ra bởi một lỗi với sự kết hợp celery+gevent+sentry(raven). Một điều tôi tìm hiểu về Celery, là nó có thể hoạt động tốt mà không cần theo dõi nếu tất cả được thực hiện đúng (hiện tại tôi đang làm> 50 triệu nhiệm vụ mỗi ngày), nhưng nếu không, giám sát sẽ không giúp bạn rất nhiều. "Phục hồi thiên tai" ở Celery hơi phức tạp, không phải tất cả mọi thứ sẽ hoạt động như bạn mong đợi: (

Bạn nên tách riêng các giải pháp trên các hạt nhỏ hơn, có thể tách riêng một số nhiệm vụ giữa các hàng đợi khác nhau. tìm thấy đoạn mã gây ra sự cố

+1

Bạn có liên kết đến một báo cáo lỗi hoặc một số thông tin khác về lỗi "này với sự kết hợp cần tây + gevent + sentry (quạ)" không? –

+0

Tôi cũng quan tâm đến việc nghe thêm về điều này cần tây + gevent + sentry (quạ) lỗi – JiminyCricket

+0

@hheimbuerger Chỉ cần thêm nó như là một chỉnh sửa! – JiminyCricket

3

Tôi nghĩ điều này là do công việc tìm nạp trước công việc.Nếu đây vẫn là vấn đề bạn có thể cập nhật cần tây lên 3.1 và sử dụng tùy chọn công nhân -Ofair.Tùy chọn cấu hình mà tôi đã thử sử dụng trước -OfairCELERYD_PREFETCH_MULTIPLIER. Tuy nhiên, thiết lập CELERYD_PREFETCH_MULTIPLIER = 1 (giá trị thấp nhất của nó) không giúp được gì vì công nhân vẫn sẽ tìm nạp trước một tác vụ trước.

Xem http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#prefork-pool-improvements và đặc biệt là http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#caveats.

4

Trình theo dõi hàng đợi rất cơ bản có thể được triển khai chỉ với một tập lệnh duy nhất chạy mỗi phút bằng cron. Đầu tiên, nó tắt đám cháy một nhiệm vụ đó, khi thực hiện (trong một công nhân), chạm vào một tập tin được xác định trước, ví dụ:

with open('/var/run/celery-heartbeat', 'w'): 
    pass 

Sau đó kịch bản kiểm tra dấu thời gian thay đổi trong hồ sơ đó và nếu đó là hơn một phút (hoặc 2 phút, hoặc bất cứ điều gì) đi, gửi một báo động và/hoặc khởi động lại công nhân và/hoặc các nhà môi giới.

Sẽ phức tạp hơn một chút nếu bạn có nhiều máy nhưng ý tưởng tương tự cũng được áp dụng.