2013-06-03 36 views
13

Tôi đã thiết lập hàng đợi trong Laravel cho các kịch bản xử lý của mình. Tôi đang sử dụng beanstalkd và supervisord. Có 6 loại ống khác nhau cho các loại chế biến khác nhau.Hàng đợi Laravel Artisan - sử dụng CPU cao

Vấn đề là đối với mỗi ống, nghệ nhân liên tục sinh sản công nhân mỗi giây. Mã công nhân dường như ngủ trong 1 giây và sau đó chủ đề công nhân sử dụng CPU 7-15%, nhân này bằng 6 ống ... và tôi muốn có nhiều công nhân cho mỗi ống .. cpu của tôi đang được ăn lên.

Tôi đã thử thay đổi giấc ngủ 1 giây thành 10 giây. Điều này sẽ giúp nhưng vẫn có một tăng đột biến CPU lớn mỗi 10 giây khi công nhân thức dậy. Tôi thậm chí không xử lý bất cứ điều gì tại thời điểm này bởi vì hàng đợi là hoàn toàn trống rỗng, nó chỉ đơn giản là các công nhân đang tìm kiếm một cái gì đó để làm.

Tôi cũng đã thử nghiệm để xem việc sử dụng CPU của Laravel khi tôi làm mới trang trong một trình duyệt và đã lơ lửng khoảng 10% .. Tôi đang ở trên một phiên bản rackspace thấp ngay bây giờ để có thể giải thích nó nhưng vẫn .. Nó có vẻ như các công nhân quay lên một cá thể laravel mỗi khi họ thức dậy.

Không có cách nào để giải quyết vấn đề này? Tôi có phải bỏ nhiều tiền vào một máy chủ đắt tiền hơn để có thể nghe xem một công việc đã sẵn sàng chưa?

EDIT:

tìm thấy một giải pháp ... đó là để không sử dụng hàng đợi thợ thủ công: người nghe hoặc đợi: làm việc Tôi nhìn vào mã hàng đợi và có vẻ không phải là một con đường xung quanh vấn đề này , nó đòi hỏi laravel để tải mỗi khi một công nhân kiểm tra nhiều việc phải làm.

Thay vào đó tôi đã viết trình xử lý riêng của mình bằng cách sử dụng pheanstalk. Tôi vẫn đang sử dụng laravel để đẩy mọi thứ vào hàng đợi, sau đó trình xử lý tùy chỉnh của tôi phân tích dữ liệu hàng đợi và sau đó kích hoạt lệnh thủ công để chạy. Bây giờ thời gian sử dụng CPU của tôi cho người nghe của tôi là dưới% 0, thời gian duy nhất cpu của tôi bắn lên bây giờ là khi nó thực sự tìm thấy công việc để làm và sau đó kích hoạt lệnh, tôi tốt với điều đó.

+9

Bạn có muốn chia sẻ mã của mình với người nghe tùy chỉnh không? Tôi đang gặp vấn đề tương tự. – greatwitenorth

+0

Tôi cũng muốn xem người nghe tùy chỉnh của bạn! –

+0

Tôi muốn xem giải pháp của bạn cũng như –

Trả lời

5

Tôi gặp vấn đề tương tự.

Nhưng tôi đã tìm thấy một giải pháp khác. Tôi đã sử dụng công nhân thủ công, nhưng tôi đã sửa đổi thời gian 'xem'. Theo mặc định (từ laravel) lần này được hardcoded bằng không, tôi đã thay đổi giá trị này thành 600 (giây). Xem hồ sơ: 'vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php' và chức năng 'public function pop ($ queue = null)'

Vì vậy, bây giờ làm việc cũng được nghe hàng đợi trong 10 phút. Khi nó không có một công việc, nó thoát, và người giám sát đang khởi động lại nó. Khi nó nhận được một công việc, nó thực thi nó sau khi nó tồn tại, và người giám sát đang khởi động lại nó.

==> Không bỏ phiếu nữa!

ghi chú:

  • nó không làm việc cho iron.io hay đợi người khác.
  • nó có thể không hoạt động khi bạn muốn 1 nhân viên chấp nhận công việc từ hơn 1 hàng đợi.
+1

Giải pháp tôi đã đăng lên lần đăng đầu tiên của mình đã hoạt động rất tốt cho tôi cho đến nay. Tôi đã nghĩ đến việc sửa đổi tệp mà bạn đã nói nhưng tôi không muốn sửa đổi các tệp nhà cung cấp/lõi, đặc biệt là vì tôi không cam kết các thư mục đó, nó là một phần của quá trình xây dựng của tôi để tự động tạo các thư mục đó trên máy chủ trực tiếp. Cảm ơn bạn đã giúp đỡ! – bsparacino

