воскресенье, 3 августа 2014 г.

Основы регулировки производительности маршрутизатора Cisco

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

Базовые сведения

На эффективность обработки пакетов могут влиять настройки маршрутизатора. В случае маршрутизаторов, обрабатывающих большие объемы трафика, в целях оптимизации производительности стоит знать, какое действие выполняет устройство, как оно это делает и сколько времени это у него займет. Эти сведения представлены в файле конфигурации. Конфигурация отражает способ прохода пакетов через маршрутизатор. Не совсем оптимальная конфигурация может удерживать пакет в маршрутизаторе дольше, чем это необходимо. Продолжительный и высокий уровень загрузки маршрутизатора может привести к задержке ответов, перегрузке сети и увеличению времени ожидания подключения.
Основной целью настройки маршрутизатора является минимизация времени пребывания пакета в маршрутизаторе. То есть сведение к минимуму периода времени, необходимого маршрутизатору для пересылки пакета с входящего на исходящий интерфейс, а также, по возможности, устранение буферизации и перегрузки. Каждая настраиваемая функция в конфигурации должна способствовать быстрейшему достижению входящим пакетом порта назначения.
Время использования процессора и память — это два основных ресурса, за состоянием которых необходимо следить. Процессор маршрутизатора всегда должен быть доступен для обработки задач при пиковой и обычной нагрузке. Любая загрузка процессора на 99% в течение длительного времени может серьезно повлиять на стабильность работы сети. Тот же принцип применим и для доступности памяти — память должна быть всегда доступна. Если память маршрутизатора использована почти полностью, то свободного пространства в системных буферных пулах нет. Это означает, что пакеты, которым необходима обработка со стороны процессора (перенаправляемые пакеты), сбрасываются сразу же после поступления на маршрутизатор. Легко представить, что бы случилось, если бы сбрасываемые пакеты содержали параметры активного интерфейса или важные обновления маршрута.

Коммутация на уровне обработки и уровне прерывания

В IP-сетях решения о пересылках в маршрутизаторах принимаются на основе содержимого таблицы маршрутизации. При поиске в таблице маршрутизации маршрутизатор ищет самое длинное совпадение для префикса IP-адреса узла назначения. Это осуществляется "на уровне обработки" (т.н. коммутация на уровне обработки), то есть поиск является просто одним из процессов, поставленных в очередь для обработки процессором. В результате время поиска становится непредсказуемым и поиск может продолжаться очень долго. Для решения этой проблемы операционная система Cisco IOS располагает целым рядом методов коммутации, основанных на поиске точного соответствия.
Основное преимущество поиска точного соответствия состоит в том, что время поиска является детерминированным и очень коротким. Время, необходимое маршрутизатору для принятия решения о пересылке, значительно уменьшено, что позволяет выполнить это на "уровне прерывания". Коммутация на уровне прерывания означает, что при прибытии пакета инициируется прерывание, по которому процессор приостанавливает выполнение остальных задач и выполняет обработку пакета. Традиционный метод для пересылки пакетов (поиск наибольшего совпадения в таблице маршрутизации) невозможно применить на уровне прерываний, поэтому его необходимо использовать на уровне обработки. По ряду причин, некоторые из которых рассмотрены ниже, невозможно полностью отказаться от метода поиска самого длинного совпадения, поэтому эти два метода поиска сосуществуют в маршрутизаторах Cisco. Эта стратегия обобщена и применяется к протоколам IPX и AppleTalk.
Для выполнения поиска точного соответствия на уровне прерывания таблица маршрутизации должна быть преобразована, чтобы использовать структуру памяти, удобную для этого типа поиска. Различные пути маршрутизации используют различную структуру памяти. Архитектура этой так называемой структуры существенно влияет на время поиска, превращая выбор наиболее подходящего пути маршрутизации в очень важную задачу. Для принятия маршрутизатором решения о перенаправлении пакета необходимы (как минимум) сведения об адресе следующего узла и исходящем интерфейсе. Кроме того, необходимы сведения об инкапсуляции исходящего интерфейса. В зависимости от масштабируемости, сведения об инкапсуляции исходящего интерфейса могут храниться в той же самой или отдельной структуре памяти.
Следующая процедура предназначена для выполнения коммутации на уровне прерываний:
  1. Просмотрите структуру памяти для того, чтобы определить адрес следующего узла и исходящий интерфейс.
  2. Выполните перезапись на втором уровне модели взаимодействия открытых систем (OSI), также называемой MAC-перезаписью, которая означает изменение инкапсуляции пакета для согласования с исходящим интерфейсом.
  3. Поместите пакет в кольцо передачи или в очередь исходящего интерфейса.
  4. Обновите подходящие структуры памяти (сбросьте таймеры в кэше, обновите счетчики и т.д.).
