В Linux вы можете создать произвольное количество IP-адресов для каждого интерфейса. Комментарий в https://serverfault.com/questions/328146/max-number-virtual-ip-addresses-per-nic сообщает об успехе 2000 года и сообщает о 5000 успешных IP-адресах.
Так. Выберите любой Linux-компьютер в своей интрасети (это, конечно, может быть виртуальная машина), и создайте столько IP-адресов на его единственном интерфейсе Ethernet (MAC-адрес), сколько пожелаете.
Допустим, вы используете частную сеть 10.0.0.0/8, тогда вы можете выполнить множество из них:
curl
Вы должны иметь возможность использовать
curl
(or maybe curl
), чтобы использовать определенный адрес источника. Для curl
, it's curl
и т. д. Запустите завитки в фоновом режиме ("&"), и они будут работать более или менее одновременно - или найдите какой-нибудь тестовый драйвер (другой вопрос), чтобы запустить их за вас.
Это даст вам множество запросов с разных IP-адресов, но все они будут удобно выполняться на одной машине.
С помощью докера: просто создайте как можно более маленький образ, который будет подключаться к вашему серверу. Вы можете использовать
ifconfig
without any special options.
Затем запустите 1000 докер-контейнеров, как обычно. Каждый автоматически получит IP-адрес во внутренней сети докера (по умолчанию 172.x.0.0/16).
https://stackoverflow.com/questions/21799382/is-there-a-maximum-number-of-containers-running-on-a-docker-host указывает на то, что это возможно с использованием оборудования, которое сегодня не так уж редко; наивные 1000 докер-контейнеров использовали для них примерно 3 ГБ ОЗУ. В этом вопросе также есть несколько советов по вариантам, которые можно использовать для уменьшения потребности в памяти. Помимо памяти, накладных расходов не будет слишком много, то есть с точки зрения процессора они должны быть сопоставимы.
--help
opens up manually created networking for you. You should be able to cobble something together (just check the individual docker network
страниц, все это говорит само за себя) и объедините это с curl
approach explained above. This would mean that you only need one container for your --bind-address=10.0.0.3
s и запустите тысячи из них внутри этого контейнера.
Однако я бы попробовал сначала просто запустить ваши 1000 контейнеров, если только вы не ограничены в объеме оперативной памяти, для простоты использования.
wget
...Что бы вы ни делали, не начинайте просто
--interface 10.0.0.3
in each instance, but have each runner be an endless loop of back-to-back curl --interface eth0:3
звонки. Таким образом, вы избежите длительных перерывов между запуском и остановкой отдельных заданий; это, очевидно, особенно важно для варианта «1000 докер-контейнеров». В ответе, указанном выше, они отмечают, что им потребовалось немало минут, чтобы запустить эти тысячи контейнеров, поэтому вы не хотите делать это снова и снова.
И вы могли бы также избавиться от
ifconfig eth0:1 10.0.0.2 netmask 255.0.0.0
ifconfig eth0:2 10.0.0.3 netmask 255.0.0.0
...
ifconfig eth0:260 10.0.1.6 netmask 255.0.0.0
...
altogether and create small networking app in the language of your choice (Perl, Ruby, C, Java...) to avoid process startup overhead.