Обновить

Пишем ping на Go: сможем ли составить конкуренцию стандартному ping?

Время на прочтение13 мин
Охват и читатели12K
Всего голосов 20: ↑19 и ↓1+23
Комментарии8

Комментарии 8

Честно говоря не понял, а зачем вообще это нужно? Чем не нравится уже работающие реализации?

скорее всего типа "могём... умеем"

Стрипать надо не через "-ldflags "-s -w" ", а просто утилитой strip, так обычно бинарник меньше выходит (и это официально поддерживается).

Я совсем не программист, но нужна была похожая реализация для мониторинга большого количества устройств со сбором дополнительной статистики. Сделал используя библиотеку pro-bing и основная проблема в том, что запуская сотни горутин на слабом железе, мы получаем RTT и stddev отличающийся от обычного одиночного пинга на десятки миллисекунд, что иногда критично и выглядит не сильно красиво. Я так понимаю, что это происходит из-за реализации подсчета RTT через time.Since и времени на переключение контекста между разными горутинами. Тестировали ли вы этот момент?
Как можно оптимизировать это и получать RTT близкий к одиночному пингу не закидывая все железом с большим количеством CPU?

По коду, думаю, в некоторых местах можно if/else поменять на if/early_return для читаемости и некоторые части вынести в функции с именем по контексту действий. А так очередной ping, каких много. Можно было сделать массовый «ping-mass» или ping-db как хранилище данных. Вообще есть проект GNU coreutils на golang https://github.com/ericlagergren/go-coreutils, правда, заброшенный, но, может, кому-то будет интересен. На Rust аналогичный проект активно развивается.

На винде что-то не работает

Golang славится своей многопоточностью. Если бы вы реализовали аналог fping - цены бы вам не было.

Если на сервере отключён IPv6, как класс (в /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"), то fping не работает даже с указанием ключа -4

$ sudo fping -4 -g 192.168.3.0/24
(null): can't create raw socket (must run as root?) : Address family not supported by protocol

У меня, как у админа, выбор:

  1. или мягче отключить IPv6 с сохранением стека, но без адресов - ipv6.disable_ipv6=1

  2. или заменить fping на другое

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
yadro.com
Дата регистрации
Дата основания
Численность
5 001–10 000 человек
Местоположение
Россия
Представитель
Ульяна Соловьева