Прерывание, которое возникло при приеме пакета от сетевого интерфейса, называется "RX interrupt". Подача этого сигнала прерывания прекращается, только когда выполнены все вышеизложенные инструкции. Если хотя бы один из трех вышеизложенных пунктов не может быть выполнен, то пакет пересылается на следующий уровень коммутации. Если следующий уровень коммутации является уровнем коммутации на уровне обработки, то пакет помещается во входную очередь входящего интерфейса для коммутации на уровне обработки, а подача сигнала прерывания прекращается. Так как подача прерываний не может быть прекращена прерываниями того же уровня, а все интерфейсы вызывают прерывания того же уровня, то ни один пакет не может быть обработан до прекращения подачи текущего прерывания RX.
Различающиеся пути маршрутизации прерывания могут быть организованы в иерархическую структуру, позволяющую изменять скорость поиска от самой быстрой до самой медленной. Последней пересортировкой, используемой для обработки пакетов, всегда является коммутация на уровне обработки. Не все интерфейсы и типы пакетов поддерживаются в каждом пути маршрутизации прерывания. В общем случае, только те из них, которые требуют анализа и изменений, ограниченных заголовком пакета, могут быть коммутируемы при прерывании. Коммутация на уровне прерываний будет невозможна, если перед пересылкой необходим анализ полезной информации пакетов. Для некоторых путей маршрутизации прерывания могут существовать особые ограничения. Кроме того, если подключение второго уровня через исходящий интерфейс должно быть надежным (именно поэтому это подключение включает в себя поддержку возможности повторной передачи), то пакеты не могут обрабатываться на уровне прерывания.
Примерами пакетов, для которых не может использоваться коммутация на уровне прерываний, являются следующие пакеты:
  • Трафик, направляемый на маршрутизатор (трафик протокола маршрутизации, простой протокол сетевого управления (SNMP-протокол), Telnet, TFTP-протокол, команда ping и т.д.). Управляющий трафик может быть исходной точкой и направляться на маршрутизатор. Пакеты такого типа содержат информацию о процессах, относящихся к отдельным задачам;
  • Ориентированные на подключение инкапсуляции второго уровня модели OSI (например, стандарт X.25). Некоторые задачи слишком сложны для кодирования в путь с коммутацией на уровне прерываний, так как содержат слишком много исполняемых инструкций или требуют большого количества таймеров и окон. Примером этого являются функция шифрования, трансляция LAT-протокола и протокол Data-Link Switching Plus (DLSW+).

Пути маршрутизации

Путь прохождения пакета внутри маршрутизатора определяется активным алгоритмом пересылки. Их также называют "алгоритмами коммутации" или "путями маршрутизации". Профессиональные платформы обычно используют более мощные алгоритмы пересылки по сравнению с платформами более низкого класса, однако зачастую они не активизируются по умолчанию. Алгоритмы пересылки могут реализовываться с помощью аппаратных средств, программного обеспечения или с помощью как того, так и другого, но их целью всегда является отправка пакетов за минимально возможное время.
В маршрутизаторах Cisco доступны следующие алгоритмы коммутации:
Алгоритм пересылкиКоманда (подается в режиме настройки интерфейса)
Быстрая коммутацияip route-cache
Коммутация одного интерфейсаip route-cache same-interface
Автономная коммутация (только для платформ серии 7000)ip route-cache cbus
Полупроводниковая коммутация (только для платформ серии 7000 с установленной поддержкой SSP-протокола)ip route-cache sse
Распределенная коммутация (только для VIP-совместимых платформ)ip route-cache distributed
Оптимальная коммутация (только для профессиональных моделей маршрутизаторов)ip route-cache optimum
Коммутация NetFlowip route-cache flow
CEF-коммутация (Cisco Express Forwarding)ip cef
Распределенная CEF-коммутацияip cef distributed










