Community discussions

MikroTik App
 
User avatar
rgraham
Frequent Visitor
Frequent Visitor
Topic Author
Posts: 59
Joined: Thu May 05, 2005 10:50 pm
Location: USA Minneapolis, Minnesota

A script to calculate Average CPU Load

Fri Apr 18, 2008 6:16 pm

# Name : Average CPU Load
# Set up the scheduler to run this at a 1 second intervals (Sample Rate)
# Set info logs to echo to Terminal in System Logging

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

# arraysize is the number of cpu-Load samples to keep
# Experiment with this value to incease or decrease the number of samples
# The greater the value the longer the time that the cpu-load average is calculated for.
:local arraysize 5

# Get cpu-load samples, limit cpuarray to array size
:set cpuload [/system resource get cpu-load]
:set cpuarray ( [:toarray $cpuload] + $cpuarray )
:set cpuarray [:pick $cpuarray 0 $arraysize]

# add up all values in array
:set arraypos 0
:set arraylen [:len $cpuarray]
:while ($arraypos < $arraylen) do={
:set arraytot ($arraytot + [:pick $cpuarray $arraypos] );
:set arraypos ($arraypos +1)}

# divide sum of array values by the number of values in cpuarray
:set avgcpuload ($arraytot / [:len $cpuarray])
:if ([:len $highavgcpuload] = 0) do={:set highavgcpuload $avgcpuload}
:if ([$highavgcpuload] < [$avgcpuload]) do={:set highavgcpuload $avgcpuload}

# Display results in Terminal window
: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")
Randy
 
User avatar
thavinci
Member
Member
Posts: 334
Joined: Sat Aug 04, 2007 4:40 pm
Location: Johannessburg
Contact:

Re: A script to calculate Average CPU Load

Fri Apr 25, 2008 7:31 am

[admin@oldPPPOES] /system script> run cpuload
Script Error: cannot add time interval to nothing
[admin@oldPPPOES] /system script>
Unfortunately didn't work here, but havent really had a look at it yet.
Wan't to use this script and modify it to accomadate for bugs in latest ROS that causes 100% cpu usage and lockup.
Want this script to monitor and when cpu usage = 100 over so many samples, reboot router.
Till MT sorts issues out.



Advise?


Thank You for script!
http://www.thavinci.za.net

echo "Demo license expired!"
echo "Please reinstall the router."
echo
kill -WINCH 1
exit
 
User avatar
thavinci
Member
Member
Posts: 334
Joined: Sat Aug 04, 2007 4:40 pm
Location: Johannessburg
Contact:

Re: A script to calculate Average CPU Load

Mon Apr 28, 2008 12:43 am

Solved it, my stupidity....
Also modified it to accommodate mikrotik bugs.
The following modification monitors router for 20 seconds.
If in 20 seconds the router's cpu usage stays at 100%, it will reboot it.

In scheduler create job that starts on start-up and runs at one second intervals...

Add code:
# Name : Average CPU Load
# Set up the scheduler to run this at a 1 second intervals (Sample Rate)
# Set info logs to echo to Terminal in System Logging

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

# arraysize is the number of cpu-Load samples to keep
# Experiment with this value to incease or decrease the number of samples
# The greater the value the longer the time that the cpu-load average is calculated for.
:local arraysize 20

# Get cpu-load samples, limit cpuarray to array size
:set cpuload [/system resource get cpu-load]
:set cpuarray ( [:toarray $cpuload] + $cpuarray )
:set cpuarray [:pick $cpuarray 0 $arraysize]

# add up all values in array
:set arraypos 0
:set arraylen [:len $cpuarray]
:while ($arraypos < $arraylen) do={
:set arraytot ($arraytot + [:pick $cpuarray $arraypos] );
:set arraypos ($arraypos +1)}

# divide sum of array values by the number of values in cpuarray
:set avgcpuload ($arraytot / [:len $cpuarray])
:if ([:len $highavgcpuload] = 0) do={:set highavgcpuload $avgcpuload}
:if ([$highavgcpuload] < [$avgcpuload]) do={:set highavgcpuload $avgcpuload}

# Display results in Terminal window
: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")

:if ($avgcpuload >= 100)  do={ /system reboot; }
http://www.thavinci.za.net

echo "Demo license expired!"
echo "Please reinstall the router."
echo
kill -WINCH 1
exit
 
mrzero
just joined
Posts: 8
Joined: Sun Sep 06, 2009 9:47 am

Re: A script to calculate Average CPU Load

Sat Apr 24, 2010 6:50 am

thanks but it doesn't run and when running in terminal to see the error it said:
Script Error: cannot add time interval to nothing
i wish replying fast as i need this script badly.
thanks
 
psamsig
Member Candidate
Member Candidate
Posts: 161
Joined: Sun Dec 06, 2009 1:36 pm
Location: Denmark

Re: A script to calculate Average CPU Load

Thu Jul 08, 2010 5:55 pm

