Пинг списка ip адресов

500 views
Skip to first unread message

SM

unread,
Jul 21, 2016, 2:10:24 AM7/21/16
to Golang Russian
Привет! 
Есть примеры реализации опроса на доступность хостов из списка?
Например выбираем из базы ip, пингуем, результат записываем в базу. 
Как сделать, чтобы быстро опрашивались ~10000 хостов?

Daniel Podolsky

unread,
Jul 21, 2016, 2:19:48 AM7/21/16
to gola...@googlegroups.com, Golang Russian

10k горутин запускаете, и все. Проблемы с горутинами на современных процах появляются ближе к 10m

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Konstantin Kulikov

unread,
Jul 24, 2016, 10:11:43 AM7/24/16
to gola...@googlegroups.com
Просто так запустить 10к горутин к сожалению не получится - улетают пакеты нормально, а вот большая часть ответов не долетает до сокета.

Я тут сделал либу для пингования, TODO'шек полно. тестов тоже нет, но как отправная точка, думаю, сойдет.

Daniel Podolsky

unread,
Jul 24, 2016, 10:14:54 AM7/24/16
to gola...@googlegroups.com
> Просто так запустить 10к горутин к сожалению не получится - улетают пакеты
> нормально, а вот большая часть ответов не долетает до сокета.
зашибись описание проблемы

Alexey “AlekSi” Palazhchenko

unread,
Jul 27, 2016, 3:53:16 AM7/27/16
to gola...@googlegroups.com
Привет,

> 24 июля 2016 г., в 17:14, Daniel Podolsky <onok...@gmail.com> написал(а):
>
>> Просто так запустить 10к горутин к сожалению не получится - улетают пакеты
>> нормально, а вот большая часть ответов не долетает до сокета.

Это была моя первая мысль, когда Даниил написал «10k горутин запускаете, и все».

> зашибись описание проблемы

Ядро их дропает.

–-–
Алексей «AlekSi» Палажченко

Daniel Podolsky

unread,
Jul 27, 2016, 5:04:24 AM7/27/16
to gola...@googlegroups.com
> Ядро их дропает.
с чего бы?

я вот уверен, что дело в ограничении на количество открытых файлов-сокетов

Konstantin Kulikov

unread,
Jul 28, 2016, 4:20:05 AM7/28/16
to gola...@googlegroups.com
В моем примере сокет используется 1 и больше их делать не имеет смысла, тк ядро будет копировать icmp ответы в каждый открытый сокет.
Здесь проблема именно в нехватке буфера сокета (по крайней мере во фряхе, в линуксах не дебажил). Проверяется командой
dtrace -n 'fbt::sbappendaddr_locked:return {@[arg1] = count();}'
1 - пакет записался в сокет
0 - пакет дропнулся


--
Вы получили это сообщение, поскольку подписаны на группу Golang Russian.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/d/optout.

SM

unread,
Aug 8, 2016, 10:55:43 PM8/8/16
to Golang Russian
Сделал так 
func pinger(bks []*TypeDev) {
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)

upG := 0
downG := 0
sqlq := ""
for _, bk := range bks {

/* тут проверяем на валидность ip*/


a := ping.Ping(ipi, 1) // передаем ип и таймаут в секундах
if a == true {
upG++ //для себя, подсчитываю количество хостов в апе 
} else {
downG++ // и в дауне
}

params := fmt.Sprintf("тут подготавливаю строку запроса")
sqlq += params // конкатенация строки с запрсами 

}
go func() {
c1 <- upG //отправляю в канал количество апов
c2 <- downG // тут понятно
c3 <- sqlq //отправляю запрос в канал, для записи в базу данных о доступности хостов
}()
}
в функцию передаю слайсы по n элементов. Время опроса всех хостов = ~n sec. (т.е. 20 элементов в слайсе, все хосты опросит за ~20 секунд) 
Библиотеку брал отсюда Ping

четверг, 21 июля 2016 г., 13:10:24 UTC+7 пользователь SM написал:

Ilya Ozherelyev

unread,
Aug 9, 2016, 12:02:07 PM8/9/16
to Golang Russian
мхм, зачем магический слип вначале? 

у вас последовательный обходи хостов, соответственно, и время линейное

советую осилить https://gobyexample.com/worker-pools

вторник, 9 августа 2016 г., 5:55:43 UTC+3 пользователь SM написал:

SM

unread,
Aug 16, 2016, 2:38:11 AM8/16/16
to Golang Russian
Спасибо, сделал с воркерами. 
Я беру из базы ~10000 хостов, разбиваю на слайсы, и их отправляю в функцию пингера 
go pinger(bksSlice)
в цикле. Получается пока дойдет до конца цикла, первые слайсы уже отпингуются. 
Да, слип тут не нужен, в каком то из примеров взял, его использовали, чтобы не одновременно запускались горутины, а с небольшой задержкой каждая.
вторник, 9 августа 2016 г., 23:02:07 UTC+7 пользователь Ilya Ozherelyev написал:
Reply all
Reply to author
Forward
0 new messages