Далее приведем краткое описание каждого алгоритма пересылки пути маршрутизации в зависимости от производительности. Автономная коммутация и полупроводниковая коммутация не рассматриваются, поскольку они относятся к технологиям с использованием аппаратных средств.

Коммутация на уровне обработки

Коммутация на уровне обработки — наиболее простой метод обработки пакетов. Пакет помещается в очередь, относящуюся к протоколу третьего уровня, а затем соответствующий процесс обрабатывается планировщиком. Этот процесс является одним из процессов, которые отображаются в результате выполнения команды show processes cpu (а именно, "ip input" для IP-пакета). На этом этапе пакет остается в очереди до тех пор, пока планировщик предоставляет соответствующему процессу ресурсы процессора. Время ожидания зависит от количества процессов, которые ожидают выполнения, а также от количества пакетов, которые необходимо обработать. Затем на основе таблицы маршрутизации принимается решение о маршрутизации. Инкапсуляция пакета изменяется для согласования с исходящим интерфейсом, а пакет помещается в исходящую очередь соответствующего исходящего интерфейса.

Быстрая коммутация

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

Оптимальная коммутация

Оптимальная коммутация аналогична быстрой коммутации, но для нее используется многомерное дерево с 256 путями (mtree) вместо двоичного, что означает большую нагрузку на память и необходимость более быстрого поиска в кэше.

CEF-маршрутизация

cn060311_alt
Основные недостатки предыдущих алгоритмов коммутации заключаются в следующем:
  1. Первый пакет для конкретного адресата всегда коммутируется процессом, чтобы инициализировать быстрое кэширование.
  2. Быстрый кэш может стать очень большим. Например, если к одной и той же сети имеются несколько маршрутов с одинаковой затратностью, то быстрый кэш наполняется записями об узлах, а не записями о сети, как было описано выше.
  3. Не существует прямой связи между быстрым кэшем и таблицей протокола разрешения адресов (ARP-таблица). Если в ARP-кэше запись становится неверной, то в быстром кэше не существует способа объявления ее недействительной. Чтобы избежать этой проблемы, необходимо каждую минуту произвольным образом сбрасывать 1/20-ую часть записей кэша. Сбрасывание записей и перезагрузка кэша могут значительно повысить нагрузку на процессор в очень больших сетях.
CEF-маршрутизация решает эти проблемы с помощью двух таблиц: таблицы FIB (база данных для пересылки) и таблицы смежности. Таблица смежности индексируется с помощью адресов третьего уровня и содержит соответствующие данные второго уровня, необходимые для пересылки пакета. Она заполняется, когда маршрутизатор обнаруживает соседние узлы сети. Таблица FIB - это mtree, индексированное по адресам третьего уровня. Эта таблица создана на основе таблицы маршрутизации и указывает на таблицу смежности.
Еще одно преимущество CEF-маршрутизации заключается в том, что структура базы данных позволяет распределять нагрузку для каждого узла назначения или для каждого пакета.

Распределенная быстрая/оптимальная коммутация

Распределенная быстрая/оптимальная коммутация снимает нагрузку с процессора (процессор маршрутизации и коммутации [RSP]) благодаря тому, что решение о маршрутизации принимают процессоры интерфейсов (IP). Это возможно только на профессиональных платформах, которые могут иметь выделенные процессоры на каждом интерфейсе (многоцелевые интерфейсные процессоры [VIP], линейные платы [LC]). В этом случае быстрый кэш просто выгружается в VIP. При получении пакета VIP пытается принять решение о маршрутизации на основе этой таблицы. Если это удается, то пакет непосредственно ставится в очередь исходящего интерфейса. При отказе пакет ставится в очередь на следующий настраиваемый путь коммутации (оптимальная коммутация -> быстрая коммутация -> коммутация на уровне обработки).
При использовании распределенной коммутации списки контроля доступа копируются в VIP, а это значит, что VIP может проверить пакет на присутствие в списке управления доступом без вмешательства RSP.

