Недавно я развернул RB5009UG+S+IN в роли основного шлюза и локального DNS-сервера. В течение примерно трёх месяцев после запуска он начал «течь» по памяти — в итоге использование памяти достигало примерно 95%, после чего роутер перезагружался. И происходило это довольно быстро — в последний раз цикл от запуска (с примерно 15% загрузки) до перезагрузки занял чуть меньше 6 дней. Я с самого начала мониторил использование памяти через SNMP и мог в реальном времени наблюдать, как она постепенно росла. Иногда рост приостанавливался на час-два, но в остальное время это был стабильный подъём. Интересно, что скорость расхода памяти несколько раз резко увеличивалась, совпадая с изменениями в рабочей конфигурации — позже вернусь к этому.
В итоге один из коллег наткнулся на supout.rif, и я создал его как раз в момент максимального использования памяти — они его проанализировали. Из этого мы узнали, что процесс resolver (который мы предполагали локальным DNS-сервером) выделил себе 843 МБ памяти! Иными словами, он сам по себе использовал более 80% от 1 ГБ памяти RB5009!
P.S. Забыл упомянуть, что я увеличил размер кэша DNS, чтобы уместить настроенный adlist. Однако увеличил лишь до примерно 20 МБ, так что общий вывод это не меняет.
Раньше я временно отключал функцию DNS adlist, думая, что она может вызвать проблему. Но это ничего не дало, и я углубился в исследование. В ходе поиска наткнулся на такие темы: DNS cache and memory usage, without adlist; Log flooded with cache full, not storing (dns); DNS Cache Full/adlist read: max cache size reached cache full, not storing since 7.14. Кажется, все они связаны между собой, но первая и вторая темы наиболее похожи на мою проблему — особенно вторая, где описывается перезагрузка роутера из-за нехватки памяти, чего я не встречал в других ветках.
Я видел, что несколько пользователей решили проблему заполненного кэша DNS, заменив статические CNAME на A-записи, так что сделал то же самое — конвертировал все CNAME на своём роутере в A-записи. После этого рост использования памяти сразу прекратился. Но снижение памяти произошло только после перезагрузки роутера через несколько дней. С тех пор использование памяти стабильно держится на уровне около 15%.
Возвращаясь к резкому росту потребления памяти, который я упоминал ранее. Я сопоставил изменения конфигурации с точками резкого скачка и действительно выяснил, что совпадающие изменения добавляли одну или несколько новых CNAME-записей.
P.S. 2: Относительно версий RouterOS: когда я впервые заметил утечку, роутер работал на v7.14.3, а к моменту решения проблемы — на v7.17.2. Сейчас я обновился до v7.18.2 — после этого с CNAME я пока не экспериментировал, но в списке изменений ничего, что касалось бы исправлений в DNS resolver, не указано, так что думаю, проблема осталась.
По моим ощущениям, это довольно серьёзное доказательство того, что RouterOS неправильно обрабатывает статические CNAME-записи. Но у меня есть ещё один нюанс: у меня есть RB4011 на другом объекте, который несмотря на несколько статических CNAME, не показывает проблем с утечкой памяти. Однако теперь я понимаю, что CNAME на RB4011 настроены на редко запрашиваемые имена (а может, их вообще не запрашивают), тогда как CNAME на RB5009 запрашивались очень часто.
В итоге один из коллег наткнулся на supout.rif, и я создал его как раз в момент максимального использования памяти — они его проанализировали. Из этого мы узнали, что процесс resolver (который мы предполагали локальным DNS-сервером) выделил себе 843 МБ памяти! Иными словами, он сам по себе использовал более 80% от 1 ГБ памяти RB5009!
P.S. Забыл упомянуть, что я увеличил размер кэша DNS, чтобы уместить настроенный adlist. Однако увеличил лишь до примерно 20 МБ, так что общий вывод это не меняет.
Раньше я временно отключал функцию DNS adlist, думая, что она может вызвать проблему. Но это ничего не дало, и я углубился в исследование. В ходе поиска наткнулся на такие темы: DNS cache and memory usage, without adlist; Log flooded with cache full, not storing (dns); DNS Cache Full/adlist read: max cache size reached cache full, not storing since 7.14. Кажется, все они связаны между собой, но первая и вторая темы наиболее похожи на мою проблему — особенно вторая, где описывается перезагрузка роутера из-за нехватки памяти, чего я не встречал в других ветках.
Я видел, что несколько пользователей решили проблему заполненного кэша DNS, заменив статические CNAME на A-записи, так что сделал то же самое — конвертировал все CNAME на своём роутере в A-записи. После этого рост использования памяти сразу прекратился. Но снижение памяти произошло только после перезагрузки роутера через несколько дней. С тех пор использование памяти стабильно держится на уровне около 15%.
Возвращаясь к резкому росту потребления памяти, который я упоминал ранее. Я сопоставил изменения конфигурации с точками резкого скачка и действительно выяснил, что совпадающие изменения добавляли одну или несколько новых CNAME-записей.
P.S. 2: Относительно версий RouterOS: когда я впервые заметил утечку, роутер работал на v7.14.3, а к моменту решения проблемы — на v7.17.2. Сейчас я обновился до v7.18.2 — после этого с CNAME я пока не экспериментировал, но в списке изменений ничего, что касалось бы исправлений в DNS resolver, не указано, так что думаю, проблема осталась.
По моим ощущениям, это довольно серьёзное доказательство того, что RouterOS неправильно обрабатывает статические CNAME-записи. Но у меня есть ещё один нюанс: у меня есть RB4011 на другом объекте, который несмотря на несколько статических CNAME, не показывает проблем с утечкой памяти. Однако теперь я понимаю, что CNAME на RB4011 настроены на редко запрашиваемые имена (а может, их вообще не запрашивают), тогда как CNAME на RB5009 запрашивались очень часто.
