Подходы к параллельной обработке сетевого трафика. Фреймворк AnyEvent
Naim Shafiev, Russia, Москва
Сетевой траффик испытывает неуклонный рост, в результате чего перед программистами неизменно возникает проблема быстрой и своевременной его обработки. Современные операционные системы, особенно Unix-подобные (GNU/Linux, FreeBSD, Solaris) предоставляют довольно гибкие механизмы мультиплексирования (иногда именуемые polling), которые идеально подходят для однопоточных сетевых демонов и клиентов. Безусловно, сетевые программы, написанные с использованием потоковой парадигмы, могут использовать старые приемы и технологии, однако большинство современных скриптовых языков,таких как Perl, PHP, python, ruby имеют очень ограниченную реализацию классических потоков.
Существует несколько решений для обработки сетевого траффика:
- Использовать более мощное “железо” (сервера, маршрутизаторы и т.д).
- Использовать механизм форков. Метод довольно старый и отработанный, но в виду потребления памяти и скорости создания дочернего процесса (что особенно актуально для ОС семейства Windows) не подходят для современных требований.
- Использовать механизмы современного polling’а (например epoll, kqueue). Этот вариант идеально подходит для быстрой разработки, а кроме того избавляет программистов от критических областей.
- Использовать механизм системных потоков. По производительности и по потреблению оперативной памяти этот метод вне конкуренции, однако он наиболее сложен в разработке, и требует высокой квалификации от программистов.
- Использование так называемых “зеленых тредов”. По сути этот подход приводит к однопоточной реализации программы с развитыми внутренними планировщиками, что является уже псевдопараллельной программой.
Наиболее реентабельным для большинства случаев является 3-й метод. Как показывает практика, самые быстрые веб-сервера типа nginx и lighttpd используют механизм современного polling’а совместно с механизмом форков.
Материалы к докладу
- Презентация: Просмотреть Загрузить
- Видео: Загрузить