Распределенная CEF-коммутация

Распределенная CEF-коммутация (dCEF-коммутация) похожа на распределенную коммутацию, но при этом существуют несколько проблем синхронизации между таблицами. dCEF-коммутация является единственным распределенным методом коммутации, доступным в операционной системе Cisco IOS версии 12.0. Важно знать, что если распределенная коммутация разрешена на маршрутизаторе, то таблицы FIB/смежности выгружаются на все VIP в маршрутизаторе вне зависимости от CEF/dCEF-настройки интерфейса.
С помощью dCEF-коммутации VIP также обрабатывает списки контроля доступа, данные маршрутизации на основе политик и правила скорости передачи, которые все содержатся в VIP-карте. Netflow можно использовать совместно с dCEF для улучшения обработки списка управления доступом процессорами VIP.
В нижеприведенной таблице для каждой платформы показано, какой путь маршрутизации поддерживается различными версиями операционной системы Cisco IOS.
Путь маршрутизацииСамые простые модели (1)Cредние
модели (2)
Cisco AS5850Cisco 7000 w/RSPCisco 72xx/
71xx
Cisco 75xxCisco GSR 12xxxКомментарии
Коммутация на уровне обработкиВСЕВСЕВСЕВСЕВСЕВСЕНЕТИнициализирует кэш коммутации
FastНЕТВСЕВСЕВСЕВСЕВСЕНЕТПо умолчанию для всех за исключением
IP для профессиональных
моделей
Оптимальная коммутацияНЕТНЕТНЕТВСЕВСЕВСЕНЕТПо умолчанию для профессиональных
моделей
для IP до версии 12.0
Коммутация Netflow (3)НЕТ12.0(2), 12.0T& 12.0SВСЕ11.1CA, 11.1CC, 11.2, 11.2P, 11.3, 11.3T, 12.0, 12.0T, 12.0S11.1CA, 11.1CC, 11.2, 11.2P, 11.3, 11.3T, 12.0, 12.0T, 12.0S11.1CA, 11.1CC, 11.2, 11.2P, 11.3, 11.3T, 12.0, 12.0T, 12.0S12.0(6)S 
Распределенная оптимальная коммутацияНЕТНЕТНЕТНЕТНЕТ11.1, 11.1CC, 11.1CA, 11.2, 11.2P, 11.3 & 11.3TНЕТИспользуя
VIP2-20,40,50 Отсутствует с версии 12.0.
CEF-коммутацияНЕТ12.0(5)TВСЕ11.1CC, 12.0 & 12.0x11.1CC, 12.0 & 12.0x11.1CC, 12.0 & 12.0xНЕТПо умолчаниюдля профессиональныхмоделей для IP начиная с версии 12.0
dCEF-коммутацияНЕТНЕТВСЕНетНЕТ11.1CC, 12.0 & 12.0x11.1CC, 12.0 & 12.0xТолько на 75xx+VIP
и на GSR
(1) Включает модели с 801 по 805.
(2) Включает модели 806 и выше, серии 1000, 1400, 1600, 1700, 2600, 3600, 3700, 4000, AS5300, AS5350, AS5400 и AS5800.
(3) Поддержка NetFlow Export версий 1, 5 и 8 на платформах 1400, 1600 и 2500 предназначена для операционной системы Cisco IOS версии 12.0
(4)T. Поддержка NetFlow для этих платформ не доступна в операционной системе Cisco IOS основной версии 12.0.

Коммутация NetFlow

