Распределенные системы

Все рассмотренные ранее системы буферизации имеют одно общее свойство: они выделяют пулы буферов различного размера, а потом выделяют для каждого пакета свой собственный буфер. Подобные типы буферов называют непрерывными (contiguous buffers), потому что каждый пакет находится внутри собственного отдельного буфера в непрерывной области памяти. Для разделения памяти на отдельные буферы используется один из двух способов: или размер буфера выбирается исходя из наибольшего размера пакета, или размер буфера выверяется фиксированным по определенному закону.

Непрерывными буферами легче управлять, но они не всегда обеспечивают наиболее эффективное использование памяти. Потери памяти в схемах с непрерывной буферизацией могут быть связаны с тем, что размер буфера значительно больше среднего размера пакета, или с неравномерным использованием буферов. Для примера рассмотрим схему разделения памяти MEMD для шины Cbus. В схеме данного типа размер создаваемых интерфейсных буферов равен установленной для интерфейса величине параметра MTU, т.е. максимально возможной величине пакета. Если средний размер получаемого пакета значительно, меньше чем величина установленного значения MTU, большая часть пространства памяти пакетного буфера не используется. Например, пусть величина параметра MTU интерфейса равна 4 Кбайт, а средний размер большинства (90 процентов) пакетов меньше 1 Кбайт, тогда 75 процентов памяти, выделенной для хранения пакетов не используется 90 процентов времени!

В операционной системе IOS версий 11.1... был предложен новый способ выделения памяти — распределенная буферизация (particle buffering), — разработанный для устранения недостатков непрерывной-буферизации. Несмотря на то что указанный метод не поддерживается всеми платформами, распределенная буферизация используется в маршрутизаторах Cisco серий: 2600, 3600, 7500 V1P и 7200, а также в маршрутизаторах серий: 7100 и 6400 NRP, созданных на основе моделей 7200.

В данной главе описана распределенная буферизация и подробно рассмотрено ее использование на одной из поддерживаемых платформ — маршрутизаторах Cisco серии 7200.

Управление фрагментарным буфером

Для управления пакетной памятью распределенная буферизация использует подход “рассеяния-сборки” (“scatter-gather”). При распределенной буферизации вместо выделения непрерывной протяженной области памяти используются прерывистые (dis-contiguous, обычно называемые распределенными) участки памяти, называемые фрагментами. После коммутации всё пакеты собираются воедино, формируя один логический буфер, который называется рбспределенный буфер (particle buffer). При использований распределенного подхода один пакет может быть распределен по нескольким буферам.

Связанные воедино одиночные фрагменты образуют распределенный буфер. Для каждого пришедшего в интерфейс пакета создается распределенный буфер (более детально процесс данного алгоритма будет .описан в примере для маршрутизатора Cisco серии 7200). Указанный метод отличается от метода непрерывной буферизации тем, что состоящий из нескольких фрагментов пакет нужно собрать в одно целое непосредственно перед его обработкой. Вследствие того что данные хранятся в распределенном виде, в данном методе нет предопределенных наборов буферов, используемых в методе непрерывных буферов. Таким образом, возникает вопрос, откуда операционная система IOS знает, сколько и каких фрагментов нужно использовать для работы с каждым пакетом? Система IQ$ управляет несколькими пулами фрагментов и при получении пакетов использует данные фрагменты для создания распределенных буферов. Фрагменты являются “кирпичиками”, а распределенные буферы — “строительными блоками” памяти для хранения пакетов.

В пределах определенного пула все фрагменты имеют один и тот же фиксированный размер. Поэтому любой фрагмент в каждом определенном пуле может использоваться без указания его размера. Одинаковый размер фрагмента внутри пула упрощает процесс управления и помогает эффективно управлять памятью. В системе IOS размер фрагментов меняется от платформы к платформе, однако каждой серии обычно присущ основной размер. Как будет показано ниже, бывают и исключения — некоторые платформы могут иметь пулы с иными размерами фрагментов, но обычно всегда существует преобладающий размер фрагментов. Размер выбирается таким образом, чтобы фрагмент мог содержать пакет среднего размера и чтобы потеря памяти при хранении пакета была минимальна. Стандартный размер фрагмента — 512 байт, поэтому большинство распределенных буферов может состоять из одного фрагмента. Для большего понимания принципов работы с распределенными буферами рассмотрим пример, приведенный на рис. 5.1. Пусть в рассматриваемом примере существует всего один фрагментарный пул и все распределенные буферы созданы на его основе.


