Читаем Linux API. Исчерпывающее руководство полностью

В табл. 59.9 представлены результаты мониторинга набора из N файловых дескрипторов в диапазоне от 0 до N — 1 с помощью вызовов poll(), select() и интерфейса epoll. (Тестирование проводилось в Linux 2.6.25 и было организовано таким образом, что во время каждой операции наблюдения готовым оказывался ровно один файловый дескриптор.) Как видите, с ростом номеров дескрипторов производительность вызовов poll() и select() постепенно снижается. Для сравнения: производительность интерфейса epoll при больших N почти не меняется (небольшое замедление, вероятно, является результатом переполнения кэша процессора в тестовой системе).

Перед тестированием мы изменили значение константы FD_SETSIZE в заголовочных файлах glibc на 16 384, чтобы позволить программе отслеживать большое количество файловых дескрипторов, задействуя вызов select().

Таблица 59.9. Время, которое уходит на 100 000 операций мониторинга с помощью poll(), select() и интерфейса epoll

Количество отслеживаемых дескрипторов (N) — Процессорное время poll() (секунды) — Процессорное время select() (секунды) — Процессорное время epoll (секунды)

10 — 0,61 — 0,73 — 0,41

100 — 2,90 — 3,00 — 0,42

1000 — 35,00–35,00 — 0,53

10 000–990,00 — 930,00 — 0,66

В подразделе 59.2.5 мы узнали, что вызовы select() и poll() демонстрируют низкую производительность при наблюдении за большим количеством файловых дескрипторов. Теперь посмотрим, почему интерфейс epoll не имеет такой проблемы.

• При каждом вызове select() или poll() ядро вынуждено проверять все указанные файловые дескрипторы. Для сравнения: интерфейс epoll позволяет пометить интересующий нас дескриптор с помощью вызова epoll_ctl(). Ядро записывает эту информацию в список, связанный с исходным описанием открытого файла, и затем при каждой операции ввода/вывода, которая делает файловый дескриптор готовым, добавляет элемент в соответствующий список готовности epoll. (Событие ввода/вывода, связанное с одним описанием открытого файла, может сделать готовыми сразу несколько файловых дескрипторов.) Последующий вызов epoll_wait() просто извлекает элементы из списка готовности.

• При каждом вызове select() или poll() передает ядру структуру данных со сведениями обо всех файловых дескрипторах, за которыми нужно наблюдать; затем ядро возвращает эту структуру обратно, предварительно записав в нее информацию обо всех готовых дескрипторах. Для сравнения: в интерфейсе epoll предусмотрен вызов epoll_ctl(), создающий структуру данных с перечнем отслеживаемых файловых дескрипторов прямо в пространстве ядра. После его выполнения последующим вызовам epoll_wait() не нужно передавать ядру информацию о дескрипторах, а в качестве результата мы будем получать список дескрипторов, являющихся готовыми.

Помимо фактов, приведенных выше, стоит отметить еще несколько моментов. Каждый вызов select() требует предварительной инициализации входящей структуры данных, а каждую структуру, возвращаемую вызовами select() и poll() и состоящую из N элементов, следует проверять на наличие готовых файловых дескрипторов. Однако, если верить результатам тестирования, время, которое уходит на эти операции, является несущественным по сравнению с тем, сколько времени тратится на выполнение системных вызовов для мониторинга N дескрипторов. Операции проверки не учитываются в табл. 59.9.

Грубо говоря, производительность вызовов select() и poll() падает линейно по мере увеличивается значения N (количества отслеживаемых файловых дескрипторов). Эта закономерность начинает проявляться при N = 100 и N = 1000 (см. табл. 59.9). К моменту достижения N = 10 000 падение производительности становится даже хуже, чем линейное.

Интерфейс epoll линейно масштабируется в зависимости от количества происходящих событий ввода/вывода, что делает его особенно эффективным в сценариях, характерных для серверов, которые одновременно обслуживают множество клиентов: большинство отслеживаемых файловых дескрипторов не проявляют никакой активности, и лишь немногие из них являются готовыми.

59.4.6. Уведомления, срабатывающие по фронту

Уведомления, предоставляемые интерфейсом epoll, изначально срабатывают по уровню. Это значит, что epoll сообщает нам, будет ли заблокирована операция ввода/вывода для заданного файлового дескриптора. Извещения такого вида предоставляются также вызовами poll() и select().

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных