+ } else
+ logger("Function ".$funcname." does not exist");
+
+ // Quit the poller once every hour
+ if (time() > ($starttime + 3600))
+ return;
+
+ // Count active workers and compare them with a maximum value that depends on the load
+ if (poller_too_much_workers())
+ return;
+ }
+
+}
+
+function poller_too_much_workers() {
+
+ $queues = get_config("system", "worker_queues");
+
+ if ($queues == 0)
+ $queues = 4;
+
+ $active = poller_active_workers();
+
+ // Decrease the number of workers at higher load
+ if(function_exists('sys_getloadavg')) {
+ $load = max(sys_getloadavg());
+
+ $maxsysload = intval(get_config('system','maxloadavg'));
+ if($maxsysload < 1)
+ $maxsysload = 50;
+
+ $maxworkers = $queues;
+
+ // Some magical mathemathics to reduce the workers
+ $exponent = 3;
+ $slope = $maxworkers / pow($maxsysload, $exponent);
+ $queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
+
+ logger("Current load: ".$load." - maximum: ".$maxsysload." - current queues: ".$active." - maximum: ".$queues, LOGGER_DEBUG);
+