Сам себя не похвалишь, никто не похвалит 🙂
Есть сервер, используется для авторизации подключения к Wifi через SMS. Т.е. самодельный Captive portal. В нем все полностью из «говна и палок» сделано и настроено вручную, т.е. не разбираться с нормальным, готовым Captive portal’ом, а именно сделать свой.
На нем стоит nginx для захвата пакетов, php для веб морды, SMS-gate для отправки СМС сообщений, iptables + ipset для авторизации. dnsmasq и многое другое. И для логирования кто куда ходил, использую не как все нормальные люди netflow, а tcpdump.
Долгое время руки не доходили, но жесткий диск быстро забивался, через какое то время нужно было заходить, файлы выгружать, и вот эта вот вся рутина очень не очень. Плюс жесткий диск прям сильно напрягается от такой работы. Решил сделать буфер между tcpdump и записью на диск.
Идея была простая, летит несколько пакетов, т.е. все данные разбиваются по пакетам и отправляются маленькими порциями, и в секунду таких пакетов может быть десятки или сотни. Что если все их собрать, нам же важен не факт сколько данных было, и что в них было, это все равно бессмысленно. А вот кто куда когда ходил, это нужно.
Так вот, сказано сделано. Сначала попробовал написать программу на PHP.
сделано было к вечеру пятницы вроде бы, пришел в понедельник и увидел такое 🙂 Нет, все таки PHP создан родиться, сделать свою единицу работы и умереть. Он молодец, но в Web’е.
Тут я понял что не зря учил Go и решил написать на нем.
тут в общем видно не вооруженным глазом, что оптимизация очень неплохая.
Чтобы понять что было с диском в это время, можно посмотреть на этот график:
Ссылка на репозиторий с кодом https://github.com/rudinandrey/tcpdump_optimizer
Он не оптимальный, и папка для вывода захаркожена, знаю, но нам ехать, а не шашечки. У меня куча других срочных задач. На подходе новый компьютер, на котором буду поднимать копию всего этого дела, хочу упаковать в докерах, чтобы в любой момент можно было развернуть если вдруг что.