2012-01-13 24 views
11

Có một số quy tắc đơn giản khi sử dụng poll so với epoll trong môi trường có độ trễ thấp không? epoll phải có chi phí cao hơn nếu chỉ có một vài bộ mô tả tệp được giám sát. Xin vui lòng, cung cấp cho một số cái nhìn sâu sắc, câu trả lời "kiểm tra xem nó cho mình" đặt ở nơi khác.thăm dò ý kiến ​​so với thông tin chi tiết về epoll

+0

Giai thoại cá nhân: kết quả của tôi thử nghiệm epoll so với bình chọn trong một quy trình đơn (không có chủ đề, không có nhánh) http không đồng bộ (tức là, thời gian kết nối ngắn, <1000 đồng thời, cho ~ 10000 yêu cầu/giây) sự khác biệt giữa hai là không đáng kể. Xem nhận xét của tôi cho câu trả lời của plaes cho lý do tại sao. – delicateLatticeworkFever

Trả lời

13

Luôn luôn sử dụng poll trừ khi tất cả những điều sau đây được thỏa mãn:

  1. Bạn có thể chắc chắn rằng bạn đang ở trên một hệ thống (Linux) mà có epoll hoặc bạn cung cấp một dự phòng cho hệ thống mà không làm.
  2. Bạn có số lớn số lượng mô tả tệp hoạt động (ít nhất 1000-10000).
  3. Bộ mô tả tệp bạn đang làm việc ổn định trong một khoảng thời gian dài (thêm/xóa mô tả tệp từ danh sách epoll chỉ tốn kém như hoạt động poll vì yêu cầu nhập/rời kernelspace).
2

epoll(7) tóm tắt ngắn gọn: epoll "chia tỷ lệ thành số lượng lớn mô tả tệp đã xem." Tuy nhiên, poll là giao diện chuẩn POSIX, vì vậy hãy sử dụng giao diện đó khi cần có tính di động.

+0

Có, nó có tỷ lệ, nhưng nếu số lượng fds nhỏ, 'poll' sẽ nhanh hơn. – Cartesius00

+4

@James: Tôi thực sự muốn xem một số điểm chuẩn về điều này. Từ kinh nghiệm cá nhân tôi sẽ nói rằng khi bạn làm điều gì đó như một phản ứng về sự kiện, không có nhiều khác biệt. Cho rằng bạn phải duy trì vectơ thăm dò ý kiến, tôi thậm chí sẽ đoán rằng epoll là nhanh hơn. Sự khác biệt quan trọng là, như đã nêu trong câu trả lời này, cuộc thăm dò đó là POSIX và do đó di động hơn. epoll cũng là lợi thế của việc cung cấp thêm một vài tính năng nữa. – PlasmaHH

8

Trước hết, poll(2) chỉ được kích hoạt cấp, nhưng epoll(4) có thể được sử dụng làm giao diện cạnh hoặc được kích hoạt cấp.

Độ phức tạp: poll độ phức tạp về số lượng bộ mô tả đã xem (fds) là O (n) khi quét tất cả các fds mỗi khi sự kiện 'sẵn sàng' xảy ra, epoll về cơ bản là O (1) thực hiện quét tuyến tính trên tất cả các bộ mô tả đã xem.

Về mặt tính di động - vì epoll là đặc thù của Linux, tôi khuyên bạn nên kiểm tra các thư viện libevlibevent. Ngoài ra, hãy xem bài viết tuyệt vời của Dan Kegel: "The C10K problem".

+2

Tôi tin rằng điểm về epoll và ký hiệu O lớn là * không phải về nội bộ của một trong hai hàm *, do đó, không chính xác khi nói rằng "cuộc thăm dò sẽ quét tất cả các mô tả trong khi epoll không". * Cả hai đều có khả năng kích hoạt trên một sự kiện *. Tuy nhiên, với bình chọn, người dùng sau đó không có lựa chọn nào khác ngoài việc lặp lại toàn bộ danh sách được gửi để tìm các sự kiện, trong khi với epoll bạn nhận được một danh sách trả về chỉ chứa các sự kiện thực tế. Điều này có nghĩa là nếu máy chủ rất bận, không có lợi thế nào cho việc thu thập dữ liệu. Tuy nhiên, nếu bạn duy trì số lượng mô tả rất lớn trong một thời gian dài ... – delicateLatticeworkFever

+0

... và hầu hết trong số đó không hoạt động, epoll sẽ có lợi thế nếu bạn có các sự kiện rất nhanh chỉ liên quan đến một vài kết nối . Tức là, O (bất cứ điều gì) là về những gì * có thể * cho việc thực hiện người dùng, không phải là hành vi thực tế của cuộc thăm dò ý kiến ​​/ epoll. – delicateLatticeworkFever

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