дисковый асинхронный ввод-вывод
здравствуйте, обдумываю сейчас реализацию eventloop-а и для сетевых сокетов и для дискового I/O. я так понял, что epoll для, например, текстовых файлов не предназначен совсем. можно использовать либо posix aio либо aio уровня ядра.
1) posix aio реально используется в 2017 году? я думал что создавать каждый раз поток для каждого файла чисто для I/O это слишком накладно
2) aio уровня ядра, все ли нормально с ним в linux? толком так и не понял: то ли не доделали его, то ли косячный какой-то он
posix aio реально используется в 2017 году?
А какие существуют кроссплатформенные альтернативы? Пазикс наше всё.
я просто думал что поток на соединение это такое костыльное решение. типа на коленке набросанное
Глянь реализацию sendfile в FreeBSD. Там как раз асинхронный вывод из файла в сокет, может чего полезного накопаешь.
libuv на Linux для дискового IO использует thread-pool. Сетевые сокеты мониторятся epoll. В нем же мониторятся и сигналы от пула тредов (которые отправляются когда операция завершается)
обдумываю сейчас реализацию eventloop-а и для сетевых сокетов и для дискового I/O.
А что мешает заюзать готовые реализации?
Да, есть реализация AIO на уровне ядра Linux, в которой не требуется треды создавать, но оно не портабельно
тебе нужно не на каждый файл, а создавать примерно в районе 20-80 потоков на каждое устройство и пропускать запросы через них.
Никакого асинхронного дискового IO не существует нигде. Есть какие-то попытки сделать асинхронное чтение/запись, но это лишь часть большой задачи, потому что есть ещё open, stat, а по моему опыту забитый шпиндель может отдать ответ на stat где-нибудь через 30-40 секунд. Весь твой event loop летит к черту.
Короче, thread pool, потом потыкайся в libuv когда наиграешься, а затем бери эрланг и расслабься. Там всё есть и сделано гораздо лучше.
Весь твой event loop летит к черту.
потом потыкайся в libuv когда наиграешься
вот libuv и вдохновил свой цикл сделать чтоб разобраться с нуля. в libuv для сетевого ввода/вывода используется epoll, а для дискового posix aio + thread pool? если так, то почему все говорят что node.js все делает в один поток?
эту ссылку видел. т.е. нужно самому обертки писать до сих пор? просто думал может уже реализовали все и устаканили
потому что тредпул только для дисков. Всё остальное нода обречена делать в один поток
а сколько потоков в тредпуле там?
это очень сложный вопрос, потому что по идее надо иметь порядка 20-80 (it depends) на один девайс. Но рейд всё поменяет
libuv на Linux для дискового IO использует thread-pool. Сетевые сокеты мониторятся epoll. В нем же мониторятся и сигналы от пула тредов
нет сейчас возможности смотреть код libuv. я так понимаю пул тредов «пишет» в какой-то unix-сокет который тоже опрашивается в epoll? или как тогда
Нафиг тебе epoll? Чем обычный select не устраивает?
по идее надо иметь порядка 20-80 (it depends) на один девайс
пытаюсь понять: а зачем так много? вот вызвали read — один поток для этого read. вызвали write — 1 поток для write и т.д.
С какого перепугу? select — простая штука, а с epoll ты будешь вынужден сношаться.
в зависимости от конкретной модели диска до N одновременных запросов проходят за одинаковое время, т.е. диск выходит на свою максимальную скорость при наличии забитой очереди задач на чтение
спасибо, надо будет просветиться
тебе нужно не на каждый файл, а создавать примерно в районе 20-80 потоков на каждое устройство и пропускать запросы через них.
Я знаю пример с прошлой работы, когда эта замечательная идея выродилась в 18 тысяч тредов в одном-единственном процессе.
В Linux нет асинхронного ввода/вывода для дисковой подсистемы, только для прямого (некешируемого) ввода/вывода (DIRECT IO). posix эмулирует его с помощью потоков. Если такая задача возникнет, то лучше всего это реализовать самому на пуле потоков (как это сделали nginx).
Глянь реализацию sendfile в FreeBSD.
Во FreeBSD асинхронные дисковые операции реализовали Netflix специально для себя (очень недавно). В Linux такого нет.
Ну я и написал же — посмотри как реализовано, может что-то полезное увидишь. Можно ещё в стрекозе покопаться на предмет идей полезных 🙂
Если такая задача возникнет, то лучше всего это реализовать самому на пуле потоков
в смысле реализовать на posix aio + пул потоков?
в смысле реализовать на posix aio + пул потоков?
Вообще без posix AIO. Очередь, в которую ставятся заявки на чтение/запись + пул потоков, который исполняет запросы и уведомляет заказчика. Более того, если это не библиотека для неопределенного круга пользователей, а решение для конкретной задачи, то с учетом того, что запись всегда делается в кеш ОС, ее имеет смысл делать асинхронной только для случая, когда есть шанс, что оперативки будет не хватать для кеширования. Однако, в этом случае все приложение целиком начнет тормозить, вместе с операционкой из-за нехватки памяти и забитого на 100% ввода/вывода (у компа есть три основных ресурса — CPU, размер RAM и производительность IO из них 2 будут забиты на 100%).
а чем это лучше чем posix AIO? тоже самое ж имхо
Начали 25 лет назад, когда нагрузка сильно меньше была и треды дешевле, а сейчас, без изменения архитектуры, бегемот вырос.
В Linux нет асинхронного ввода/вывода для дисковой подсистемы, только для прямого (некешируемого) ввода/вывода (DIRECT IO).
Подсистема, которая в каталоге block в исходниках ядра, та вся асинхронная. В файловой семантике POSIX асинхронности нет, да.
а кстати как параллельно на диске может осуществляться ввод/вывод если читающая головка одна?
Лучшие инструменты для мониторинга производительности дискового ввода-вывода в Linux
Ключевым показателем производительности для мониторинга на сервере Linux является активность дискового ввода-вывода (ввода/вывода), которая может значительно повлиять на некоторые аспекты сервера Linux, в частности, на скорость сохранения на диск или извлечения с диска файлов или данных (особенно на серверах баз данных). Это оказывает волновое влияние на производительность приложений и служб.
1. iostat — показывает статистику ввода и вывода устройства
утилиты мониторинга системы в пакете sysstat, который является широко используемой утилитой, предназначенной для создания отчетов о статистике ЦП и статистике ввода-вывода для блочных устройств и разделов.
Чтобы использовать iostat на сервере Linux, вам необходимо установить пакет sysstat в вашей системе Linux, выполнив соответствующую команду для вашего дистрибутива Linux.
$ sudo apt install sysstat [On Debian, Ubuntu and Mint] $ sudo yum install sysstat [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux] $ sudo emerge -a app-admin/sysstat [On Gentoo Linux] $ sudo apk add sysstat [On Alpine Linux] $ sudo pacman -S sysstat [On Arch Linux] $ sudo zypper install sysstat [On OpenSUSE]
Чтобы показать простой отчет об использовании устройства, запустите iostat с параметром командной строки -d . Обычно первый отчет содержит статистику о времени, прошедшем с момента запуска системы (время загрузки), а каждый последующий отчет касается времени, прошедшего с момента предыдущего отчета.
Используйте -x для расширенного статистического отчета и флаг -t , чтобы включить время для каждого отчета. Кроме того, если вы хотите исключить устройства без какой-либо активности в выводе отчета, добавьте флаг -z :
# iostat -d -t OR # iostat -d -x -t
Чтобы отображать статистику в килобайтах в секунду, а не в блоках в секунду, добавьте флаг -k или используйте флаг -m для отображения статистики в мегабайтах в секунду.
# iostat -d -k OR # iostat -d -m
iostat также может отображать непрерывные отчеты об устройствах с интервалом x в секунду. Например, следующая команда отображает отчеты с интервалом в две секунды:
Как и в предыдущей команде, вы можете отображать n количество отчетов с интервалом x в секунду. Следующая команда отобразит 10 отчетов с интервалом в две секунды. Кроме того, вы можете сохранить отчет в файл для последующего анализа:
# iostat -d 2 10 OR # iostat -d 2 10 > disk_io_report.txt &
Для получения дополнительной информации о столбцах отчета прочитайте справочную страницу iostat:
2. sar — Показать активность системы Linux
sar — еще одна полезная утилита, входящая в состав пакета sysstat и предназначенная для сбора, составления отчетов или сохранения информации об активности системы. Прежде чем вы сможете начать использовать его, вам необходимо настроить его следующим образом.
Сначала включите сбор данных в файл /etc/default/sysstat.
Найдите следующую строку и измените значение на true, как показано.
Затем вам нужно уменьшить интервал сбора данных, заданный в заданиях cron sysstat. По умолчанию установлено значение каждые 10 минут, вы можете уменьшить его до 2 минут.
Это можно сделать в файле /etc/cron.d/sysstat:
Сохраните файл и закройте его.
Наконец, включите и запустите службу sysstat с помощью следующей команды systemctl:
# systemctl enable --now sysstat.service # systemctl enable sysstat.service
Затем подождите 2 минуты, чтобы начать просмотр отчетов sar. Используйте команду sar и параметр командной строки -b , чтобы сообщить статистику ввода-вывода и скорости передачи, и -d , чтобы сообщить об активности для каждого блока. устройство, как показано.
3. iotop — мониторинг использования дискового ввода-вывода Linux
Подобно iotop, это простая утилита, которая позволяет вам отслеживать активность дискового ввода-вывода и использование для каждого процесса.
Вы можете установить его на свой сервер Linux следующим образом (не забудьте запустить соответствующую команду для вашего дистрибутива Linux):
$ sudo apt install iotop [On Debian, Ubuntu and Mint] $ sudo yum install iotop [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux] $ sudo emerge -a sys-processs/iotop [On Gentoo Linux] $ sudo apk add iotop [On Alpine Linux] $ sudo pacman -S iotop [On Arch Linux] $ sudo zypper install iotop [On OpenSUSE]
Чтобы отслеживать активность ввода-вывода для каждого процесса, вы можете запустить iotop без каких-либо аргументов следующим образом. По умолчанию задержка между итерациями составляет 1 секунду. Вы можете изменить это с помощью флага -d .
iotop по умолчанию отображает все потоки процесса. Чтобы изменить это поведение, чтобы отображались только процессы, используйте параметр командной строки -P .
Кроме того, используя параметр -a , вы можете настроить его на отображение накопленного ввода-вывода, а не пропускной способности. В этом режиме iotop показывает количество процессов ввода-вывода, выполненных с момента вызова iotop.
Это все, что у нас было для вас! Мы хотели бы знать, что вы думаете об этом руководстве или вышеупомянутых инструментах. Оставьте комментарий через форму обратной связи ниже.
Вы также можете сообщить нам об инструментах, которые, по вашему мнению, отсутствуют в этом списке, но заслуживают появления здесь.