Коммутация NetFlow (в данном случае) — неправильное употребление термина, усугубленное тем фактом, что она настраивается так же, как и путь маршрутизации. Фактически, коммутация NetFlow не является путём маршрутизации, так как NetFlow-кэш не содержит или не указывает на данные, необходимые для перезаписи второго уровня. Решение о коммутации должно быть принято с помощью активного пути маршрутизации.
При NetFlow-коммутации маршрутизатор классифицирует трафик в каждом потоке. Поток — это однонаправленная последовательность пакетов между заданным источником и конечными узлами сети. Для определения потока маршрутизатор использует адреса отправителя и получателя, номера портов транспортного уровня, тип IP-протокола, тип обслуживания (ToS) и исходный интерфейс. Этот способ классификации трафика позволяет маршрутизатору срабатывать только первый пакет потока при работе с такими ресурсоемкими объектами, как большие списки контроля доступа, очереди, политики учета, биллинговые системы и т.п

Распределенные службы

Профессиональные платформы позволяют передавать несколько задач с высокой загрузкой процессора (не только алгоритмы коммутации пакетов) от главного процессора на распределенные процессоры, например на процессоры плат VIP (7500). Некоторые из данных задач могут быть переданы от универсального процессора на конкретные адаптеры порта или сетевые модули, на которых реализованы функции выделенного аппаратного обеспечения.
Обычно, по возможности, задачи передают от главного процессора VIP-процессорам. Это высвобождает ресурсы и увеличивает производительность маршрутизатора. Некоторые процессы, которые можно перенести — сжатие пакетов, шифрование пакетов и справедливая постановка в очередь на основе весов. Дополнительные сведения о задачах, которые можно разгрузить, см. в нижеследующей таблице.
Служба
Функции
Стандартная коммутацияCisco Express Forwarding IP фрагментация Fast EtherChannel
VPNСписки контроля доступа — расширенный и быстрый режим Cisco шифрование Общая трассировка инкапсуляции (GRE) туннели IP безопасности (IPSec) Туннели протокола L2TP второго уровня
QoSNBAR формирование трафика (dTS) Политики (CAR) Предотвращение перегрузок (dWRED) Гарантированная минимальная пропускная способность (dCBWFQ) Распространение политики через политику маршрутизации BGPh
МногофункциональностьМалая задержка постановки в очередь FRF 11/12 RTP сжатие заголовка Многоканальный PPP-протокол с фрагментацией и чередованием канала
Ведение учетаУчет выходных данных приоритета экспорта NetFlow и учет MAC-адресов
Регулировка нагрузки маршрутизатораМногоканальный протокол двухточечного соединения распределения нагрузки CEF
КэшированиеWCCP V1 WCCP V2
СжатиеL2 SW и HW сжатие L3 SW и HW сжатие
Многоадресная маршрутизацияМногоадресная распределенная коммутация

Выбор пути коммутации

Основное правило состоит в том, что следует выбирать наилучший из доступных коммутируемых путей (от самого быстрого к самому медленному): dCEF, CEF, оптимальный и быстрый. Разрешение использовать CEF или dSEF дает наилучшие характеристики. Разрешение использовать коммутацию NetFlow позволяет увеличивать или уменьшать производительность в зависимости от выбранных настроек. Если списки контроля доступа очень большие, или если требуется ведение некоторого учета, или и то и другое, то рекомендуется использовать коммутацию NetFlow. Обычно NetFlow разрешается использовать на оконечных коммутаторах, обладающих достаточной мощностью центрального процессора и использующих множество функций. Если в одном интерфейсе настроено несколько путей коммутации (например, пути быстрой коммутации и CEF), то маршрутизатор будет последовательно пытаться использовать все настроенные пути, начиная с наилучшего — (CEF) и заканчивая наихудшим — коммутацией на уровне обработки.

Текущий контроль маршрутизатора

Для проверки эффективности использования путей маршрутизации и уровней загрузки маршрутизаторов используйте следующие команды.
show ip interfaces: эта команда предоставляет обзор коммутируемого маршрута, примененного к конкретному интерфейсу.
Router#show ip interfaces
Ethernet0/0 is up, line protocol is up
Internet address is 10.200.40.23/22
Broadcast address is 255.255.255.255
Address determined by setup command
MTU is 1500 bytes
Helper address is not set
Directed broadcast forwarding is disabled
Outgoing access list is not set
Inbound access list is not set
Proxy ARP is enabled
Security level is default
Split horizon is enabled
ICMP redirects are always sent
ICMP unreachables are always sent
ICMP mask replies are never sent
IP fast switching is enabled
IP fast switching on the same interface is disabled
IP Flow switching is disabled
IP CEF switching is enabled

