Я установил несколько виртуальных машин qemu. Они запускаются подключенными к виртуальным тапам (у каждой ВМ свои)
qemu-system-x86_64 -enable-kvm -hda my_drive.qcow2 -m 1024 -netdev tap,id=t1,ifname=tap0,script=no,downscript=no -device rtl8139,netdev=t1,id=nic1,mac=<random_uniq_mac>
И все виртуальные ответвители подключены к мосту с именем br1
Есть привязанный DHCP-сервер br1
так что каждая машина может получить ip и разрешить dns
dnsmasq --interface=br1 --bind-dynamic --dhcp-range=subnet.11,subnet.253,5m --log-queries --no-daemon
Выявленная проблема заключается в том, что, когда работает слишком много виртуальных машин qemu, некоторые теряют свои интернет-соединения или даже не получают IP-адрес от dnsmasq, мы создали небольшую программу для подключения к некоторому веб-сайту и отображают любые ошибки.
hOpenHandle = InternetOpen(TEXT("POC"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
PL_CHECK("InternetOpen");
hOpenUrlHandle = InternetOpenUrl(hOpenHandle, TEXT("http://www.somewebsite.org"), 0, 0, INTERNET_FLAG_RAW_DATA, 0);
PL_CHECK("InternetOpenUrl");
InternetReadFile(hOpenUrlHandle, buffer, 32, &ret);
PL_CHECK("InternetReadFile");
InternetReadFileEx(hOpenUrlHandle, &InetBuff, IRF_ASYNC, 2);
PL_CHECK("InternetReadFileEx");
hConnectHandle = InternetConnect(hOpenHandle, TEXT("www.somewebsite.org"), INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
PL_CHECK("InternetConnect");
hResourceHandle = HttpOpenRequest(hConnectHandle, TEXT("GET"), TEXT("/"), NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0);
PL_CHECK("HttpOpenRequest");
HttpSendRequest(hResourceHandle, NULL, 0, NULL, 0);
PL_CHECK("HttpSendRequest");
HttpSendRequestEx(hResourceHandle, NULL, NULL, 0, 0);
PL_CHECK("HttpSendRequestEx");
return (EXIT_SUCCESS);
С участием tcpdump
начал связываться br1
Я вижу нормальный трафик, но когда кажется, что виртуальная машина теряет соединение, в tcpdump больше ничего не отображается, виртуальная машина затем фактически получает нужные пакеты, но по-прежнему ничего не отображается в tcpdump, я пришел к выводу, что он, вероятно, уже прошел, но был приостановлен либо хост-системой, qemu, либо гостевой системой.
Последняя информация, которую я собрал, взята из ifconfig
который показывает отброшенные пакеты RX и TX. Кажется, что когда машина qemu теряет связь, ifconfig
увеличивает количество отброшенных пакетов RX. Следующий фрагмент показывает количество пакетов, отброшенных в разное время. Справа перед началом, в середине после запуска нескольких виртуальных машин, некоторые из которых потеряли подключение к Интернету, а затем слева после запуска нескольких из них, которые работали правильно.
br1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 | br1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 | br1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
RX errors 0 dropped 504466 overruns 0 frame 0 | RX errors 0 dropped 504446 overruns 0 frame 0 | RX errors 0 dropped 504371 overruns 0 frame 0
Мы видим, что число увеличилось только тогда, когда мой проблемный случай произошел между серединой и правым.
Не знаю, причина это, следствие или просто совпадение. Могу ли я получить дополнительную информацию об отброшенных пакетах RX? Есть идеи, как определить проблему?