+1

Tôi thấy đây là giải pháp tốt nhất liên quan đến hiệu suất. Cam kết mới trong Laravel bổ sung thêm một tham số sleep, nó có vấn đề một chút vì trong khi quá trình đang ngủ nó sẽ không tìm kiếm bất kỳ công việc mới nào. Ngoài ra tôi nhận thấy rằng nó vẫn còn có một số vấn đề với việc sử dụng CPU. Giải pháp trên đã giảm cpu của tôi xuống còn 1% và nó cũng liên tục kiểm tra các công việc. – greatwitenorth

+1

@greatwitenorth, bạn có thể làm điều gì đó để cải thiện danh tiếng của tôi ở đây trên SO không? cảm ơn. – karelv

2

Theo điều này commit, bây giờ bạn có thể đặt tùy chọn mới thành queue:listen "--sleep={int}", điều này sẽ cho phép bạn tinh chỉnh thời gian chờ trước khi bỏ phiếu cho công việc mới.
Ngoài ra, mặc định đã được đặt thành 3 thay vì 1.

+0

Tài liệu thậm chí không rõ ràng về những gì "giấc ngủ" này thực sự làm. Liệu nó ngủ một lần ngay từ đầu, quảng cáo sau đó bắt đầu bỏ phiếu (nhanh chóng)? Nó được cho là để ngủ cho rằng dài giữa mỗi cuộc thăm dò? Nó chỉ ngủ nếu nó không tìm thấy một tin nhắn khi bỏ phiếu? Trong các thử nghiệm 5.1 của tôi, tôi có thể nói với bạn rằng nó không phải là một trong những điều trên, vì vậy mục đích của nó là gì, thoát khỏi tôi hoàn toàn. – Jason

+0

Bạn đã trả lời câu hỏi của riêng mình: nó nằm giữa mỗi cuộc thăm dò và chỉ khi không có thông báo nào được tìm thấy như đã nói trong http://laravel.com/docs/5.1/queues. Nó rất rõ ràng với tôi :) bạn đã sử dụng đồng bộ như chế độ xếp hàng trong các thử nghiệm của bạn? – younes0

+0

"số giây chờ đợi trước khi bỏ phiếu cho công việc mới" - có thể đó là từ ngữ mơ hồ đối với tôi. Số giây chờ * giữa mỗi lần kiểm tra trong khi bỏ phiếu *, sẽ rõ ràng hơn. "trước khi bỏ phiếu" là thời gian giữa quá trình bắt đầu và bắt đầu vòng lặp bỏ phiếu, và rằng * xuất hiện * là những gì đã được triển khai. Dù sao, tôi đã không thấy tùy chọn ngủ làm việc trên L5.1 - bỏ phiếu chạy hết tốc độ mà không có thời gian ngủ được áp dụng. – Jason

11

Sự cố của CPU cao là do công nhân tải khung hoàn chỉnh mỗi lần kiểm tra công việc trong hàng đợi. Trong laravel 4.2, bạn có thể sử dụng php artisan queue:work --daemon. Điều này sẽ tải khung một lần và việc kiểm tra/xử lý công việc xảy ra bên trong một vòng lặp while, cho phép CPU thở dễ dàng. Bạn có thể tìm thêm thông tin về nhân viên daemon trong tài liệu chính thức: http://laravel.com/docs/queues#daemon-queue-worker.

Tuy nhiên, lợi ích này đi kèm với một nhược điểm - bạn cần được chăm sóc đặc biệt khi triển khai mã và bạn phải chăm sóc các kết nối cơ sở dữ liệu. Thông thường, các kết nối cơ sở dữ liệu chạy dài bị ngắt kết nối.

+1

cảm ơn bạn đã cập nhật. tốt để biết rằng họ cuối cùng đã hỗ trợ này. Tôi đã sử dụng beanstalkd hơn một năm nay và thật tuyệt vời, tôi đã phải chăm sóc các kết nối cơ sở dữ liệu như bạn đã đề cập. – bsparacino

+0

Có, họ chính thức khuyên bạn nên chạy 'DB :: reconnect()' trước khi xử lý mọi công việc, để đảm bảo rằng kết nối có sẵn. Phương thức 'reconnect()' ngắt kết nối kết nối đã được thiết lập và kết nối lại. – MohitMamoria

+0

Vâng, đó là những gì tôi đang làm, hoạt động tuyệt vời – bsparacino

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