Узкие места сетевой подсистемы Linux. Тюнинг сети в Linux. Настройка производительности сети в модели NAPI и с прерываниями.

Узкие места сетевой подсистемы Linux. Тюнинг сети в Linux. Настройка производительности сети в модели NAPI и с прерываниями.

Кольцевой буфер

Кольцевые буферы, совместно используются драйвером устройства и сетевой картой. TX – есть передача данных, а RX – получение данных в кольцевом буфере. Как следует из названия, переполнение буфера просто перезаписывает существующие данные. Есть два способа переместить данные от сетевой карты до ядра: аппаратные прерывания и программные прерывания, названные SoftIRQs.

Кольцевой буфер RX используется, чтобы сохранить входящие пакеты, пока они не могут быть обработаны драйвером устройства. Драйвер устройства опустошает буфер RX, обычно через SoftIRQs, который помещает входящие пакеты в структуру данных ядра, названную sk_buff или «skb», чтобы начать свой путь через ядро и до приложения, которому принадлежит соответствующий сокет. Кольцевой буфер TX используется для хранения исходящих пакетов, которые предназначенные для отправки по проводам.

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

Прерывания и обработчики прерываний

Прерывания от аппаратных средств известны как прерывания «top-half».

Сетевые карты, как правило, работают с кольцевыми буферами (DMA ring buffer) организованными в памяти, разделяемой с процессором. Каждый входящий пакет размещается в следующем доступном буфере кольца. (DMA - Direct Memory Access (Прямой доступ к памяти) — режим обмена данными между устройствами или же между устройством и основной памятью, в котором центральный процессор (ЦП) не участвует). После этого требуется сообщить системе о появлении нового пакета и передать данные дальше, в специально выделенный буфер (Linux выделяет такие буферы для каждого пакета). Для этой цели в Linux используется механизм прерываний: прерывание генерируется всякий раз, когда новый пакет поступает в систему. Чаще используется отложенные прерывания (см. в статье Linux, принципы работы с сетевой подсистемой ). В ядро Linux начиная с версии ядра 2.6 был добавлен так называемый NAPI (New API), в котором метод прерываний сочетается с методом опроса. Сначала сетевая карта работает в режиме прерываний, но как только пакет поступает на сетевой интерфейс, она регистрирует себя в poll-списке и отключает прерывания. Система периодически проверяет список на наличие новых устройств и забирает пакеты для дальнейшей обработки. Как только пакеты обработаны, карта будет удалена из списка, а прерывания включатся снова.

Подробнее: Узкие места сетевой подсистемы Linux. Тюнинг сети в Linux. Настройка производительности сети в...

Linux, принципы работы с сетевой подсистемой

Сетевая подсистема Linux

Сетевая модель TCP/IP условно согласуется с 7-ми уровневой моделью OSI. На платформе Linux сложилась следующая терминология разделения на подуровни, которой пользуются разработчики ядра:

  • Всё, что относится к поддержке оборудования и канальному уровню, описывается как сетевые интерфейсы и обозначается как L2 (обычно тут у нас Ethernet);
  • Протоколы сетевого уровня OSI (IP, IPX, RIP и т.д.) - как сетевой уровень стека протоколов или уровень L3;
  • Всё, что выше (ICMP, UDP, TCP, SCTP и т.д.) - как протоколы транспортного уровня или уровень L4;
  • Всё то, что относится к выше лежащим уровням (сеансовый, представительский, прикладной) модели OSI (например: SSH, SIP, RTP, HTTP, FTP и т.д.), не проявляется в ядре и относится уже к области клиентских и серверных утилит пространства пользователя.

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

Подробнее: Linux, принципы работы с сетевой подсистемой

Схема работы DNSSEC

DNSSEC — технология, которая позволяет удостоверяться в подлинности DNS информации при помощи криптографической подписи.

Максимально упрощенно это выглядит примерно так:

имеется корневая зона ".", которая содержит в себе информацию о всех доменах первого уровня. 
Условно говоря, это файл с множеством строк, который изменяется достаточно редко. Создается пара открытый+закрытый ключ и каждая запись в этом файле подписывается.
Имея открытый ключ от этой пары, можно удостовериться в подлинности каждой записи в этом списке. Например, проверить что за зону moscow. действительно отвечают сервера flexireg:
dig -t any +dnssec @k.root-servers.net moscow.
В ответе можно увидеть запись RRSIG содержащую хеш-подпись:

Подробнее: Схема работы DNSSEC

Если Linux сервер не перезагружается командой

Иногда возникает ситуация, когда при попытке ребутнуть Linux сервер стандартной командой reboot (shutdown) ничего не происходит, то есть команды просто висят в процессах, а сервер не ребутается.

Такое бывает в случаях, когда отказывает диск или глючит RAID контроллер.

Для принудительной перезагрузки сервера воспользуемся sysrq. SysRq клавиши - это особые сочетания клавиш, нажатие которых отслеживается ядром и приводит к определённым действиям со стороны ядра.

Для начала включаем sysrq через proc:

echo 1 > /proc/sys/kernel/sysrq

Далее посылаем нужную команду в sysrq триггер:

echo b > /proc/sysrq-trigger

И сервер мгновенно уходит на перезагрузку.

 

 

Как распарсить JSON

В этой статье я покажу как можно распарсить JSON вывод с помощью простых команд Linux. Т.е. без применения языков программирования.

В Linux есть утилита jq, которая умеет парсить JSON формат. С её помощью можно парсить, фильтровать, сопоставлять и преобразовывать json-данные без усилий.

Установка в Debian:

$sudo apt-get install jq

Всё, установили. Начинаем парсить JSON.

Допустим у нас есть такой документ:

{ "cgi_json_version": "1.9.0",

"icinga_status": {

"status_data_age": 30,

Подробнее: Как распарсить JSON

Страница 3 из 7

unix-way