fprintf && write (resolved)
- From
- Andrey Melnikov (2:5030/1340.116)
- To
- Valentin Nechayev ()
- Date
- 2003-06-05T21:33:40Z
- Area
- RU.UNIX.PROG
Hello Valentin!
05 Jun 03 10:27, Valentin Nechayev wrote to Lev Walkin:
VN> From: Valentin Nechayev <netch@segfault.kiev.ua>
>>>> Lev Walkin wrote:
>>> 1. Получить засыпание при вызове fprintf(...) где-то в ядре на
>>> write(..) на очень большое время, что увы неприемлимо. 2.
>>> Использовать
>>> alarm(time), write()/fprintf(), alarm(0); - я получу 3 системных
>>> вызова.
LW>> а попробуй так:
LW>> 1. при открытии дескриптора переводи его в non-blocking mode.
LW>> 2. В подобных твоему участках кода делай _сначала_ write(), а уж
LW>> потом, если write() вернул -1/EAGAIN, то select:
VN> Непонятно, нахрена тут select() вообще.
Таймаут. Дабы если у нас write() == -1 и errno == EAGAIN подождать пока reader всосет то, что есть у ядра в буферах. Ибо есть в нашей стране чудаки, которым дали ручку "зарезать icmp" - ну они и зарезали все, что можно. reader умер, а icmp что host/port/net недоступны - непришло.
VN> Если объект неблокирующий, то просто писать пока буфер не
VN> опустошится, write() не скажет EAGAIN, или ошибка какая не вылезет.
VN> select() нужен или для гарантии неблокируемости последующего write()
VN> с O_NONBLOCK, или для выбора, а что же делать следующим.
VN> Блокируемость убрали, точки выбора нет - select() не нужен.
Вообщем - проблема найдена и удавлена. Именно способом который посоветовал Lev Walkin. Количество селектов упало в разы, скорость вернулась к нормальной (той, которая была до модификации).
Всем спасибо. :)
PS: А тест, которым мерялась скорость - оказался слишком синтетическим. Ибо скорость я мерял через пайпы. Для той-же кривой конструкции, но через tcp по loopbackу - падение скорости было порядка 3-5 секунд от ожидаемого.
Andrey aka TEMHOTA-RIPN
--- GoldED+/LNX 1.1.4.7
* Origin: Powered by SlackWare Linux (2:5030/1340.116)