2012-12-13 41 views
11

Tôi có một tập lệnh chạy 1000 yêu cầu cURL sử dụng các hàm curl_multi_ * trong PHP.Số lượng kết nối cURL tối đa được đặt bởi là bao nhiêu?

Nút cổ chai đằng sau chúng hết thời gian là gì?

Nó có phải là mức sử dụng CPU không? Có cách nào hiệu quả hơn không, về số lượng các kết nối gửi đi được xử lý bởi máy chủ, để thực hiện điều này như thế nào?

Tôi không thể thay đổi chức năng và bản thân yêu cầu là các cuộc gọi đơn giản tới API từ xa. Tôi chỉ tự hỏi giới hạn là gì - liệu tôi có cần tăng bộ nhớ trên máy chủ, hoặc các kết nối Apache hoặc CPU? (Hoặc cái gì khác mà tôi đã bỏ lỡ)

+0

Mở giới hạn tệp trên hộp linux đến khi nhìn trộm Tôi nghĩ (chạy 'ulimit -a' là người dùng bạn đang sử dụng, đó là trợ cấp của bạn). Bên cạnh đó, nút cổ chai có thể trở thành mạng. Tôi nghi ngờ CPU sẽ cung cấp cho một damn ... – Wrikken

+0

Làm thế nào để bạn kiểm soát giới hạn tập tin mở? (Tôi không biết nhiều về điều này!) –

+1

[stackoverflow cung cấp] (http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in -linux) – Wrikken

Trả lời

10

Yêu cầu của bạn được thực hiện trong một chuỗi thực hiện duy nhất. Các nút cổ chai là gần như chắc chắn CPU, có bao giờ bạn thực sự xem curl đa mã chạy? ... nó cực kỳ cpu đói; bởi vì bạn không thực sự có đủ quyền kiểm soát đối phó với các yêu cầu. curl_multi giúp bạn có thể dàn xếp 1000 yêu cầu cùng một lúc, nhưng điều này không làm cho nó trở thành một ý tưởng hay. Bạn hầu như không có cơ hội sử dụng curl_multi một cách hiệu quả bởi vì bạn không thể kiểm soát luồng thực thi đủ mịn, chỉ cần phục vụ các socket và select() 'ing vào chúng sẽ chiếm rất nhiều việc sử dụng CPU cao mà bạn sẽ thấy dòng lệnh.

Lý do mức sử dụng CPU cao trong các tác vụ như vậy; PHP được thiết kế để chạy trong một phần nhỏ của một giây, làm mọi thứ nhanh nhất có thể. Nó thường không quan trọng như thế nào CPU được sử dụng, bởi vì nó cho một khoảng thời gian ngắn như vậy. Khi bạn kéo dài một nhiệm vụ như thế này, vấn đề trở nên rõ ràng hơn, chi phí phát sinh với mọi opcode sẽ hiển thị cho lập trình viên.

Tôi biết bạn đã nói rằng bạn không thể thay đổi việc triển khai, nhưng vẫn còn, để có câu trả lời hoàn chỉnh. một nhiệm vụ như vậy là xa phù hợp hơn cho Threading hơn đa curl, và bạn nên bắt đầu đọc http://php.net/pthreads, bắt đầu với http://php.net/Thread

Từ trái sang thiết bị của riêng họ trên một CPU nhàn rỗi thậm chí 1000 bài sẽ tiêu thụ càng nhiều CPU như curl_multi, điểm mấu chốt là bạn có thể kiểm soát chính xác mã có trách nhiệm tải xuống từng byte của phản hồi và tải lên từng byte của yêu cầu và nếu sử dụng CPU là một mối lo ngại, bạn có thể thực hiện quy trình "đẹp" bằng cách gọi một cách rõ ràng hoặc hạn chế sử dụng kết nối theo cách có ý nghĩa Ngoài ra, các yêu cầu của bạn có thể được phục vụ trong các chủ đề riêng biệt.

Tôi không đề xuất rằng 1000 chủ đề là việc cần làm, nó nhiều khả năng không phải là. Điều cần làm sẽ là thiết kế Stackable (xem tài liệu) có công việc là tạo và phục vụ một yêu cầu theo cách "đẹp", hiệu quả và thiết kế (xem ví dụ về nguồn mở rộng github/pecl) của người lao động để thực thi các yêu cầu mới được thiết kế ...

+0

Đây là một vấn đề PHP không phải là một curl một. LibCurl có thể mở rộng tới 10000 yêu cầu song song. Đó là cường độ tiếp theo gây ra vấn đề. – Lothar

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