Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    remove [find] зависает во время выполнения

    remove [find] зависает во время выполнения

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    remove [find] зависает во время выполнения, RouterOS
     
    reg
    Guest
    #1
    0
    20.05.2024 15:11:00
    Я наблюдаю частые, но не 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%, который длится несколько минут после кажущегося завершения операции (что эффективно блокирует следующую попытку удаления самого моста).  
    - Чтобы избежать этой проблемы, нужно сначала удалить сам мост из списка мостов, а уже потом разбирать порты моста, удаляя списки интерфейсов из списка портов моста.  

    Проще говоря, сначала отключи мост, а затем разбирай его порты — не трогай порты на активном мосту.
     
     
     
    reg
    Guest
    #2
    0
    22.06.2024 17:06:00
    Хорошо, я последовал твоему совету. Он всегда зависает на части с [find], даже не доходит до remove. Вот ещё более простой код для теста:

    :put "1"  
    :local ids [find]
    :put "2"  
    remove $ids  
    :put "3"

    Когда зависает, выводится 1, но 2 так и не появляется. Другие наблюдения: если прервать (Ctrl-C) зависший скрипт и запустить его снова, он всё равно висит в том же месте каждый раз. Если прервать зависший скрипт, потом выполнить команду :put [find] отдельно, а потом запустить скрипт ещё раз — тогда зависания нет.
     
     
     
    reg
    Guest
    #3
    0
    22.06.2024 18:45:00
    У меня есть 11 одинаковых коммутаторов, и все они зависают в одном и том же месте (/interface/bridge и /ip/dhcp-server), так что нет, это не проблема конкретного оборудования.
     
     
     
    reg
    Guest
    #4
    0
    22.06.2024 19:07:00
    Обновления после дополнительных экспериментов: обновился до недавно выпущенной версии 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.  

    Похоже, это какой-то баг, основанный на состоянии гонки в MIPSBE-версии RouterOS. Кто-нибудь из MikroTik может это отладить?
     
     
     
    Amm0
    Guest
    #5
    0
    22.06.2024 19:24:00
    Это происходит в /system/script или через CLI? Если через CLI, то локальная переменная исчезает при следующем приглашении — поэтому она равна nil [:nothing]. Тебе нужно использовать фигурные скобки в CLI: /interface/bridge/vlans { :local x [find]; remove $x } Возможно, стоит уточнить команду “find”, потому что в скриптах иногда бывают странности. Например, если ты имеешь в виду /interface/bridge/port/find… тогда используй полную форму, чтобы проверить, сработает ли это.
     
     
     
    reg
    Guest
    #6
    0
    22.06.2024 20:18:00
    Вот что я делаю: загружаю скрипт в /file через WinBox GUI. Запускаю его из CLI командой: import file-name=my_script.rsc. Локальные переменные живы, пока скрипт работает, я даже проверил это с помощью дебага (:put $ids). Только что пробовал — результат тот же: [/interface/bridge/find] зависает.

    ```
    /interface/bridge
       :put "  1"
       :local ids [/interface/bridge/find]
       :put "  2"
       remove $ids
       :put "  3"
    ```

    Я также пытался запустить тот же скрипт, сначала создав его в /system/script (и через терминал, и через GUI), но зависает так же.
     
     
     
    Amm0
    Guest
    #7
    0
    23.06.2024 01:23:00
    Зависание просто странное. Если тот же скрипт работает на ARM, то похоже на ошибку. Использовать :local в :import скрипте без фигурных скобок, возможно, разрешено или работает, но я так не советую. А если просто ввести :put [/interface/bridge/find] в CLI, тоже зависает? Единственное, что можно попробовать — добавить какое-то условие к find, например [find name~“*”], чтобы выбирать все имена. Возможно, нужен какой-то фильтр — вроде бы не должен, но это может помочь избежать зависания (или по крайней мере дать дополнительную информацию для отчёта об ошибке).
     
     
     
    pe1chl
    Guest
    #8
    0
    23.06.2024 09:12:00
    Одна из причин, которая приходит мне в голову, связана с памятью, а не с архитектурой. В CCR2004 много памяти, и она никогда не заканчивается, а некоторые другие устройства имеют всего 16 МБ флеша, который легко может заполниться, особенно с RouterOS v7. Помните, что когда вы что-то удаляете, это на самом деле не освобождает место в памяти. Конфигурация хранится в наборе таблиц, похожих на базы данных (на самом деле это не база данных, а что-то похожее на древние MS-DOS-программы, где каждая таблица — отдельный набор файлов данных и индексов). Когда вы постоянно добавляете и удаляете элементы конфигурации, размер этой «базы данных» постоянно растёт, и в какой-то момент могут возникнуть проблемы. Возможно, у вас такая ситуация, потому что вы регулярно запускаете скрипты, которые чистят и заново создают элементы конфигурации? К сожалению, нет команды для «уплотнения базы данных», как это обычно бывает в подобных системах (которая взяла бы все активные записи и поместила их в самый маленький возможный файл).
     
     
     
    reg
    Guest
    #9
    0
    23.06.2024 13:30:00
    Спасибо за ваше мнение. Возможный контраргумент к этой теории в том, что если бы причиной был именно недостаток места, то я ожидал бы последовательного и предсказуемого поведения — как только место заканчивается, скрипт всегда должен бы зависать. Однако я замечаю, что это происходит только иногда, а не постоянно. Тем не менее, сейчас я собираюсь проверить эту теорию, полностью очистив устройство (форматируя хранилище) с помощью NetInstall, чтобы посмотреть, исчезнет ли проблема на какое-то время после этого. Отпишусь о результатах.
     
     
     
    reg
    Guest
    #10
    0
    23.06.2024 13:50:00
    Да, такое случается время от времени, но, по моим наблюдениям, гораздо реже. Если грубо прикинуть, скрипт зависает примерно в 20-40% запусков в любой день недели, а простой однострочник в CLI зависал не больше двух раз за последний месяц, когда я пытался отладить эту проблему.

    Да, он тоже зависает:

    :put "Resetting device configuration"  
    # Очищаем все списки  
    :put " Clearing bridge port list"  
    /interface/bridge/port  
       :local ids [find where !dynamic]
       remove $ids  
    :put " Clearing bridge list"  
    /interface/bridge  
       :put "  1"  
       :local ids [/interface/bridge/find where name~"*"]
       :put "  2"  
       remove $ids  
       :put "  3"  

    Результат:  
    Resetting device configuration  
    Clearing bridge port list  
    Clearing bridge list  
     1  
    interrupted  

    (строка “interrupted” — это я нажал Ctrl-C после долгого ожидания)
     
     
     
    reg
    Guest
    #11
    0
    23.06.2024 15:53:00
    Хорошо, думаю, я двигаюсь в правильном направлении. По крайней мере, теперь я могу воспроизвести проблему детерминированно.  

    Шаги воспроизведения (для удобства я автоматизировал большую часть из них в скрипте в конце сообщения):  
    - Нужно использовать коммутатор CRS354-48P-4S+2Q+ на базе MIPS (на роутерах с ARM64 проблему не воспроизвести).  
    - Подключиться к устройству через MGMT Ethernet порт (ether49) с помощью WinBox.  
    - Создать пользовательский список интерфейсов и добавить в него все 48 Ethernet-портов как участников списка (это можно автоматизировать в скрипте). Не включайте ether49 в этот список, если не хотите, чтобы ваше соединение в WinBox сбрасывалось на следующем шаге.  
    - Создать бридж и добавить ранее созданный список интерфейсов в список портов бриджа (это также можно автоматизировать).  
    - Открыть GUI-диалог /System/Resources для мониторинга загрузки CPU (нет, гаджет нагрузки CPU на дашборде WinBox не отражает реальную нагрузку, так что пользуйтесь именно этим диалогом!).  
    - Убедиться, что загрузка CPU в GUI-диалоге не 100%. Если 100%, не продолжайте, пока не снизится.  
    - Запустить скрипт, который за один проход: сначала удаляет все не динамические элементы из /interface/bridge/port, а затем удаляет все элементы из /interface/bridge:  
    ```
    :put "Resetting device configuration"
    # Очищаем все списки
    :put " Clearing bridge port list"
    /interface/bridge/port
    :local ids [find where !dynamic]
    remove $ids
    :put " Clearing bridge list"
    /interface/bridge
    :put "  1"
    :local ids [find]
    :put "  2"
    remove $ids
    :put "  3"
    ```
    Скрипт зависнет во второй части (удаление всех элементов из /interface/bridge). Точнее, он зависает на попытке найти все эти элементы.  

    Наблюдаем нагрузку CPU — она будет 100%.  
    Прервите скрипт комбинацией Ctrl-C.  
    Нагрузка CPU останется 100% еще несколько минут.  

    Не дожидаясь снижения загрузки CPU, запустите скрипт снова — он снова зависнет на том же месте — при попытке прочесть список /interface/bridge/. Так будет каждый раз, пока CPU загружен на 100%.  

    Прервите скрипт Ctrl-C.  
    Сходите за чаем или кофе, подождите, пока нагрузка CPU упадет с 100% до нормальных значений. Это займет несколько минут.  

    Запустите скрипт еще раз — на этот раз он не зависнет. Разница в том, что теперь в первой части скрипта нечего удалять из /interface/bridge/port, поэтому CPU не загружается и скрипт спокойно доходит до второго шага, где уже не зависает.  

    Вывод: для зависания скрипта нужна такая комбинация:  
    - Нагрузка CPU из-за удаления одного не динамического элемента типа списка из /interface/bridge/port, что вызывает автоматическое удаление 48 динамических элементов.  
    - Немедленный вызов /interface/bridge [find], который и зависает.

    Важные моменты:  
    - Если /interface/bridge/port уже пуст, всплеска нагрузки CPU не будет, и скрипт не зависнет.  
    - Также обратите внимание, что при наличии элементов в /interface/bridge/port удаление возвращается сразу и успешно, а соответствующее GUI-окно сразу показывает исчезновение всех элементов (как статических, так и динамических), но CPU остается перегруженным еще некоторое время и не может корректно обработать последующие операции.  
    - На самом деле, даже скрипт не нужен, чтобы воспроизвести эту перегрузку CPU — можно просто удалить один не динамический элемент из /interface/bridge/port в GUI и посмотреть, как CPU уйдет в 100% загрузку на следующие две минуты без видимой причины (хотя все элементы из списка, и динамические, и статические, исчезают моментально).  

    Вот объединённый скрипт, который воспроизведёт и настройку, и проблему (при первом запуске он не зависнет, так как сначала очищает, а потом настраивает, так что запускайте его дважды).  

    ```
    # [ Конфигурация ]
    :local ConfigDoClean 1;
    :local ConfigDoLAN 1;

    # [ Данные для поиска ]
    :local PortListLAN {
    "ether1"; "ether2"; "ether3"; "ether4"; "ether5"; "ether6"; "ether7"; "ether8";
    "ether9"; "ether10"; "ether11"; "ether12"; "ether13"; "ether14"; "ether15"; "ether16";
    "ether17"; "ether18"; "ether19"; "ether20"; "ether21"; "ether22"; "ether23"; "ether24";
    "ether25"; "ether26"; "ether27"; "ether28"; "ether29"; "ether30"; "ether31"; "ether32";
    "ether33"; "ether34"; "ether35"; "ether36"; "ether37"; "ether38"; "ether39"; "ether40";
    "ether41"; "ether42"; "ether43"; "ether44"; "ether45"; "ether46"; "ether47"; "ether48";
    };

    # [ Сброс ]
    :if ($ConfigDoClean) do={
    :put "Сброс конфигурации устройства"
    # Очистка всех списков
    :put " Очищаем список портов бриджа"
    /interface/bridge/port
    :local ids [find where !dynamic]
    remove $ids
    :put " Очищаем список бриджей"
    /interface/bridge
    :put "  1"
    :local ids [find]
    :put "  2"
    remove $ids
    :put "  3"
    :put " Очищаем список интерфейсов"
    /interface/list
    :local ids [find where !builtin]
    remove $ids
    :put " Очищаем список участников интерфейсов"
    /interface/list/member
    :local ids [find]
    remove $ids
    };

    # [ Настройка LAN ]
    :if ($ConfigDoLAN) do={
    :put "Настройка LAN"
    # Настройки портов/интерфейсов
    :put " Настраиваем список интерфейсов LAN"
    /interface/list
    add name=InterfaceList.LAN
    /interface/list/member
    :foreach Port in=($PortListLAN) do={
    add interface=$Port list=InterfaceList.LAN
    }
    :put " Настраиваем LAN бридж"
    /interface/bridge
    add name=Interface.LAN
    /interface/bridge/port
    add bridge=Interface.LAN interface=InterfaceList.LAN
    };
     
    На этом этапе я сделал всё, чтобы максимально надежно воспроизводить проблему, думаю, теперь пора кому-то из MikroTik исправлять это, как только закончится Лиго.
     
     
     
    Amm0
    Guest
    #12
    0
    23.06.2024 17:00:00
    Ну вот, узнал кое-что новое. Я даже не знал, что /bridge/ports может быть списком интерфейсов. Комбинация MIPSBE (которую, я думаю, Mikrotik сейчас тестирует хуже) и «динамических» портов моста (хоть и нечасто встречающихся, но, кажется, полезных) действительно может привести к какой-нибудь ошибке… Тебе стоит обратиться в службу поддержки на help.mikrotik.com и приложить supout.rif с CRS. Может быть, ты уже это сделал, но можно попробовать и netinstall — @pe1chl прав, какие-то «хвосты» от предыдущих обновлений в файловой системе могут всё портить.
     
     
     
    reg
    Guest
    #13
    0
    23.06.2024 18:25:00
    Хорошо, как и обещал, я попробовал полностью очистить устройство с помощью NetInstall — видел, как программа сообщала «форматирование жесткого диска», а затем устанавливала последнюю версию RouterOS (7.15.1). Потом запустил скрипт, который приводил в предыдущем сообщении — и он снова зависает уже с первой попытки. Так что нет, дело не в «остатках» в файловой системе. Это что-то, что по-настоящему перегружает процессор каждый раз.
     
     
     
    reg
    Guest
    #14
    0
    23.06.2024 18:40:00
    Вау, похоже, я только что нашёл обходное решение этой проблемы: оказывается, если делать удаление в обратном, на первый взгляд нелогичном порядке (сначала мост, потом порты моста), ничего не зависает и CPU не уходит в двухминутный перегруз. Вот как теперь выглядит изменённый скрипт:

    # [ Конфигурация ]

    :local ConfigDoClean 1;
    :local ConfigDoLAN 1;

    # [ Данные для поиска ]

    :local PortListLAN {
    "ether1"; "ether2"; "ether3"; "ether4"; "ether5"; "ether6"; "ether7"; "ether8";
    "ether9"; "ether10"; "ether11"; "ether12"; "ether13"; "ether14"; "ether15"; "ether16";
    "ether17"; "ether18"; "ether19"; "ether20"; "ether21"; "ether22"; "ether23"; "ether24";
    "ether25"; "ether26"; "ether27"; "ether28"; "ether29"; "ether30"; "ether31"; "ether32";
    "ether33"; "ether34"; "ether35"; "ether36"; "ether37"; "ether38"; "ether39"; "ether40";
    "ether41"; "ether42"; "ether43"; "ether44"; "ether45"; "ether46"; "ether47"; "ether48";
    };

    # [ Сброс ]

    :if ($ConfigDoClean) do={
    :put "Сбрасываем конфигурацию устройства"
    # Очищаем все списки
    # Обратный, нелогичный порядок удаления — сначала мост, потом порты моста — гарантирует, что CPU не уйдёт в 100% загрузку на несколько минут
    :put " Очистка списка мостов"
    /interface/bridge
    :put "  1"
    :local ids [find]
    :put "  2"
    remove $ids
    :put "  3"
    :put " Очистка списка портов моста"
    /interface/bridge/port
    :local ids [find where !dynamic]
    remove $ids
    :put " Очистка списка интерфейсов"
    /interface/list
    :local ids [find where !builtin]
    remove $ids
    :put " Очистка списка участников интерфейсов"
    /interface/list/member
    :local ids [find]
    remove $ids
    };

    # [ Конфигурация LAN ]

    :if ($ConfigDoLAN) do={
    :put "Конфигурируем LAN"
    # Настройки портов/интерфейсов
    :put " Конфигурация списка интерфейсов LAN"
    /interface/list
    add name=InterfaceList.LAN
    /interface/list/member
    :foreach Port in=($PortListLAN) do={
    add interface=$Port list=InterfaceList.LAN
    }
    :put " Конфигурация LAN-моста"
    /interface/bridge
    add name=Interface.LAN
    /interface/bridge/port
    add bridge=Interface.LAN interface=InterfaceList.LAN
    };

    Даже если вы не пишете скрипты, а просто работаете с WinBox GUI, это правило для вас тоже актуально. Итак, правило такое: при удалении конфигурации моста, сделанной с помощью списка интерфейсов, сначала удаляйте сам мост, а только потом убирайте назначение портов моста. Если сначала удалить назначение портов, пока мост ещё активен, это вызовет примерно две минуты 100%-й загрузки CPU, хотя на первый взгляд операция пройдет успешно.

    Огромное спасибо @Amm0 и @pe1chl за то, что указали мне несколько полезных направлений!
     
     
     
    pe1chl
    Guest
    #15
    0
    24.06.2024 07:54:00
    Возможно, есть какой-то механизм блокировки, который работает не совсем правильно. Конечно, можно считать это багом, и было бы здорово сообщить об этом через систему тикетов. Если первая команда вызывает загрузку процессора, которая продолжается даже после завершения выполнения команды, по крайней мере, ПО должно ждать её окончания, прежде чем запускать следующую команду. Всё равно удивительно, что это занимает так много времени, но, по крайней мере, система не должна действительно зависать.

    При этом не забывайте, что у этих процессоров довольно низкая производительность. Сам коммутатор может работать на максимальной скорости, потому что это делает аппаратное обеспечение, но CPU явно не подходит для обработки такого большого количества элементов — их целых 48. Разработчики, вероятно, предполагали, что подобные действия не будут выполняться регулярно. И, скорее всего, так и надо.

    Я могу представить, что вы столкнулись с этим, когда у вас несколько таких коммутаторов и вы хотите изменить конфигурацию сразу на всех, чтобы привести их к каким-то новым требованиям, и написали для этого хитрый скрипт. Но в обычной работе делать так не стоит. То есть, например, не стоит планировать такую настройку, если вам нужно будет делать это каждый день.
     
     
     
    reg
    Guest
    #16
    0
    24.06.2024 13:41:00
    Да, действительно, я пишу скрипт конфигурации, который никогда не выполняется во время нормальной работы коммутатора, так как я прекрасно понимаю, что процессоры MIPS в коммутаторах не предназначены для обработки данных в реальном времени. При этом даже конфигурационные скрипты не могут позволить себе застрять навсегда, потому что это лишает их всякого смысла. Ты также прав, говоря, что если какое-то действие занимает много времени, оно не должно возвращать управление раньше, чем завершится, чтобы хотя бы было понятно, на каком шаге мы находимся.

    В то же время, поскольку мне удалось избежать этого ужасного «подводного» лага, просто поменяв порядок операций, мне понятно, что значительно более высокая скорость выполнения данной операции принципиально достижима на том же процессоре.

    Моя текущая гипотеза такова: когда я удаляю порты из активного моста (что и вызывает этот кошмарный «подводный» лаг), процессор коммутатора каким-то образом перенумеровывает все оставшиеся активные порты после удаления каждой из 48 динамических записей, что приводит к задержке с квадратичным ростом (48+47+46+…+1 = (n²+n)/2). Когда я меняю порядок и сначала удаляю сам мост, он становится неактивным и не обрабатывает каждый оставшийся порт при их удалении.

    То есть, мой обходной путь решает проблему, но очевидно, что причина в какой-то глубинной недоработке, из-за которой возникает эта ненужная нагрузка. И даже если эта нагрузка архитектурно неизбежна, пока мост активен (значит, нужно всегда сначала удалять мост), она точно не должна выполняться асинхронно — быстро выходя из функции и продолжая что-то делать в фоне в течение двух минут, а должна работать синхронно, не отдавая управление, пока всё не завершится.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры