Назад | Перейти на главную страницу

Контроль пропускной способности lxc с использованием tc

Я пытаюсь ограничить пропускную способность внутри своих контейнеров. Я пробовал использовать следующие команды, но думаю, что это не дает результата.

cd /sys/fs/cgroup/net_cls/
echo 0x1001 > A/net_cls.classid   # 10:1
echo 0x1002 > B/net_cls.classid   # 10:2
tc qdisc add dev eth0 root \
           handle 10: htb
tc class add dev eth0 parent 10: \
           classid 10:1 htb rate 40mbit
tc class add dev eth0 parent 10: \
           classid 10:2 htb rate 30mbit
tc filter add dev eth0 parent 10: \
           protocol ip prio 10 \
           handle 1: cgroup

Здесь A и B - это контейнеры, созданные с помощью этой команды.

lxc-execute -n A -f configfile /bin/bash
lxc-execute -n B -f configfile /bin/bash

В то время как файл конфигурации содержит только эту запись:

lxc.utsname = test_lxc

После запуска контейнера я запустил vsftpd внутри контейнера A и пытаюсь получить доступ к файлам с помощью ftp-клиента с другого компьютера. Затем я убил vsftpd в контейнере A и запустил vsftpd в контейнере B и попытался получить доступ к файлам с помощью ftp-клиента с другой машины.

Никакой разницы в производительности я не наблюдаю, если уж на то пошло, она не ближе к 40/30 Мбит.

Пожалуйста, поправьте меня, есть ли здесь что-нибудь не так.

Проблема здесь плохо документирована, но я уже сталкивался с ней раньше. В 64-битных системах отображаемое вами значение будет не представлен как 16-битное целое, но 32-битное целое число.

Попробуйте заменить:

echo 0x1001 > A/net_cls.classid   # 10:1
echo 0x1002 > B/net_cls.classid   # 10:2

С участием

echo 0x00100001 > A/net_cls.classid   # 10:1
echo 0x00100002 > B/net_cls.classid   # 10:2

Это должно решить вашу проблему.

Примечание: На самом деле нет необходимости вводить ведущие нули в начале, но для ясности я добавил их.

Многие из контейнеров без гипервизора (lxc, jails), как правило, имеют изворотливое / неполное измерение (disk iops, net), которое влияет на другие контейнеры. Если ограничение внешнего транзита является основной проблемой, сначала установите прозрачный брандмауэр (например, ArmorLogic, Barracuda и т. Д.) Перед ними.

В любом случае, обязательно проведите нагрузочный тест, чтобы увидеть, имеет ли это значение.

(Подсказка: Heroku запускает LXC. heroku run bash)