LINUX.ORG.RU

дисковый асинхронный ввод-вывод

 , ,


1

5

здравствуйте, обдумываю сейчас реализацию eventloop-а и для сетевых сокетов и для дискового I/O... я так понял, что epoll для, например, текстовых файлов не предназначен совсем. можно использовать либо posix aio либо aio уровня ядра...

1) posix aio реально используется в 2017 году? я думал что создавать каждый раз поток для каждого файла чисто для I/O это слишком накладно

2) aio уровня ядра, все ли нормально с ним в linux? толком так и не понял: то ли не доделали его, то ли косячный какой-то он

posix aio реально используется в 2017 году?

А какие существуют кроссплатформенные альтернативы? Пазикс наше всё.

anonymous
()
Ответ на: комментарий от anonymous

я просто думал что поток на соединение это такое костыльное решение... типа на коленке набросанное

xperious ★★
() автор топика

Глянь реализацию sendfile в FreeBSD. Там как раз асинхронный вывод из файла в сокет, может чего полезного накопаешь.

Minona ★★☆
()

libuv на Linux для дискового IO использует thread-pool. Сетевые сокеты мониторятся epoll. В нем же мониторятся и сигналы от пула тредов (которые отправляются когда операция завершается)

dvetutnev
()

обдумываю сейчас реализацию eventloop-а и для сетевых сокетов и для дискового I/O...

А что мешает заюзать готовые реализации?

Deleted
()

тебе нужно не на каждый файл, а создавать примерно в районе 20-80 потоков на каждое устройство и пропускать запросы через них.

Никакого асинхронного дискового IO не существует нигде. Есть какие-то попытки сделать асинхронное чтение/запись, но это лишь часть большой задачи, потому что есть ещё open, stat, а по моему опыту забитый шпиндель может отдать ответ на stat где-нибудь через 30-40 секунд. Весь твой event loop летит к черту.

Короче, thread pool, потом потыкайся в libuv когда наиграешься, а затем бери эрланг и расслабься. Там всё есть и сделано гораздо лучше.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

Весь твой event loop летит к черту.

потом потыкайся в libuv когда наиграешься

вот libuv и вдохновил свой цикл сделать чтоб разобраться с нуля... в libuv для сетевого ввода/вывода используется epoll, а для дискового posix aio + thread pool? если так, то почему все говорят что node.js все делает в один поток?

xperious ★★
() автор топика
Ответ на: комментарий от SZT

эту ссылку видел... т.е. нужно самому обертки писать до сих пор? просто думал может уже реализовали все и устаканили

xperious ★★
() автор топика
Ответ на: комментарий от xperious

это очень сложный вопрос, потому что по идее надо иметь порядка 20-80 (it depends) на один девайс. Но рейд всё поменяет

max_lapshin ★★★★★
()
Ответ на: комментарий от dvetutnev

libuv на Linux для дискового IO использует thread-pool. Сетевые сокеты мониторятся epoll. В нем же мониторятся и сигналы от пула тредов

нет сейчас возможности смотреть код libuv... я так понимаю пул тредов «пишет» в какой-то unix-сокет который тоже опрашивается в epoll? или как тогда

xperious ★★
() автор топика
Ответ на: комментарий от max_lapshin

по идее надо иметь порядка 20-80 (it depends) на один девайс

пытаюсь понять: а зачем так много? вот вызвали read - один поток для этого read... вызвали write - 1 поток для write и т.д.

xperious ★★
() автор топика
Ответ на: комментарий от xperious

С какого перепугу? select — простая штука, а с epoll ты будешь вынужден сношаться...

anonymous
()
Ответ на: комментарий от xperious

в зависимости от конкретной модели диска до N одновременных запросов проходят за одинаковое время, т.е. диск выходит на свою максимальную скорость при наличии забитой очереди задач на чтение

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

спасибо, надо будет просветиться

xperious ★★
() автор топика
Ответ на: комментарий от max_lapshin

тебе нужно не на каждый файл, а создавать примерно в районе 20-80 потоков на каждое устройство и пропускать запросы через них.

Я знаю пример с прошлой работы, когда эта замечательная идея выродилась в 18 тысяч тредов в одном-единственном процессе.

mv ★★★★★
()

В Linux нет асинхронного ввода/вывода для дисковой подсистемы, только для прямого (некешируемого) ввода/вывода (DIRECT IO). posix эмулирует его с помощью потоков. Если такая задача возникнет, то лучше всего это реализовать самому на пуле потоков (как это сделали nginx).

anonymous
()
Ответ на: комментарий от Minona

Глянь реализацию sendfile в FreeBSD.

Во FreeBSD асинхронные дисковые операции реализовали Netflix специально для себя (очень недавно). В Linux такого нет.

anonymous
()
Ответ на: комментарий от anonymous

Ну я и написал же — посмотри как реализовано, может что-то полезное увидишь. Можно ещё в стрекозе покопаться на предмет идей полезных :)

Minona ★★☆
()
Ответ на: комментарий от anonymous

Если такая задача возникнет, то лучше всего это реализовать самому на пуле потоков

в смысле реализовать на posix aio + пул потоков?

xperious ★★
() автор топика
Ответ на: комментарий от xperious

в смысле реализовать на posix aio + пул потоков?

Вообще без posix AIO. Очередь, в которую ставятся заявки на чтение/запись + пул потоков, который исполняет запросы и уведомляет заказчика. Более того, если это не библиотека для неопределенного круга пользователей, а решение для конкретной задачи, то с учетом того, что запись всегда делается в кеш ОС, ее имеет смысл делать асинхронной только для случая, когда есть шанс, что оперативки будет не хватать для кеширования. Однако, в этом случае все приложение целиком начнет тормозить, вместе с операционкой из-за нехватки памяти и забитого на 100% ввода/вывода (у компа есть три основных ресурса - CPU, размер RAM и производительность IO из них 2 будут забиты на 100%).

anonymous
()
Ответ на: комментарий от anonymous

Вообще без posix AIO

а чем это лучше чем posix AIO? тоже самое ж имхо

xperious ★★
() автор топика
Ответ на: комментарий от max_lapshin

зачем так много?

Начали 25 лет назад, когда нагрузка сильно меньше была и треды дешевле, а сейчас, без изменения архитектуры, бегемот вырос.

mv ★★★★★
()
Ответ на: комментарий от anonymous

В Linux нет асинхронного ввода/вывода для дисковой подсистемы, только для прямого (некешируемого) ввода/вывода (DIRECT IO).

Подсистема, которая в каталоге block в исходниках ядра, та вся асинхронная. В файловой семантике POSIX асинхронности нет, да.

mv ★★★★★
()
Ответ на: комментарий от max_lapshin

а кстати как параллельно на диске может осуществляться ввод/вывод если читающая головка одна?

xperious ★★
() автор топика
Ответ на: комментарий от xperious

читающая головка одна

Нет. И вообще, чтение не так примитивно.

anonymous
()
Ответ на: комментарий от mv

Начали 25 лет назад, когда нагрузка сильно меньше была и треды дешевле

Это в каком плане треды были дешевле 25 лет назад?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Это в каком плане треды были дешевле 25 лет назад?

Ну потери на свитч стали дороже и в софте, и в самом железе. А тогда там вообще юниксоподобное ядро без юзерспейса было.

mv ★★★★★
()
Ответ на: комментарий от mv

Это в каком плане треды были дешевле 25 лет назад?

Ну потери на свитч стали дороже и в софте, и в самом железе

В абсолютном времени они стали меньше и в железе, и в софте (по крайней мере, в ОС).

А тогда там вообще юниксоподобное ядро без юзерспейса было.

Хотя, если раньше всё было в едином адресном пространстве ядра, а потом перешло в Unix-процесс, тогда расходы могли и возрасти.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

В абсолютном времени они стали меньше и в железе, и в софте (по крайней мере, в ОС).

В тактах больше.

mv ★★★★★
()
Ответ на: комментарий от tailgunner

Почему это важно?

Кусок кода от переключения до переключения стал выполняться быстрее, а само переключение только прямо измеряемого времени - почти в 10 раз больше (по сравнению с юниксоподобным ядром). И, глядя на perf, прямо неизмеряемых потерь ещё прилично есть: кэш, TLB, ступор pipeline.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.