Информация
Настройка
Новости
Контакты
Новинка
Распродажа
Оплата
Доставка
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • 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
    Скрипт для расчёта средней загрузки CPU.

    Скрипт для расчёта средней загрузки CPU.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Скрипт для расчёта средней загрузки CPU., RouterOS
     
    rgraham
    Guest
    #1
    0
    18.04.2008 15:16:00
    Название: Средняя загрузка ЦП

    Настрой планировщик на выполнение с интервалом в 1 секунду (частота дискретизации).
    Настрой информационные логи для вывода в терминал в системном логировании:

    :local cpuload 0
    :global cpuarray
    :local arraylen 0
    :local arraypos 0
    :local arraytot 0
    :global avgcpuload 0
    :global highavgcpuload

    размер массива – это количество образцов загрузки ЦП, которые нужно сохранить. Экспериментируй с этим значением, чтобы увеличить или уменьшить количество образцов. Чем больше значение, тем дольше рассчитывается средняя загрузка ЦП.

    :local arraysize 5

    Получи образцы загрузки ЦП, ограничь cpuarray размером массива:

    :set cpuload [/system resource get cpu-load]
    :set cpuarray ([:toarray $cpuload] + $cpuarray)
    :set cpuarray [:pick $cpuarray 0 $arraysize]

    Сложи все значения в массиве:

    :set arraypos 0
    :set arraylen [:len $cpuarray]
    :while ($arraypos < $arraylen) do={
    :set arraytot ($arraytot + [:pick $cpuarray $arraypos]);
    :set arraypos ($arraypos + 1)}

    Раздели сумму значений массива на количество значений в cpuarray:

    :set avgcpuload ($arraytot / [:len $cpuarray])

    :if ([:len $highavgcpuload] = 0) do={:set highavgcpuload $avgcpuload}

    :if ([$highavgcpuload] < [$avgcpuload]) do={:set highavgcpuload $avgcpuload}

    Отобрази результаты в терминальном окне:

    :log info (“CPU Load Captures:”)
    :log info $cpuarray
    :log info (“Array Total: $arraytot”)
    :log info (“Array size: $arraysize”)
    :log info (“CPU Load - Avg: $avgcpuload High: $highavgcpuload”)
     
     
     
    n21roadie
    Guest
    #2
    0
    31.12.2017 20:11:00
    Я давно бросил попытки использовать скрипт для расчета нагрузки на ЦП, потому что он был точным только при низкой загрузке. При более высокой загрузке результаты были неверными или скрипт вообще не запускался.
     
     
     
    EIKA
    Guest
    #3
    0
    01.01.2018 12:34:00
    Может быть. Но как насчет синтаксиса? Можешь исправить? Я планировал настроить это примерно на 90%, или что-то около того. 100% не вариант, потому что скрипт не запустится в большинстве случаев.
     
     
     
    mrzero
    Guest
    #4
    0
    24.04.2010 03:50:00
    Спасибо, но не работает. А когда запускаю в терминале, чтобы посмотреть ошибку, там пишет: Script Error: cannot add time interval to nothing. Очень бы хотелось получить быстрый ответ, потому что мне этот скрипт очень нужен. Спасибо.
     
     
     
    psamsig
    Guest
    #5
    0
    08.07.2010 14:55:00
    Это должно работать: # Название: Средняя загрузка ЦП
    # Настройка планировщика для запуска этого с интервалом в 1 секунду (Частота дискретизации)
    # Настройка информационных логов для вывода в терминал в системном журналировании
    #
    # maxsamples — это количество образцов загрузки ЦП для хранения
    # Экспериментируйте со значением, чтобы увеличить или уменьшить количество образцов
    # Чем больше значение, тем дольше рассчитывается средняя загрузка ЦП.
    :local maxsamples 20

    # Получение образцов загрузки ЦП, ограничение cpuarray до размера массива
    :global cpuarray
    :set cpuarray ([/system resource get cpu-load] , [:pick $cpuarray 0 ($maxsamples - 1)])

    # Сложение всех значений в массиве
    :local arraytot 0
    :foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};

    # Деление суммы значений массива на количество значений в cpuarray
    :local arraysize [:len $cpuarray]
    :local avgcpuload ($arraytot / $arraysize)

    # Отображение результатов в окне терминала
    :log info ("Захват загрузки ЦП:")
    :log info $cpuarray
    :log info ("Общая сумма массива: $arraytot")
    :log info ("Размер массива: $arraysize из $maxsamples")
    :global highavgcpuload
    :if ([:len $highavgcpuload] = 0 || $highavgcpuload < $avgcpuload) do={:set highavgcpuload $avgcpuload}
    :log info ("Загрузка ЦП - Среднее: $avgcpuload Высокое: $highavgcpuload")

    # Перезагрузка, если все образцы показывают высокую загрузку
    :if ($arraysize = $maxsamples && $avgcpuload >= 100)  do={ /system reboot; }
     
     
     
    jwelebd
    Guest
    #6
    0
    15.05.2011 15:26:00
    Но мне нужно логировать, какой профиль использует больше CPU. Или какой профиль загружает процессор более чем на 30-50%.
     
     
     
    dssmiktik
    Guest
    #7
    0
    15.05.2011 20:50:00
    Средняя загрузка CPU >= 100. Ну, надеюсь, что загрузка CPU (или среднее значение) никогда не будет выше 100!
     
     
     
    xunil76
    Guest
    #8
    0
    03.12.2011 04:49:00
    У нас в поле есть несколько единиц RB750 (НЕ RB750G), которые совершенно не справляются с количеством людей, подключающихся через Hotspot там, где они установлены, и это приводит к тому, что единицы загружаются на 100% по использованию ЦП. Эти клиенты постоянно звонят нам, потому что не могут войти в систему, и нам приходится подключаться к устройствам удаленно через telnet, чтобы выдать команду перезагрузки, потому что Winbox всегда время измеряет до того, как процесс входа завершится, или просто висит там бесконечно и никогда не измеряет время, но также ничего не делает. Обычно нам приходится перезагружать эти устройства как минимум один раз в день, но обычно 2-3 раза в день, в зависимости от количества людей, подключающихся в любую данную ночь. Когда нам приходится подключаться по telnet и перезагружать, обычно требуется от 5 до 15 минут, чтобы мы могли успешно войти в систему и чтобы команда перезагрузки фактически зарегистрировалась на устройстве и вызвала перезагрузку. Это становится очень утомительным для нас, и это нехорошо для наших клиентов, потому что они (понятно) очень расстраиваются, постоянно звоня нам. Перезагрузка решает проблему, и обычно требуется некоторое время, прежде чем ЦП снова загрузится на 100%. Я уже знаю, что устройствам нужно обновить, и мы в процессе попыток убедить нашего клиента сделать это (другая компания владеет/эксплуатирует оборудование, а мы занимаемся выставлением счетов, технической поддержкой и мониторингом состояния системы), но требуется время, чтобы они получили одобрение на стоимость замены, а также для планирования выезда техника для установки нового оборудования, и нам нужно временное решение, чтобы не тратить много времени на ручную перезагрузку этих устройств. Я пробовал скрипты из этой темы, но следующая строка (если я неправильно ее интерпретирую) заставляет меня думать, что я должен настроить запись "/system logging", которая устанавливает "info" с действием "echo". # Установить ведение журнала info для echo в терминале в системном ведении журнала однако, когда я это делаю (даже сразу после перезагрузки устройства и оно больше не работает на 100% ЦП), действие ведения журнала info на самом деле приводит к тому, что ЦП загружается на 100%, что по сути сводит на нет цель скрипта, и если оставить это в силе, то фактически вызовет перезагрузку системы каждые 5 минут (я установил интервал планировщика равным 10 секунд, а "arraysize" равным 30), вместо того, чтобы только тогда, когда система на самом деле загружена на 100%, и мы вручную перезагружаем ее. Есть ли какой-нибудь другой скрипт, который позволит системе перезагрузиться сама после 5 минут 100% загрузки ЦП, который на самом деле не заставит устройство загружаться на 100% загрузки ЦП?
     
     
     
    psamsig
    Guest
    #9
    0
    03.12.2011 17:43:00
    Тебе не нужна логика для основной функции - перезагрузка при высокой нагрузке. Можешь даже удалить все строки, начинающиеся с ":log".
     
     
     
    n21roadie
    Guest
    #10
    0
    29.12.2011 00:30:00
    Я изменил вышеприведенный скрипт, чтобы он соответствовал моим требованиям, но как новичок в этом деле, хотел бы узнать, правильно ли я его закодировал для следующей задачи: каждые 15 минут планировщик запускает скрипт =RebootOnHighCPU. Если ресурсы системы менее 5%, он в течение 20 секунд сравнивает загрузку ЦП. Если загрузка ЦП превышает 100% (например, если по совпадению скрипт совпал с кратковременной высокой загрузкой ЦП), он отправляет электронное письмо и автоматически перезагружает роутер. В электронном письме указано имя роутера и время перезагрузки. Если ресурсов системы более 5% свободно, отменяются остальные действия скрипта, чтобы не выполнять ненужную задачу. Все верно?

    /system scheduler
    add comment="" disabled=no interval=15m name=RebootOnHighCPU on-event="/system script run RebootOnHighCPU" policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive start-date=jan/01/1970 start-time=startup /system script
    add name=RebootOnHighCPU Код скрипта:
    global datum
    [/system clock get date];
    :global time
    [/system clock get time];
    :local percentfree ((100 * [/system resource get free-memory]) / [/system resource get total-memory])
    /system resource
    :if ($percentfree < 5) do={:local maxsamples 20
    :global cpuarray
    :set cpuarray ([/system resource get cpu-load] , [:pick $cpuarray 0 ($maxsamples - 1)])
    :local arraytot 0
    :foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};
    :local arraysize [:len $cpuarray]
    :local avgcpuload ($arraytot / $arraysize)
    :log info ("CPU Load Captures:")
    :log info $cpuarray
    :log info ("Array Total: $arraytot")
    :log info ("Array size: $arraysize of $maxsamples")
    :global highavgcpuload
    :if ([:len $highavgcpuload] = 0 || $highavgcpuload < $avgcpuload) do={:set highavgcpuload $avgcpuload}
    :log info ("CPU Load - Avg: $avgcpuload High: $highavgcpuload")
    :if ($arraysize = $maxsamples && $avgcpuload >= 100)
    }
     /tool e-mail send server=000.000.000.000 to="xxxxxxx@hotmail.com" subject=[/system identity get name] from="xxxxxxx@nospam.com" body=(" on $datum at $time the memory on this repeater got to ", [/system resource get free-memory])
     /system reboot;
    };
     
     
     
    n21roadie
    Guest
    #11
    0
    29.12.2011 17:11:00
    Нашёл, что мой скрипт просто перезагружается при запуске, поэтому отредактировал. Теперь, надеюсь, будет работать правильно, но у меня пока нет роутера с высокой загрузкой ЦП. Странная просьба (обычно пользователи ищут советы по снижению загрузки ЦП), но есть ли какие-нибудь предложения, как имитировать высокую загрузку ЦП, чтобы протестировать этот скрипт?

    :global datum [/system clock get date];
    :global time [/system clock get time];
    {:local maxsamples 20
    :global cpuarray
    :set cpuarray ([/system resource get cpu-load] , [:pick $cpuarray 0 ($maxsamples - 1)])
    :local arraytot 0
    :foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};
    :local arraysize [:len $cpuarray]
    :local avgcpuload ($arraytot / $arraysize)
    :log info ("CPU Load Captures:")
    :log info $cpuarray
    :log info ("Array Total: $arraytot")
    :log info ("Array size: $arraysize of $maxsamples")
    :global highavgcpuload
    :if ([:len $highavgcpuload] = 0 || $highavgcpuload < $avgcpuload) do={:set highavgcpuload $avgcpuload}
    :log info ("CPU Load - Avg: $avgcpuload High: $highavgcpuload")
    :if ($arraysize = $maxsamples && $avgcpuload >= 100)
    }
    /tool e-mail send server=000.000.000.000 to="xxxxxxx@hotmail.com" subject=[/system identity get name] from="xxxxxxx@nospam.com" body=(" on $datum at $time the memory on this repeater got to ", [/system resource get free-memory])
     /system reboot;
    };
     
     
     
    THG
    Guest
    #12
    0
    29.12.2011 23:21:00
    Тест пропускной способности TCP до localhost (127.0.0.1). Если у вас есть правило брандмауэра, которое отбрасывает все входящие соединения, отключите его перед запуском теста.
     
     
     
    n21roadie
    Guest
    #13
    0
    30.12.2011 00:58:00
    Спасибо, я снова изменил скрипт и попробовал 20 образцов, но оказалось, что процессор, работающий на 100%, не может выполнить задачу и выдаёт неверное среднее значение, из-за чего роутер не перезагружается. Поэтому я уменьшил `maxsample` до 5, и с 100% нагрузкой он перезагружается.

    :global datum [/system clock get date];
    :global time [/system clock get time];
    :local maxsamples 5
    :global cpuarray
    :set cpuarray ([/system resource get cpu-load] , [:pick $cpuarray 0 ($maxsamples - 1)])
    :local arraytot 0
    :foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};
    :local arraysize [:len $cpuarray]
    :local avgcpuload ($arraytot / $arraysize)
    :log info ("CPU Load Captures:")
    :log info $cpuarray
    :log info ("Array Total: $arraytot")
    :log info ("Array size: $arraysize of $maxsamples")
    :global highavgcpuload
    :if ([:len $highavgcpuload] = 0 || $highavgcpuload < $avgcpuload) do={:set highavgcpuload $avgcpuload}
    :log info ("CPU Load - Avg: $avgcpuload High: $highavgcpuload")
    :if ($arraysize = $maxsamples && $avgcpuload >= 100) do={
    /tool e-mail send server=000.000.000.000 to="xxxxxxx@hotmail.com" subject=[/system identity get name] from="xxxxxxx@nospam.com" body=[/system identity get name] ," At $time the CPU Load on this router was running at 100%")
    /system reboot;
    };
     
     
     
    n21roadie
    Guest
    #14
    0
    13.06.2012 08:52:00
    Попробовал скрипт на CPE OS v5.17, настроенной как PPPoe-клиент. В процессе тестирования из лог-файла заметил, что он запускает только 1 или, возможно, 2 из 5 образцов с загрузкой CPU на 100%, этого явно недостаточно для расчетов. Еще заметил, что лог забит попытками подключения PPPoe до и после запуска этих 1-2 образцов. Я отключил PPPoe-клиента, но логирование попыток подключения все равно продолжается.
     
     
     
    orfi
    Guest
    #15
    0
    17.08.2017 16:23:00
    Придется устанавливать этот скрипт на более мощную машину с 36 ядрами, но он не работает. Есть какие-нибудь идеи?
     
     
     
    IntrusDave
    Guest
    #16
    0
    17.08.2017 17:36:00
    Это эффект наблюдателя, как известно в физике. Просто запуск скрипта для мониторинга нагрузки уже увеличит эту нагрузку и, соответственно, сделает результаты недействительными. Чем сложнее скрипт, тем выше нагрузка, и чем слабее процессор, тем выше нагрузка. Лучше было бы использовать `fetch` и отправлять HTTP POST-запрос с текущей загрузкой процессора на сервер каждые 60 секунд, а уже сервер пусть делает всю работу.
     
     
     
    n21roadie
    Guest
    #17
    0
    17.08.2017 20:40:00
    Полностью согласен!
     
     
     
    EIKA
    Guest
    #18
    0
    31.12.2017 18:28:00
    Всем привет! Похоже, этот синтаксис больше невалиден для ROS 6.41. Не могли бы вы подсказать, как его исправить?:foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры