On Wed, 29 Dec 2004, Alexander Popkov wrote:
> R> Вот следующая строка появлется регулярно при всех запросах:
>
> R> 2004/12/27 20:09:05 [debug] 8507#0: *1 readv() not ready (11: Resource
> R> temporarily unavailable)
>
> R> Это нормально ?
>
> При non-blocking io это нормально. Просто система либо дает
> прочитать/записать в сокет, либо отлуп с ошибкой
> "Resource temporarily unavailable", тоесть сокет еще не готов к
> операции чтения или записи, тоесть данные от клиента еще не пришли,
> или буфер для передачи данных клиенту еще не освободился для следующей
> порции данных. Потом просто выставляется event на этот сокет через
> выбранный способ мультиплексирования, и ожидается когда система подаст
> сигнал, что этот сокет уже готов к нужной операции.
>
> А на всякий случай (вдруг когда сервер начнет обрабатывать новое
> соединение, первая порция данных уже от клиента прийдет, тогда не
> надо ждать пока система уведомит о готовности сокета, а можно сразу
> попытаться прочесть), видимо так и сделано в nginx, просто такая
> ситуация довольно редкая - вот и получается почти каждый раз отлуп.
Да, для non-blocking io "Resource temporarily unavailable" - это
обычная ошибка.
В Солярисе select, poll и /dev/poll иногда может возвращть ложную готовность
сокета, тогда операция ввода/вывода вернёт "Resource temporarily unavailable".
При использовании kqueue она должна возникать очень редко - по крайней мере,
я не видел ложных срабатываний. Кроме того, в kqueue есть возможность узнать
количество готовых данных и конец потока и это позволяет экномить системные
вызовы.
А вот при использовании epoll и rtsig после каждой операции ввода/вывода
приходится делать ещё одну такую же операцию, чтобы убедиться, что данных
больше нет и нет конца потока, потому что epoll и rtsig в отличие от kqueue
могут не вернуть сообщения о готовности данных.
Игорь Сысоев
http://sysoev.ru