This should work:
# Name : Average CPU Load
# Set up the scheduler to run this at a 1 second intervals (Sample Rate)
# Set info logs to echo to Terminal in System Logging
#
# maxsamples is the number of cpu-Load samples to keep
# Experiment with this value to incease or decrease the number of samples
# The greater the value the longer the time that the cpu-load average is calculated for.
:local maxsamples 20

# Get cpu-load samples, limit cpuarray to array size
:global cpuarray
:set cpuarray ([/system resource get cpu-load] , [:pick $cpuarray 0 ($maxsamples - 1)])

# add up all values in array
:local arraytot 0
:foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};

# divide sum of array values by the number of values in cpuarray
:local arraysize [:len $cpuarray]
:local avgcpuload ($arraytot / $arraysize)

# Display results in Terminal window
: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")

#reboot if all samples show highload
:if ($arraysize = $maxsamples && $avgcpuload >= 100)  do={ /system reboot; }
 
jwelebd
Frequent Visitor
Frequent Visitor
Posts: 72
Joined: Wed May 31, 2006 12:20 am
Location: Dhaka
Contact:

Re: A script to calculate Average CPU Load

Sun May 15, 2011 6:26 pm

But I need to log which profile is using higher cpu. Or which profile is going more than 30% to 50%
 
dssmiktik
Forum Veteran
Forum Veteran
Posts: 732
Joined: Fri Aug 17, 2007 8:42 am

Re: A script to calculate Average CPU Load

Sun May 15, 2011 11:50 pm

$avgcpuload >= 100
I should hope CPU (or average value) would never be higher than 100! :lol:
Doug
 
xunil76
newbie
Posts: 43
Joined: Fri May 20, 2011 12:48 am

Re: A script to calculate Average CPU Load

Sat Dec 03, 2011 6:49 am

we have some RB750 units out in the field (NOT RB750G) that are completely inadequate for the number of people logging in via Hotspot where they are installed, and it is causing the units to max out at 100% CPU usage. these customers are constantly calling us because they cannot login as a result, and we have to login to the units remotely via telnet to issue a reboot command, because Winbox always times out before the login process can complete, or it just sits there indefinitely and never times out, but also never does anything.

we usually have to reboot these units at least once a day, but usually 2 - 3 times a day, depending on how many people are logging in on any given night. when we do have to telnet in and reboot, it tends to take between 5 - 15 minutes for us to be able to get logged in successfully, and for the reboot command to actually register on the unit and cause the reboot to take place. this gets very tiresome for us, and is not good for our customers because they are (understandably) getting very frustrated having to call us all the time. a reboot does resolve the issue, and it normally takes a while for the CPU to max out at 100% again.

i already know that the units need to be upgraded, and we are in the process of trying to have our client do just that (another company owns/runs the equipment, and we do the billing, tech suppot & system health monitoring for them), but it takes time for them to get approval for the cost of replacing them, as well as scheduling a tech to go out & install the replacement equipment, and we need a temporary solution in the meantime so that we are not constantly having to waste a lot of time manually rebooting these things.

i tried the scripts in this thread, but the line below (unless i'm interpreting it incorrectly) leads me to believe that i am supposed to set up a "/system logging" entry that sets "info" to have an action of "echo".
# Set info logs to echo to Terminal in System Logging
however, when i do this (even right after rebooting the unit & it is not running at 100% anymore), the info logging action actually causes the CPU to max out at 100%, which basically defeats the purpose of the script, and if left in place, would actually cause the system to reboot every 5 minutes (i set the scheduler interval to 10 seconds, and the "arraysize" to 30), instead of only when the system is actually maxing out at 100% on its own and we manually reboot it.

is there any other script that would allow the system to reboot itself after 5 minutes of 100% CPU load, which does not actually cause the unit to max out at 100% CPU load?
 
psamsig
Member Candidate
Member Candidate
Posts: 161
Joined: Sun Dec 06, 2009 1:36 pm
Location: Denmark

Re: A script to calculate Average CPU Load

Sat Dec 03, 2011 7:43 pm

You don't need any logging for it to do it's main purpose, rebooting on high load, you can even remove all lines starting with ':log'
 
n21roadie
Forum Guru
Forum Guru
Posts: 1896
Joined: Fri Aug 07, 2009 10:36 pm
Location: Limerick,Ireland

Re: A script to calculate Average CPU Load

Thu Dec 29, 2011 2:30 am

I have modified the above script to suit my requirements but would ask as I am new to this if I have it correctly coded for the following task;
Every 15mins scheduler runs the script =RebootOnHighCPU if the system resources are less 5% then it will for 20 seconds compare CPU load and if greater than 100% (this if by chance the script coincided with a momentary CPU high load?) it will send a email and then auto-reboot the router, on the email it will detail the name of the router the time it was rebooted, If the system resource is more than 5% free cancel the rest of the script so not to run a un-necessary task, am i correct with this.
/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
Code for script
: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,
Network 100% MT for Now?
 
n21roadie
Forum Guru
Forum Guru
Posts: 1896
Joined: Fri Aug 07, 2009 10:36 pm
Location: Limerick,Ireland

Re: A script to calculate Average CPU Load

Thu Dec 29, 2011 7:11 pm

Discovered my script just auto reboots on running so i edited, now hopefully it will work correctly but at present i don't have a router with high CPU load.

Strange request (normally users would be seeking advice to reduce CPU load)but any suggestions how to simulate high CPU load to test this script?


: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;
};
N21roadie,
Network 100% MT for Now?
 