IP Fast switching turbo vector
IP Normal CEF switching turbo vector
IP multicast fast switching is enabled
IP multicast distributed fast switching is disabled
IP route-cache flags are Fast, CEF
Router Discovery is disabled
IP output packet accounting is disabled
IP access violation accounting is disabled
TCP/IP header compression is disabled
RTP/IP header compression is disabled
Probe proxy name replies are disabled
Policy routing is disabled
Network address translation is disabled
WCCP Redirect outbound is disabled
WCCP Redirect inbound is disabled
WCCP Redirect exclude is disabled
BGP Policy Mapping is disabled
Из вышеприведенного результата выполнения команды можно видеть, что быстрая коммутация и коммутация CEF разрешены, а коммутация NetFlow отключена.
show processes cpu: эта команда отображает полезные сведения о загрузке процессора.
Router#show processes cpu
CPU utilization for five seconds: 0%/0%; one minute: 0%; five minutes: 0%
PIDInvokedRuntime(ms)uSecs5Sec1Min5MinTTYProcess
12839665300.00%0.00%0.00%0Load Meter
266133040200.00%0.00%0.00%0CEF Scanner
363574707194890.00%0.00%0.00%0Exec
4134392823472057250.32%0.08%0.06%0Check heaps
50100.00%0.00%0.00%0Chunk Manager
620540000.00%0.00%0.00%0Pool Manager
702 0.00%0.00%0.00%0Timers
81007296952414480.00%0.00%0.00%0Serial Backgroun
92366608030.00%0.00%0.00%0Environmental mo
10945972455053850.00%0.00%0.00%0ARP Input
110200.00%0.00%0.00%0DDR Timers
120200.00%0.00%0.00%0Dialer event
138240000.00%0.00%0.00%0Entity MIB API
140100.00%0.00%0.00%0SERIAL A'detect
150100.00%0.00%0.00%0Critical Bkgnd
161301084738092740.00%0.00%0.00%0Net Background
178327240.00%0.00%0.00%0Logger
18573198004400.00%0.00%0.00%0TTY Background
[...]        
show memory summary: первые строки, отображаемые в результате выполнения этой команды, дают полезную информацию об использовании памяти маршрутизатора и о памяти/буфере.
Router#show memory summary
 HeadTotal(b)Used(b)Free(b)Lowest(b)Largest(b)
Processor8165B63C69657004060804290489628111882884112
I/O1D0000031457281770488137524013332641375196
[...]      
show interfaces stat и show interfaces switching: эти две команды показывают, какой путь использует маршрутизатор и как коммутируется трафик.
Router#show interfaces stat
Ethernet0     
 Switching pathPkts InChars InPkts OutChars Out
 Processor5207712245489246463170041
 Route cache0000
 Distributed cache0000
 Total5207712245489246463170041
Router#show interfaces switching
Ethernet0    
 Throttle count0  
DropsRP0SP0
SPD FlushesFast0SSE0
SPD AggressFast0  
SPD PriorityInputs0Drops0
ProtocolPathPkts InChars InPkts OutChars Out
OtherProcess0059535700
 Cache misses0   
 Fast0000
 Auton/SSE0000
IPProcess44564456
 Cache misses0   
 Fast0000
 Auton/SSE0000
IPXProcess002120
 Cache misses0   
 Fast0000
 Auton/SSE0000
Trans. BridgeProcess0000
 Cache misses0   
 Fast1166000
 Auton/SSE0000
DEC MOPProcess0010770
 Cache misses0   
 Fast0000
 Auton/SSE0000
ARPProcess1602120
 Cache misses0   
 Fast0000
 Auton/SSE0000
CDPProcess2006370010031183
 Cache misses0   
 Fast0000
 Auton/SSE0000
Источник: blogsvazista.ru/osnovi-regulirovki-proizvoditelnosti-cisco/

Комментариев нет:

Отправить комментарий