Вопрос про эполл и сплайс - PullRequest
3 голосов
/ 13 ноября 2010

Мое приложение будет отправлять огромное количество данных по сети, поэтому я решил (потому что я использую Linux) использовать epoll и splice.Вот как я это вижу (псевдокод):

epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
while(1)
{
    epoll_wait (tmp_structure);

    if (tmp_structure->fd == file_descriptor)
    {
        epoll_ctl (file_fd, EPOLL_CTL_DEL); 
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_ADD); // wait for EPOLLOUT event
    }

    if (tmp_structure->fd == tcp_socket_descriptor)
    {
        splice (file_fd, tcp_socket_fd);
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_DEL); 
        epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
    }
}

Я предполагаю, что мое приложение откроет до 2000 сокетов TCP.Я хочу спросить вас о двух вещах:

  1. Будет довольно много вызовов epoll_ctl, не будет ли медлительность, когда у меня будет столько сокетов?должен сначала стать читаемым, и пройдет некоторое время, прежде чем сокет станет доступным для записи.Могу ли я быть уверен, что в момент, когда сокет становится доступным для записи, дескриптор файла все еще читается (чтобы избежать блокировки вызова)?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2010

1-й вопрос

  1. Вы можете использовать опцию триггера, а не даже опроса, поэтому вам не нужно каждый раз удалять сокет.
  2. Вы можете использовать EPOLLONESHOT для предотвращения удаления сокета

Файловый дескриптор должен сначала стать доступным для чтения, и пройдет некоторое время, прежде чем сокет станет доступным для записи.

Что за дескриптор файла? Если в этом файле в файловой системе вы не сможете использовать select / poll или другие инструменты для этой цели, файл всегда будет доступен для чтения или записи независимо от состояния диска и кэша. Если вам нужно выполнить асинхронную работу персонала, вы можете использовать API aio_*, но обычно просто читаете из файла запись в файл и предполагаете, что он не блокирует.

Если это сокет TCP, то большую часть времени он будет доступен для записи. Лучше использовать когда вы получаете EWOULDBLOCK, неблокируйте вызовы и вставьте сокеты в epoll.

1 голос
/ 17 февраля 2014

Рассмотрите возможность использования флага EPOLLET.Это определенно для этого случая.При использовании этого флага вы можете правильно использовать цикл обработки событий, не отменяя регистрацию (или не изменяя режим) дескрипторов файлов с момента первой регистрации в epoll.:) наслаждайтесь!

...