Skip to content
Snippets Groups Projects
LoadMonitor.java 7.63 KiB
package net.floodlightcontroller.util;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;

import net.floodlightcontroller.core.annotations.LogMessageDocs;
import net.floodlightcontroller.core.annotations.LogMessageDoc;

public class LoadMonitor implements Runnable {

    public enum LoadLevel {
        OK,
        HIGH,
        VERYHIGH,
    }

    public LoadLevel getLoadLevel() {
        return loadlevel ;
    }

    public double getLoad() {
        return load ;
    }

    public static final int LOADMONITOR_SAMPLING_INTERVAL = 1000; // mili-sec
    public static final double THRESHOLD_HIGH = 0.90;
    public static final double THRESHOLD_VERYHIGH = 0.95;
    public static final int MAX_LOADED_ITERATIONS = 5;
    public static final int MAX_LOAD_HISTORY = 5;

    protected volatile double load;
    protected volatile LoadLevel loadlevel;
    protected int itersLoaded;

    protected boolean isLinux;
    protected int numcores;
    protected int jiffyNanos;
    protected long[] lastNanos;
    protected long[] lastIdle;
    protected Logger log;

    public LoadMonitor(Logger log_) {
        log = log_;
        loadlevel = LoadLevel.OK;
        load = 0.0;
        itersLoaded = 0;

        lastNanos = new long[MAX_LOAD_HISTORY];
        lastIdle = new long[MAX_LOAD_HISTORY];
        for (int i=0 ; i<MAX_LOAD_HISTORY ; i++) {
            lastNanos[i] = 0L;
            lastIdle[i] = 0L;
        }

        isLinux = System.getProperty("os.name").equals("Linux");
        numcores = 1;
        jiffyNanos = 10 * 1000 * 1000;
        if (isLinux) {
            try {
                numcores = Integer.parseInt(
                        this.runcmd("/usr/bin/nproc"));
                jiffyNanos = (1000 * 1000 * 1000) / Integer.parseInt(