Я наблюдаю частые, но не 100% повторяющиеся случаи, когда консольная команда, направленная на удаление всех элементов из заданного списка (точнее remove [find]), зависает во время выполнения. Следующее верно:
- Происходит с разными коллекциями элементов, например, /ip/dhcp-server remove [find], /interface/bridge remove [find] и так далее.
- Происходит как на непустых, так и на пустых коллекциях.
- Происходит как в скриптах, так и при отдельном вызове в терминале, но, кажется, чаще — при запуске из скрипта.
- Происходит примерно в 20% случаев. Иногда выполнение вообще не заканчивается, иногда занимает очень много времени, но всё же завершается, а иногда долго висит и в итоге завершается с сообщением о таймауте.
- RouterOS 7.14.3 (самая свежая стабильная версия).
Вопросы:
- Почему такая простая команда может зависать, причём в случайном порядке?
- Есть ли способ предотвратить зависание, выполнив какие-то подготовительные действия?
- Существует ли более надёжный способ удалить все элементы из заданной коллекции, чтобы не застревать?
Обновление 1:
Обновился до недавно вышедшей версии 7.15.1, проблема осталась в том же месте.
Происходит на нескольких коммутаторах CRS354-48P-4S+2Q+ (на базе MIPSBE, у меня их 11 штук).
Никогда не происходит на маршрутизаторах CCR2004-1G-12S+2XS и CCR2216-1G-12XS-12XQ (оба на базе ARM64).
Проблема воспроизводится даже без команды remove — именно [find] зависает (например, :put [find]). Команда print, вызываемая из скрипта, ведёт себя так же, как и :put [find].
Если скрипт завис, и его прервать, при повторном запуске зависание происходит снова.
Зависает конкретно для коллекций /interface/bridge и /ip/dhcp-server.
Это, по всей видимости, баг на уровне гонок (race condition) в MIPSBE-версии RouterOS.
Кто-нибудь из MikroTik может это отладить?
Обновление 2 (решение):
Я решил проблему, кратко: (полное решение в ветке ниже)
- Происходит только на коммутаторах на базе MIPS.
- Происходит, когда пытаешься удалить конфигурацию моста, которая использует списки интерфейсов для указания портов.
- Удаление списка интерфейсов, содержащего много портов (например, 48), из списка портов моста непосредственно перед попыткой удалить сам мост приводит к необъяснимому скачку загрузки CPU до 100%, который длится несколько минут после кажущегося завершения операции (что эффективно блокирует следующую попытку удаления самого моста).
- Чтобы избежать этой проблемы, нужно сначала удалить сам мост из списка мостов, а уже потом разбирать порты моста, удаляя списки интерфейсов из списка портов моста.
Проще говоря, сначала отключи мост, а затем разбирай его порты — не трогай порты на активном мосту.
- Происходит с разными коллекциями элементов, например, /ip/dhcp-server remove [find], /interface/bridge remove [find] и так далее.
- Происходит как на непустых, так и на пустых коллекциях.
- Происходит как в скриптах, так и при отдельном вызове в терминале, но, кажется, чаще — при запуске из скрипта.
- Происходит примерно в 20% случаев. Иногда выполнение вообще не заканчивается, иногда занимает очень много времени, но всё же завершается, а иногда долго висит и в итоге завершается с сообщением о таймауте.
- RouterOS 7.14.3 (самая свежая стабильная версия).
Вопросы:
- Почему такая простая команда может зависать, причём в случайном порядке?
- Есть ли способ предотвратить зависание, выполнив какие-то подготовительные действия?
- Существует ли более надёжный способ удалить все элементы из заданной коллекции, чтобы не застревать?
Обновление 1:
Обновился до недавно вышедшей версии 7.15.1, проблема осталась в том же месте.
Происходит на нескольких коммутаторах CRS354-48P-4S+2Q+ (на базе MIPSBE, у меня их 11 штук).
Никогда не происходит на маршрутизаторах CCR2004-1G-12S+2XS и CCR2216-1G-12XS-12XQ (оба на базе ARM64).
Проблема воспроизводится даже без команды remove — именно [find] зависает (например, :put [find]). Команда print, вызываемая из скрипта, ведёт себя так же, как и :put [find].
Если скрипт завис, и его прервать, при повторном запуске зависание происходит снова.
Зависает конкретно для коллекций /interface/bridge и /ip/dhcp-server.
Это, по всей видимости, баг на уровне гонок (race condition) в MIPSBE-версии RouterOS.
Кто-нибудь из MikroTik может это отладить?
Обновление 2 (решение):
Я решил проблему, кратко: (полное решение в ветке ниже)
- Происходит только на коммутаторах на базе MIPS.
- Происходит, когда пытаешься удалить конфигурацию моста, которая использует списки интерфейсов для указания портов.
- Удаление списка интерфейсов, содержащего много портов (например, 48), из списка портов моста непосредственно перед попыткой удалить сам мост приводит к необъяснимому скачку загрузки CPU до 100%, который длится несколько минут после кажущегося завершения операции (что эффективно блокирует следующую попытку удаления самого моста).
- Чтобы избежать этой проблемы, нужно сначала удалить сам мост из списка мостов, а уже потом разбирать порты моста, удаляя списки интерфейсов из списка портов моста.
Проще говоря, сначала отключи мост, а затем разбирай его порты — не трогай порты на активном мосту.