User avatar
THG
Member
Member
Posts: 472
Joined: Thu Oct 15, 2009 1:05 am

Re: A script to calculate Average CPU Load

Fri Dec 30, 2011 1:21 am

Strange request (normally users would be seeking advice to reduce CPU load)but any suggestions how to simulate high CPU load to test this script?
TCP Bandwidth Test to localhost (127.0.0.1). If you have a firewall rule that drops everything to input chain, disable it before you run the test.
 
n21roadie
Forum Guru
Forum Guru
Posts: 1896
Joined: Fri Aug 07, 2009 10:36 pm
Location: Limerick,Ireland

Re: A script to calculate Average CPU Load

Fri Dec 30, 2011 2:58 am

Strange request (normally users would be seeking advice to reduce CPU load)but any suggestions how to simulate high CPU load to test this script?
TCP Bandwidth Test to localhost (127.0.0.1). If you have a firewall rule that drops everything to input chain, disable it before you run the test.
Thank you, I modified the script again and tried 20 samples but it appeared like the CPU running @100% could not run the task and gave a incorrect average so the router would not reboot so i dropped the maxsample to 5 and then with 100% load it reboots
: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,
Network 100% MT for Now?
 
n21roadie
Forum Guru
Forum Guru
Posts: 1896
Joined: Fri Aug 07, 2009 10:36 pm
Location: Limerick,Ireland

Re: A script to calculate Average CPU Load

Wed Jun 13, 2012 11:52 am

Tried the script on a CPE OS v5.17 which is setup as pppoe client and in testing, I noticed from the log file it will not run the 5 samples with CPU running @100% but just 1 and maybe 2 which is not enough for calculation, also I note the log is full of pppoe dial-out attempts before and after the 1 or 2 cpu samples , I disabled pppoe client but dial out logging continues.
N21roadie,
Network 100% MT for Now?
 
orfi
just joined
Posts: 1
Joined: Thu Aug 17, 2017 1:32 pm

Re: A script to calculate Average CPU Load

Thu Aug 17, 2017 7:23 pm

i have to install that script on a newer machine with 36 cores , and is not working. any ideea ?
 
IntrusDave
Forum Guru
Forum Guru
Posts: 1290
Joined: Fri May 09, 2014 4:36 am
Location: Rancho Cucamonga, CA

Re: A script to calculate Average CPU Load

Thu Aug 17, 2017 8:36 pm

This is the Observer effect as known in physics. Just running a script to monitor the load will increase the load and therefore make the results invalid. The more complicated the script, the higher the load, and the weaker the cpu, the higher the load.

A better way to do this would be a use fetch and send an http post with the current CPU load to a server every 60 seconds, then let the server do the work.
David Joyce
Network & Security Engineer
Intrus Technologies, LLC.
Rancho Cucamonga, CA, USA
 
n21roadie
Forum Guru
Forum Guru
Posts: 1896
Joined: Fri Aug 07, 2009 10:36 pm
Location: Limerick,Ireland

Re: A script to calculate Average CPU Load

Thu Aug 17, 2017 11:40 pm

This is the Observer effect as known in physics. Just running a script to monitor the load will increase the load and therefore make the results invalid. The more complicated the script, the higher the load, and the weaker the cpu, the higher the load.

A better way to do this would be a use fetch and send an http post with the current CPU load to a server every 60 seconds, then let the server do the work.
I totally agree !
 
User avatar
EIKA
just joined
Posts: 10
Joined: Thu Dec 28, 2017 7:29 pm
Location: Moscow, Russia

Re: A script to calculate Average CPU Load

Sun Dec 31, 2017 8:28 pm

Hi all!

Looks like this syntax isn't valid for ROS 6.41 anymore. Could you please suggest how to correct it?
:foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};
 
n21roadie
Forum Guru
Forum Guru
Posts: 1896
Joined: Fri Aug 07, 2009 10:36 pm
Location: Limerick,Ireland

Re: A script to calculate Average CPU Load

Sun Dec 31, 2017 10:11 pm

Hi all!

Looks like this syntax isn't valid for ROS 6.41 anymore. Could you please suggest how to correct it?
:foreach o in=$cpuarray do={:set arraytot ($arraytot + $o)};
I gave up a long time ago trying to use a script to calculate CPU load as it was only accurate during low CPU load, higher CPU load gave inaccurate results or the script did not run ?
 
User avatar
EIKA
just joined
Posts: 10
Joined: Thu Dec 28, 2017 7:29 pm
Location: Moscow, Russia

Re: A script to calculate Average CPU Load

Mon Jan 01, 2018 2:34 pm

It could be. But what with syntax? Can you fix it? I am intened to set it up fo 90% or something. 100% is not a good idea, because script can't be run in the most of cases.

Who is online

Users browsing this forum: No registered users and 63 guests