Golang icmp ping

В общем, мне нужно сделать ICMP опрос коммутаторов с помощью яп golang, всё вроде сделано, работает. Одна загвоздка, объектов для опроса тысячи, и чтобы их все опросить и занести в базу данных жив ли коммутатор или нет - понадобится большое количество времени. Проблема была решена, использование горутин, появилась вторая проблема - неэффективность программы. Создавалось количество горутин равное количеству объектов, что сильно нагружает процессор. Что можно вообще сделать? Есть идея отправлять ICMP-пакет на сервер и не ждать от него ответа, идя отправлять пакеты дальше по другим объектам. И сделать обработчик события приходящего пакета, и там уже написать логику, но как такое можно сделать? Асинхронность пытался использовать, всё приводило в итоге к горутинам, и всё той же большой нагрузке.


Ответы (1 шт):

Автор решения: Andrew Zlatov

Возможно распараллелить кластерно.

Пусть Q - количество устройств, которое нужно опросить. Создаем горутины, количество которых равно количеству потоков H, а каждой горутине отдать Q/H ip-адресов.

Так теоретически возможно увеличить производительность относительно последовательной отправки пакетов и снизить нагрузку.

→ Ссылка