v2.1.0.0
Zapretyan Go \=> v2.1.0.0
В этом обновлениии введено огромное количество оптимизаций и нововведений в ядро для оптимального потребления ресурсов и гибкости настроек.
Нововведения
- Разрешён запуск ядра без расширений. Ядро выдаст предупреждение и запустится с сохранением функционала скачивания, слияния и дедубликации списков
- Источники доменов и IP адресов принимают массив ссылок вместо одного значения и объединяются в один файл без дубликатов
- Добавлен отдельный флаг для отключения цвета в консоли
- Добавлена возможность установки приложения на автозапуск как системный сервис для Windows и дистрибутивов Linux с помощью флага
--install- Если у вас возникли проблемы при установке на системах со средами под управлением
OpenRC,SysVinitилиUpstart. Создайте issue или внесите исправление и отправьте нам Pull Request с подробностями ошибки с которой вы столкнулись.
- Если у вас возникли проблемы при установке на системах со средами под управлением
- Добавлена поддержка установки сервиса для Linux сред
systemd,openrc,upstartиsysvinit - Добавлена Полноценная поддержка работы в качестве системного сервиса Windows с полной поддержкой корректного запуска/остановки/перезапуска сервиса из services.msc или taskmgr
- Добавлен флаг
--uninstallдля удаления ранее устаовленного системного сервиса для Windows и дистрибутивов Linux - Добавлен технический флаг
--runдля исполнения приложения в режиме системного сервиса для управления некоторыми функциями и коммуникацией с системой в случае Winsvc - При слиянии списков IP адресов распаковываются CIDR префиксы если таковые есть в файле. Это позволяет пользователю указывать в одном файле и/или разных ссылках одновременно и IP (как 1.1.1.1) адреса и целые подсети (как 1.1.0.0/16)
- При ротации файлов добавлен лог для каких типов файлов будет выполнена ротация
- Функция объединения и удаления дубликатов строк списков была модифицирована и теперь поддерживает любые из трёх типов списков
- Многопоточный подход скачивания и сборки данных повсеместно заменён линейными последовательными функциями в целях экономии ОЗУ. Например, теперь все файлы скачиваются, смешиваются и дедублицируются последовательно, не выделяя память на несколько горутин выполняющих одинаковое действие одновременно. Это не повлияет на функционал и скорость, так как минимальный интервал итерации - 1 час. За 1 час далеко не у всех ресурсов появляются обновления
- Добавлен флаг
-dumpeventдля отладочной записи первого отправленного события в JSON файл каждую итерацию. - Добавлено больше информации в стандартные выводимые логи
- Добавлены дополнительные логи стадий сканнера
- Добавлено предупреждение в консоль если старый файл типа списков не найден, предотвращая дальнейшую ошибку при попытке сравнить несуществующий файл
- Переход на использование внешней сортировки при сравнении и слиянии файлов. Размер буфера строго ограничен и результаты сортировки записываются во временные файлы на диске, после чего сливаются в один отсортированный файл. Это очень сильно экономит ОЗУ, так как в памяти хранится не больше указанного количества строк и не нужно хранить и сортировать карту размером в 1.5млн элементов
- Слияние, распаковка и дедубликация доменов, адресов и подсетей в списках переведена на байтовое сравнение строк, ограничена строгим размером буфера и записывает временные файлы на диск сортируя и удаляя дубликаты в памяти
- Добавлены переопределения параметров при указании некоторых флагов
- Добавлены паузы при ошибках приложения чтобы пользователь мог успеть прочитать ошибку перед закрытием в случае запуска из UI Windows. Паузы игнорируются в режиме системного сервиса
- Добавлено отображение текущего статуса использования ОЗУ после этапов сканирования в логах отладки
Исправления и оптимизации
- На основе прошлого билда было видно, что при огромных диффах пиковое потребление ОЗУ из-за постоянной аллокации места в памяти для карт достигало ~1ГБ во время процесса, что недопустимо. В аналогичных тестах этого обновления удалось снизить пиковое потребление ОЗУ до ~75МБ, что само по себе невероятная разница
- Оптимизировано потребление ОЗУ при записи списков на диск
- Оптимизировано потребление ОЗУ при записи строк в карты
- Текстовый метод сравнения двух файлов заменён на построчное сканирование байт для экономии ОЗУ
- Исправлена ошибка, когда при завершении работы программы до начала первого сканирования приложение завершало работу принудительно
- Тяжёлые карты в памяти при сравнении двух файлов заменены на слайсы хранящие разницу
- Точечные оптимизации выделения оперативной памяти под карты значений
- Сборщик мусора запускается после каждого сканирования, в том числе и первого
- Максимальный размер файла лога до ротации снижен до 8МБ
- Изменён стандартный источник для IP адресов
- Распаковка подсетей в адреса теперь происходит "на лету" при чтении скачанных файлов
- Оптимизация этапов сбора данных для режимов
httpиhash. - Файлы из списка будут скачиваться только только при наличии хотя бы одного обновления на удалённом сервере (при "http") и в зависимости от настроек (при
hash) - При ошибке загрузки файла, функция попытается повторить скачивание снова несколько раз, прежде чем вернуть ошибку
- Скачивание файлов вынесено в этап отдельный от проверки наличия обновлений
- Проверка хэша проводится для режимов
hashиhttpи на её основе определяется необходимость ротации файлов. Даже если сервер отдаёт ложный заголовок Last-Modified, если файл не имеет обновлений, ротация не будет произведена, и вы не потеряете данные при сравнениях - Ротация файлов сообщества вынесена в единую функцию ротации файлов для всех типов списков
- Сборщик мусора вызывается после итерации сканирования, а не в окончании функции самой итерации как было раньше
- Исправлена ошибка, когда логи сохранялись в рабочую директорию окружения вместо директории с приложением
- Исправлено отображение отсутствующего файла в логах при проверке на наличие обновлений списков
- Исправлена ошибка, когда функция проверки хэша запрещала ротацию файлов если не найден новый файл конкретного списка
- Исправлена ошибка, когда при проверке хэша запрет на ротацию типа списков заменялся разрешением или наоборот
- Теперь хэш вычисляется только для типов списков, новые файлы которых были успешно загружены и слиты в один файл
- Теперь при проверке заголовков на удалённом сервере пользователю отображается предупреждение только в случае неудачи
- Исправлена ошибка, когда при отправке события фильтр проходили только события с пустыми диффами
- Слияние списков доменов и адресов объединено в один пайплайн с динамическим поведением в зависимости от выбора режима
Full Changelog: v2.0.0.0...v2.1.0.0