URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 24915
[ Назад ]

Исходное сообщение
"OpenNews: Оптимизация ввода/вывода при помощи POSIX AIO API"

Отправлено opennews , 03-Сен-06 18:41 
В статье "Boost application performance using asynchronous I/O (http://www-128.ibm.com/developerworks/linux/library/l-async/)" рассказывается про оптимизацию производительности приложений используя средства асинхронного ввода/вывода в Linux.

URL: http://www-128.ibm.com/developerworks/linux/library/l-async/
Новость: http://www.opennet.me/opennews/art.shtml?num=8275


Содержание

Сообщения в этом обсуждении
"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено pavlinux , 03-Сен-06 18:41 
- if ((ret = aio_return( &my_iocb )) > 0)
+ if ((ret = aio_return( &my_aiocb )) > 0)


"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено klalafuda , 03-Сен-06 21:40 

на познакомиться IMHO вполне приличная статья, молодцы.

// wbr


"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено Woody , 04-Сен-06 12:21 
Я в таких случаях завожу отдельный поток, очередь и бросаю всё в неё. Как по мне такое решение более красивое, наглядное и простое чем полинг состояния AIO.

"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено pavlinux , 04-Сен-06 12:28 
Дык, в подсистеме AIO тоже есть ниточки - aio_threads :)

#ifdef __USE_GNU
extern void aio_init (__const struct aioinit *__init) __THROW;
#endif

struct aioinit
  {
    int aio_threads;            /* Maximal number of threads.  */
    int aio_num;                /* Number of expected simultanious requests. */
    int aio_locks;              /* Not used.  */
    int aio_usedba;             /* Not used.  */
    int aio_debug;              /* Not used.  */
    int aio_numusers;           /* Not used.  */
    int aio_idle_time;          /* Number of seconds before idle thread
                                   terminates.  */
    int aio_reserved;
  };


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



"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено Woody , 04-Сен-06 12:38 
>Дык, в подсистеме AIO тоже есть ниточки - aio_threads :)

Но обработка то всё-равно выполняется в одном потоке.

Если с aio (если верить статье ;) я буду делать:

-----
  ret = aio_write( &my_aiocb );
  while ( aio_error( &my_aiocb ) == EINPROGRESS )
    do_something();
-----

То в случае с потоками получится примерно следующее:
-----
  queue.add(buf, size);
-----

А в соседнем потоке ждём очередь, и потом пишем. Так удобно логеры делать и обработку потока  данных (заводим три потока: reader, writer и worker и понеслось ;)


"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено pavlinux , 04-Сен-06 17:29 
Ну struct QUEUE, это отдельная история...

Вот ещё в догону парочка...

http://lwn.net/Articles/145365
http://www.bullopensource.org/posix


"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено Анонимоус , 04-Сен-06 18:37 
>Но обработка то всё-равно выполняется в одном потоке.
Для простых дисков и дисковых массивов один поток лучше чем много.По скорости.

"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено Woody , 04-Сен-06 18:42 
>>Но обработка то всё-равно выполняется в одном потоке.
>Для простых дисков и дисковых массивов один поток лучше чем много.По скорости.

Я не то имел в виду. Есть один поток (thread) который пишет на диск. У него есть очередь в которую другие потоки кидают запросы на запись.


"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено Супербизон , 04-Сен-06 20:25 
а если не диск а сокеты??

"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено Woody , 04-Сен-06 20:50 
>а если не диск а сокеты??

Зависит от логики. Либо один сокет на поток, либо несколько и через select/etc.


"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено pavlinux , 04-Сен-06 22:40 
AIO read and write on sockets (doesn't return an explicit error, but quietly defaults to synchronous or rather non-AIO behavior)

"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено pavlinux , 04-Сен-06 22:40 
http://lse.sourceforge.net/io/aio.html

"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено J0ester , 24-Окт-07 07:20 
При использовании сигналов или нитей для уведомления о завершении, нужно ли хранить структуры которые использовались для вызова? или можно не дожидаясь завершения операции заюзать структуру aiocb снова?

Вобще хочется дать n запросов на ио через lio_listio и двигатся далее


"Оптимизация ввода/вывода при помощи POSIX AIO API"
Отправлено Аноним , 24-Окт-07 09:50 
Подскажиете пожалуста, как динамически создать N структур для aio и передать их lio_listio? У меня за цикл разное количество операций и я не могу эффективно использовать уже выделенную память или создать столько сколько нужно.