Dummynet - привязка процесса к CPU0

Версия для печатиОтправить другуPDF version

Разбирался на днях с производительностью сервера, который работал в роли маршрутизатора.

Итак, что мы имеем в роли операционной системы:

# uname -rmo
FreeBSD 8.4-RELEASE-p7 amd64

Да, давно систему не обновляли... Ну и ладно.

В ходе диагностики обнаружил одну странность. Процесс dummynet потреблял слишком много ресурсов. Согласно выводу top:

    0 root       -68    0     0K   416K -       2 272:36 24.45% kernel{dummynet}

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

На сетевых форумах уже стыкался с данной проблемой. Дело в том, что в 8-ой ветке FreeBSD, по умолчанию, системный тред dummynet, как и большинство других тредов, не привязан к конкретному CPU. Соответственно, планировщик перемещает его между ядрами процессора. А вот если "привязать" системный тред dummynet к CPU0, потребление ресурсов процессора тут же падает, при этом корректно выполняя все свои функции и задания.

Ну что ж, воспользуемся советом и привяжем процесс к CPU0. Но не тут то было. Поскольку процесс системный, его PID равен 0. Необходимо узнать TID процесса, и уже его "привязывать":

# procstat -at | grep dummynet
    0 100098 kernel           dummynet           1   16 sleep   -

TID процесса в моем конкретном случае - 100098. Вот его и нужно привязать, воспользовавшись возможностями утилиты cpuset.

Чтобы в дальнейшем "облегчить себе жизнь", набросаем небольшой скрипт cpuset_dummynet.sh следующего содержания:

#!/bin/sh

AWK=/usr/bin/awk
CPUSET=/usr/bin/cpuset
GREP=/usr/bin/grep
PROCSTAT=/usr/bin/procstat

PROCESS=dummynet

TID=`$PROCSTAT -at | $GREP $PROCESS |$AWK '"/$PROCESS/" {print $2}'`
$CPUSET -l 0 -t $TID

После запуска скрипта, проверяем, что процесс dummynet действительно "привязан" к CPU0:

# procstat -at | grep dummynet
    0 100098 kernel           dummynet           0   16 sleep   -

Проверяем нагрузку:

0 root       -68    0     0K   416K -       0 279:33  0.00% kernel{dummynet}

Последний штрих - прописать запуск скрипта в rc.local для автоматического запуска после перезагрузки системы.

Ваша оценка: Нет Средняя: 5 (1 голос)

Re: Dummynet - привязка процесса к CPU0

Интересно, таким образом можно ли повлиять на другие приложения, например squid?

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература