2010-04-06 25 views
22

TornadowebNginx là các máy chủ web phổ biến cho thời điểm này và nhiều điểm chuẩn cho thấy rằng chúng có hiệu suất tốt hơn Apache trong một số trường hợp nhất định. Vì vậy, câu hỏi của tôi là:Là 'epoll' lý do quan trọng mà Tornadoweb (hoặc Nginx) là quá nhanh?

Lý do quan trọng nhất khiến chúng hoạt động nhanh như vậy? Và tôi có thể học được gì từ đó nếu tôi muốn viết một máy chủ socket tốt?

Trả lời

64

Nếu bạn đang tìm kiếm để viết một máy chủ socket, một điểm khởi đầu tốt là bài viết C10k Dan Kegel từ một vài năm trở lại:

http://www.kegel.com/c10k.html

Tôi cũng thấy Guide Beej của Lập trình mạng được khá tiện dụng:

http://beej.us/guide/bgnet/

Cuối cùng, nếu bạn cần một tài liệu tham khảo lớn, có UNIX Mạng Lập trình bởi W. Richard Stevens et. al .:

http://www.amazon.com/Unix-Network-Programming-Sockets-Networking/dp/0131411551/ref=dp_ob_title_bk

Dù sao, để trả lời câu hỏi của bạn, sự khác biệt chính giữa Apache và Nginx là Apache sử dụng một thread mỗi khách hàng với blocking I/O, trong khi Nginx là đơn luồng với non-blocking I/O. Nhóm công nhân của Apache làm giảm chi phí của các quá trình khởi động và hủy bỏ, nhưng nó vẫn làm cho CPU chuyển đổi giữa nhiều luồng khi phục vụ nhiều máy khách. Nginx, mặt khác, xử lý tất cả các yêu cầu trong một luồng. Khi một yêu cầu cần thực hiện một yêu cầu mạng (ví dụ, với một chương trình phụ trợ), Nginx gắn một cuộc gọi lại vào yêu cầu phụ trợ và sau đó hoạt động trên một yêu cầu ứng dụng khách đang hoạt động khác. Trong thực tế, điều này có nghĩa là nó quay trở lại vòng lặp sự kiện (epoll, kqueue hoặc select) và yêu cầu các bộ mô tả tệp có nội dung cần báo cáo. Lưu ý rằng cuộc gọi hệ thống trong vòng lặp sự kiện chính thực sự là một hoạt động chặn, bởi vì không có gì để làm cho đến khi một trong các bộ mô tả tệp sẵn sàng để đọc hoặc viết. Vì vậy, đó là lý do chính Nginx và Tornado có hiệu quả trong việc phục vụ nhiều khách hàng đồng thời: chỉ có một quy trình (do đó tiết kiệm RAM) và chỉ có một luồng (do đó tiết kiệm CPU từ các công tắc ngữ cảnh). Đối với epoll, nó chỉ là một phiên bản hiệu quả hơn của lựa chọn. Nếu có N mô tả tập tin mở (sockets), nó cho phép bạn chọn ra những cái đã sẵn sàng để đọc trong O (1) thay vì O (N) thời gian. Trong thực tế, Nginx có thể sử dụng lựa chọn thay vì epoll nếu bạn biên dịch nó với tùy chọn --with-select_module và tôi đặt cược nó sẽ vẫn hiệu quả hơn Apache. Tôi không quen thuộc với Apache internals, nhưng một grep nhanh cho thấy nó sử dụng lựa chọn và epoll - có lẽ khi máy chủ đang nghe nhiều cổng/giao diện, hoặc nếu nó thực hiện các yêu cầu phụ trợ đồng thời cho một máy khách.

Ngẫu nhiên, tôi đã bắt đầu với công cụ này đang cố gắng viết một máy chủ socket cơ bản và muốn tìm hiểu xem Nginx rất kỳ quái hiệu quả như thế nào. Sau khi poring thông qua mã nguồn Nginx và đọc những hướng dẫn/sách tôi liên kết ở trên, tôi phát hiện ra nó sẽ dễ dàng hơn để viết mô-đun Nginx thay vì máy chủ của riêng tôi.Do đó sinh ra hướng dẫn tại-bán-huyền thoại Emiller để phát triển module Nginx:

http://www.evanmiller.org/nginx-modules-guide.html

(Cảnh báo: Hướng dẫn được viết chống lại Nginx 0,5-0,6 và API có thể đã thay đổi.) Nếu bạn đang làm bất cứ điều gì với HTTP, tôi muốn nói cho Nginx một shot vì nó đã làm việc ra tất cả các chi tiết lông của giao dịch với khách hàng ngu ngốc. Ví dụ, máy chủ ổ cắm nhỏ mà tôi đã viết cho vui làm việc tuyệt vời với tất cả các khách hàng - ngoại trừ Safari, và tôi không bao giờ tìm ra lý do tại sao. Ngay cả đối với các giao thức khác, Nginx có thể là con đường đúng đắn để đi; sự kiện này được tóm tắt khá tốt từ các giao thức, đó là lý do tại sao nó có thể ủy quyền HTTP cũng như IMAP. Cơ sở mã Nginx được tổ chức rất tốt và được viết rất tốt, với một ngoại lệ mà gấu đề cập đến. Tôi sẽ không làm theo chỉ dẫn của nó khi nói đến việc phân tích cú pháp giao thức; thay vào đó, hãy sử dụng trình tạo trình phân tích cú pháp. Tôi đã viết một số nội dung về việc sử dụng một máy phát điện phân tích cú pháp (Ragel) với Nginx đây:

http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing

Tất cả điều này có lẽ là nhiều thông tin hơn bạn muốn, nhưng hy vọng bạn sẽ tìm thấy một số nó hữu ích.

+0

Đó chính xác là những gì tôi cần, cảm ơn bạn rất nhiều! –

+0

Omg, cảm ơn người đàn ông! – Caio

5

Có và không. Trong khi cả hai đều sử dụng epoll, về mặt kỹ thuật, cả hai đều sử dụng vòng lặp sự kiện để xử lý các yêu cầu. Bạn có thể tìm thêm thông tin về vòng lặp sự kiện là gì và cách chúng được sử dụng tại wikipedia.

Kiểm tra libevent (được sử dụng bởi gevent, thường nhanh hơn & ổn định hơn so với lốc xoáy) hoặc libev để triển khai.

+0

và bạn có thể vui lòng cụ thể hơn không, tôi có thể tìm thêm thông tin chi tiết về tất cả những thứ này ở đâu, sự thích thú là đủ? –

+0

Đây là một cuốn sách hay về một số người bảo trì: http://www.wangafu.net/~nickm/libevent-book/ –

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