Пусть размер фрагментов в едином пуле равен 512 байт и в данный момент времени в пуле существует всего 3 свободных фрагмента: фрагмент 1, фрагмент 2 и фрагмент 3, помеченные как Ф1, Ф2 и ФЗ соответственно. Теперь проследим за этапами обработки системой 10S пакета размером 1200 байт.

    • Этап 1. Операционная система IOS находит первый свободный фрагмент (Ф1) и начинает копировать в него данные. В первый фрагмент копируются первые 512 байт.

    • Этап 2. После заполнения первого фрагмента система IOS переходит к следующему фрагменту (Ф2), связывает его логически с Ф1 и продолжает копировать данные пакета во второй фрагмент. Так копируются следующие 512 байт.

    • Этап 3. После заполнения второго фрагмента все еще остается 176 байт данных пакета. Поэтому система IOS переходит к следующему свободному фрагменту (Ф3), связывает его с Ф2 и копирует оставшиеся 176 байт в последний фрагмент.

Таким образом, операционная система IOS копирует 1200-байтовый пакет в 3 участка памяти (фрагмента), которые, являются логическими составляющими одного фрагментарного пакетного буфера, ,

Фрагментарные буферы в действительности состоят не только из областей памяти, которые содержат данные пакета. Избыточное количество памяти (в виде дополнительных компонентов) используется для хранения информации о пакете, как, например, информация о том, как логически связаны разбросанные участки памяти. На рис. 5.2 показаны компоненты распределенного буфера и их взаимосвязь.

Каждый распределенный буфер содержит заголовок пакета, который связан с одним или более фрагментами. Сам фрагмент состоит из заголовка фрагмента и связанного с ним блока данных фрагмента (particle data block). Детальное описание компонентов распределенного буфера приведено ниже:

    • Заголовок пакета аналогичен заголовку пакета для непрерывных буферов. Он содержит информацию о типе и размере пакета в виде указателей на соответствующие поля пакета, а также указатель на первый фрагмент.

    • Заголовок фрагмента — это управляющий блок, который содержит ссылки на блок данных фрагмента и на следующий фрагмент, составляющий буфер (если такой существует). Также заголовок фрагмента содержит и другую информацию, например количество байт в блоке данных и пул, которому принадлежит данный фрагмент.

    • Блок данных фрагмента — это область памяти, в которой содержатся данные фрагмента.


Пулы фрагментов

Для управления пулами фрагментов операционная система IOS использует те же подходы, что и для управления непрерывными пакетными буферами в системах с разделяемым доступом к памяти. Система IOS создает локальный статический фрагментарный пул (Private particle pools) для каждого интерфейса, а потом создает общий динамический пул,называемый нормальным пулом. К нормальному пулу имеют доступ все интерфейсы и процессы. .В случае, заполнения всех фрагментов в локальных пулах, нормальный пул используется как дополнительная область памяти.

В большинстве, систем создается еще один пул из маленьких 128-байтовых фрагментов, который называется пулом быстрой коммутации (fast switching pool). Пул быстрой коммутации используется в случае необходимости добавления данных в начало пакета, например, когда к пакету нужно присоединить заголовок большего размера, чем исходный. Чтобы добавить данные в начало пакета, операционная система IOS должна вставить новый фрагмент в начало распределенного буфера, после того как его части логически связаны. В связи с небольшим размером добавляемых данных используются фрагменты из пула быстрой коммутации.

В примере 5.1 показана информация, выводимая командой show buffers. Приведенный результат содержит информацию об общих и о локальных буферах; созданных системой 10S. Пул быстрой коммутации помечен символом F/S.


Слияние фрагментов

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

В методах быстрой коммутации для большинства, протоколов реализованы функции, которые позволяют обрабатывать распределенные буферы, а программная коммутация не имеет таких функций. Считается, что метод программной коммутации имеет мало преимуществ и сложность его реализации достаточно велика, поэтому корпорация Cisco решила отказаться от поддержки такой технологии· для распределенных буферов. Для программной коммутации пакеты должны располагаться в непрерывных буферах. Поэтому фрагментированные пакеты, которые находятся в очереди такой технологии коммутации, должны быть преобразованы в непрерывные буферы. Процесс преобразования фрагментов называется слиянием.

По своей сути слияние — это последовательное копирование содержимого всех фрагментов в один непрерывный буфер соответствующего размера. В зависимости от платформы данный процесс выполняется или главным процессором, или отдельным модулем с прямым доступом к памяти

(Direct Memory Access — DMA). Процесс слияния осуществляется в четыре этапа, которые приведены ниже:

    • Этап 1. Система IOS выделяет непрерывный буфер нужного размера в одном из системных буферных пулов. Непрерывный буфер должен вмешать целый пакет, иначе слияние не может быть выполнено.

    • Этап 2. Система IOS копирует данные из каждого фрагмента пакета в новый непрерывный буфер.

    • Этап 3. Операционная система освобождает все фрагменты и возвращает их в исходный пул.

    • Этап 4. В завершение система IOS разъединяет заголовок пакета и освобожденные фрагменты и присоединяет его к новому непрерывному буферу.

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

Для понимания того, как распределенные буферы используются в операционной системе IOS, необходимо рассмотреть пример их реализации. В следующем разделе приведен пример использования фрагментарных пакетных буферов в маршрутизаторах Cisco 7200. Именно для данной серии устройств впервые начали использоваться фрагменты.