В статье о регулировании прохождения пакетов в сети Daniel Berrange описывает интересный опыт тестирования AutoFS. Попытки получить доступ к ресурсам в Бостоне, предпринимаемые из Лондона, заканчивались неудачей в 25% процентах случаев. Еще более обескураживающими были результаты монтирования ресурсов в Лос-Анжелесе: осечка во всех экспериментах.
Даниел выяснил, что причиной такого поведения был кусок кода, в котором “живучесть” удаленного сервера оценивалась по результатам RPC ping с тайм-аутом 100 mc. Время прохождения пакетов между Лондоном и Бостоном составляло 100+/-5mc, что объясняло случающиеся время от времени неудачные попытки монтирования.
Увеличить временной интервал было несложным делом, но Даниел задумался, как организовать надежное тестирование системы в подобных случаях. Ниже описывается способ, предложенный Даниелом (с небольшими добавлениями и комментариями на примере RHEL AS 4).
Задержка пакетов выполняется на основе iptables. В состав iptables входит библиотека libipq, которая позволяет организовать очередь пакетов (с помощью модуля ядра ip_queue) и регулировать задержку их передачи по назначению. Для libipq есть Perl-модуль IPQueue.pm, упрощающий работу с этой библиотекой. Псевдо-код для реализации задержки пакетов выглядит так:
forever foreach queued packet if queue time > requested delay accept packet wait for an incoming packet add packet to queue
Вот последовательность шагов в реализации этого алгоритма:
1. установить iptables-devel. В случае Red Hat Enterprise Linux AS release 4 Nahant Update 3 это iptables-devel-1.2.11-3.1.rhel4.i386.rpm
2. загрузить необходимые модули ядра (не забыть организовать их автоподключение в случае возможного reboot’a системы):
modprobe iptable_filter
modprobe ip_queue
modprobe ipt_ttl
3. установить perlipq и Time-HiRes
4. запустить Perl-демон delay.pl:
./delay-net.pl 300 > /dev/null
(здесь 300 - период задержки в mc)
5. прописать правило в iptables:
iptables -A INPUT –source 192.168.16.4 -j QUEUE
Пакеты, приходящие с адреса 192.168.16.4, будут передаваться в очередь QUEUE. Демон delay.pl регулирует время их задержки, что легко проверить, выполнив ping с адреса 192.168.16.4 на машину с реализованной задержкой пакетов.
Усложним задачу. Что если мы хотим организовать задержку пакетов между двумя Windows-машинами, на которых работает клиент-серверное приложение? Задействуем Linux-хост в качестве роутера:
1. разрешим перенаправление пакетов на Linux. В /etc/sysctl.conf пропишем:
net.ipv4.ip_forward = 1
и выполним:
sysctl -p
2. на Linux-хосте (192.168.16.3): пакеты, адресованные Windows-станциям (192.168.16.8 и 192.168.16.7), отдавать в очередь QUEUE:
iptables -A FORWARD –destination 192.168.16.8 -j QUEUE
iptables -A FORWARD –destination 192.168.16.7 -j QUEUE
3. на Windows-станциях добавим правила в таблицу маршрутов:
- на первой машине (192.168.16.8): все пакеты, адресованные второй Windows-станции (192.168.16.7), перенаправлять Linux-хосту (192.168.16.3)
route ADD 192.168.16.7 192.168.16.3
- на второй машине (192.168.16.7): все пакеты, адресованные первой Windows-станции (192.168.16.8), перенаправлять Linux-хосту (192.168.16.3)
route ADD 192.168.16.8 192.168.16.3
C помощью tracert можно проверить маршрут пакетов, а ping покажет задержку в их передаче.
Такая схема позволяет регулировать время прохождения пакетов по маршруту и проверить качество программной системы на медленных каналах связи.
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.
Автор комментария : Anonymous | September 9, 2008
netem
[Ответить]
Автор комментария : StreSS | September 9, 2008
Смотреть в строну IFB (http://www.opennet.ru/tips/info/1421.shtml) и не мучатся. Куча вкусеностей.
[Ответить]
Автор комментария : Капитан Аляска | September 9, 2008
StreSS и Anonymous, спасибо за IFB и netem!
[Ответить]
Автор комментария : Artour Bakiev | December 8, 2008
Очень любопытно. Можно ли сделать такое в Windows окружении без привлечения Linux router’а?
[Ответить]
Автор комментария : Капитан Аляска | December 8, 2008
Артур, хороший вопрос :) На самом деле, изначально мне это надо было именно в Windows-окружении, но попадались только платные утилиты (сейчас с ходу не вспомню названия) - а это никого не устроило. Задача стояла сделать бесплатно :)
Иными словами, наверняка это можно сделать и в Windows (и может быть, даже бесплатно), но мне такие решения не попадались.
[Ответить]