Agent perfomance
Проблемы с утечками памяти и производительностью:
Backend (Server)
- WebSocket - нет очистки соединений при закрытии (log-server/index.ts) ◦ UDP сокеты создаются в цикле (строка 31), но нигде не сохраняются ссылки и не закрываются при shutdown ◦ Каждый UDP listener создает новые обработчики в памяти без возможности их удаления
- Promise.all в readLogs без ограничения (access-logs/service.ts, строка 93) ◦ При обработке большого количества логов (logLines.map(async…)) создается массив промисов без ограничения параллелизма ◦ Может привести к перегрузке памяти при обработке тысяч строк одновременно
- Promise.all в getContentTypeStats (metrics/service.ts, строка 151) ◦ Для каждого contentType выполняется дополнительный Redis запрос в Promise.all ◦ При большом количестве типов контента - множество параллельных запросов
- Promise.all в getLatestTime (metrics/service.ts, строка 307) ◦ Для каждого origin выполняется Redis запрос без ограничения параллелизма ◦ Потенциально десятки одновременных запросов к Redis
- getUsersInfo - неэффективный цикл с Redis запросами (metrics/service.ts, строки 392-443) ◦ Два Redis запроса (FT.SEARCH) для каждого пользователя в цикле ◦ При наличии сотен пользователей - сотни последовательных запросов
- setInterval для cleanupDeadConnections никогда не очищается (ws/index.ts, строка 16) ◦ Создается глобальный interval, но нет механизма его остановки при shutdown
- ParserService.getAll при каждом UDP пакете (log-server/index.ts, строка 39) ◦ При каждом входящем UDP пакете выполняется FT.SEARCH по всем origins ◦ Высокая частота запросов при активном трафике
- Отсутствие лимита на размер Map в WsService (ws.service.ts, строка 9) ◦ connectedClients Map может расти бесконечно при подключениях ◦ Нет явного ограничения на количество клиентов
- Redis keys() без паттерна (access-logs/service.ts, строки 13-15) ◦ keys(“log:access:*”) - блокирующая операция, сканирует всю БД ◦ При большом количестве ключей блокирует Redis
Frontend (Web)
- SharedWorker connections array растет бесконечно (access.worker.ts, строка 10) ◦ Новые порты добавляются в массив connections (строка 107) ◦ Нет удаления отключенных портов из массива
- WebSocket reconnect без экспоненциальной задержки (access.worker.ts, строка 76) ◦ При обрыве соединения переподключение через 1 секунду ◦ При проблемах с сервером может создать flood запросов
- shallowRef для больших данных без очистки (stores/access.ts, stats.ts) ◦ Данные накапливаются в shallowRef без явной очистки ◦ При долгой работе приложения может накопиться большой объем данных
- JSON.parse вызывается дважды (stores/access.ts, строки 26-27) ◦ Сначала парсится event.data, затем data.data ◦ Неэффективно и может вызвать проблемы с памятью при больших данных
Redis
- Отсутствие пайплайнов для множественных операций ◦ В readLogs каждый hset выполняется отдельно (строка 89) ◦ Можно использовать pipeline для batch операций
- expire вызывается отдельно после каждого hset ◦ Две команды вместо одной с EXAT параметром