매우 적은 수의 소켓 (물론 하드웨어에 따라 다르지만 10 개 이하의 정도에 대해 이야기하고 있음)의 경우 select can beat epoll in memory usage and runtime speed. 물론, 이렇게 적은 수의 소켓의 경우 두 메커니즘이 너무 빠르기 때문에 대부분의 경우이 차이에 대해 신경 쓰지 않습니다.
하지만 한 가지 설명이 있습니다. 선택 및 epoll 모두 선형으로 확장됩니다. 하지만 큰 차이점은 사용자 공간을 향한 API가 서로 다른 것을 기반으로하는 복잡성이 있다는 것입니다. select
호출 비용은 전달하는 가장 높은 번호의 파일 설명 자의 값에 따라 대략적으로 달라집니다. 단일 fd (100)를 선택하면 단일 fd (50)를 선택하는 것보다 대략 두 배 더 비쌉니다. 가장 높은 값 아래에 fd를 더 추가하는 것은 무료가 아니므로 실제로는 이것보다 조금 더 복잡합니다. 대부분의 구현에서 좋은 첫 번째 근사치입니다.
epoll의 비용은 실제로 이벤트가있는 파일 설명 자의 수에 더 가깝습니다. 200 개의 파일 설명자를 모니터링하고 있지만 그중 100 개에만 이벤트가있는 경우 (대략) 100 개의 활성 파일 설명자에 대해서만 비용을 지불합니다. 이것은 epoll이 선택에 비해 주요 이점 중 하나를 제공하는 경향이 있습니다. 대부분 유휴 상태 인 1,000 명의 클라이언트가있는 경우 select를 사용할 때 여전히 1,000 명 모두에 대해 비용을 지불하게됩니다. 그러나 epoll을 사용하면 몇 개만있는 것과 같습니다. 주어진 시간에 활성화 된 항목에 대해서만 비용을 지불하면됩니다.
이 모든 것은 epoll이 대부분의 워크로드에서 CPU 사용량을 줄일 수 있음을 의미합니다. 메모리 사용량에 관한 한, 약간의 토스입니다. select
필요한 모든 정보를 매우 간결한 방식으로 표현합니다 (파일 설명 자당 1 비트). 그리고 함께 사용할 수있는 파일 설명자 수에 대한 FD_SETSIZE (일반적으로 1024) 제한은 함께 사용할 수 select
있는 3 개의 fd 세트 각각에 대해 128 바이트 이상을 소비하지 않음 을 의미합니다.select
(읽기, 쓰기, 예외). 최대 384 바이트에 비해 epoll은 일종의 돼지입니다. 각 파일 설명자는 다중 바이트 구조로 표시됩니다. 그러나 절대적인 측면에서 여전히 많은 메모리를 사용하지 않을 것입니다. 수십 킬로바이트로 엄청난 수의 파일 설명자를 나타낼 수 있습니다 (파일 설명자 1000 개당 약 20k). 또한 select
하나의 파일 설명 자만 모니터링하고 싶지만 그 값이 1024 인 경우 384 바이트를 모두 사용해야한다는 사실을 던질 수 있습니다. epoll을 사용하면 20 바이트 만 소비합니다. 그래도이 모든 숫자는 매우 작기 때문에 큰 차이는 없습니다.
그리고 epoll의 다른 이점도 있습니다. 이미 알고 계시 겠지만 FD_SETSIZE 파일 설명자에만 국한되지 않는다는 것입니다. 이를 사용하여 보유한 파일 설명자를 모니터링 할 수 있습니다. 그리고 파일 설명자가 하나만 있지만 그 값이 FD_SETSIZE보다 큰 경우 epoll도 함께 작동하지만 select
그렇지 않습니다.
무작위로 최근 epoll
에 select
또는에 비해 약간의 단점을 발견했습니다 poll
. 이 세 가지 API 중 어느 것도 일반 파일 (예 : 파일 시스템의 파일) 을 지원하지 select
않으며 poll
이러한 설명자를 항상 읽기 가능하고 쓰기 가능하다고보고하는 등의 지원 부족을 나타냅니다. 이로 인해 의미있는 종류의 비 차단 파일 시스템 I / O에는 적합하지 않습니다. 파일 시스템 에서 파일 설명자를 사용 select
하거나 poll
접하게되는 프로그램 은 적어도 계속 작동합니다 (또는 실패하면 그렇지 않습니다. 의 select
나 poll
), 그것을이기는하지만 아마도하지 최적의 성능으로.
반면 에은 (는) 이러한 파일 설명자를 모니터링하라는 요청을 받으면 epoll
오류 ( EPERM
분명히) 와 함께 빠르게 실패 합니다. 엄밀히 말해서 이것은 거의 틀리지 않습니다. 이는 명시적인 방식으로 지원 부족을 알리는 것일뿐입니다. 일반적으로 나는 명시적인 실패 조건에 박수를 보냅니다. 그러나 이것은 문서화되지 않았으며 (내가 말할 수있는 한) 잠재적으로 저하 된 성능으로 작동하는 애플리케이션이 아닌 완전히 손상된 애플리케이션이됩니다.
실제로 내가 본 유일한 장소는 stdio와 상호 작용할 때입니다. 사용자는 일반 파일에서 stdin 또는 stdout을 리디렉션 할 수 있습니다. 이전에는 stdin과 stdout이 파이프 였을 것입니다. epoll이 지원하는 것은 괜찮습니다. 그러면 일반 파일이되고 epoll이 크게 실패하여 응용 프로그램이 중단됩니다.
poll
완전성 을 위해 의 동작에 대해 명시 적으로 고려 하시겠습니까?