카테고리 없음

Java를 이용한 서버 CPU, 메모리 자원 모니터링

gregorio 2018. 7. 6. 15:16

Java를 이용하여 시스템에 대한 CPU, 메모리의 정보를 받아오기 위해서 sigar Library를 이용하면 쉽고 정확하게 원하는 정보를 추출할 수 있다.


sigar는 scouter APM 툴에서 서버의 자원을 모니터링하기 위해서 사용하고 있다.


■ 소스 예제


import java.util.HashMap;

import java.util.Map;


import org.hyperic.sigar.CpuPerc;

import org.hyperic.sigar.DirStat;

import org.hyperic.sigar.DiskUsage;

import org.hyperic.sigar.FileSystem;

import org.hyperic.sigar.FileSystemUsage;

import org.hyperic.sigar.Mem;

import org.hyperic.sigar.NetFlags;

import org.hyperic.sigar.NetInterfaceConfig;

import org.hyperic.sigar.NetInterfaceStat;

import org.hyperic.sigar.Sigar;

import org.hyperic.sigar.SigarProxy;

import org.hyperic.sigar.SigarProxyCache;

import org.hyperic.sigar.Swap;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


public class HostPerf {


private static final Logger LOGGER = LoggerFactory.getLogger(HostPerf.class);


static int SLEEP_TIME = 2000;

static Sigar sigarImpl = new Sigar();

static SigarProxy sigar = SigarProxyCache.newInstance(sigarImpl, SLEEP_TIME);


public static Map<String, Float> getCpuUsage() throws Exception {

Map<String, Float> cpuInfo = new HashMap<String, Float>();

CpuPerc cpuPerc = sigar.getCpuPerc();

float idle = (float) cpuPerc.getIdle();

float cpu = (float) ((1.0D - idle) * 100.0D);

float sysCpu = (float) cpuPerc.getSys() * 100.0F;

float userCpu = (float) cpuPerc.getUser() * 100.0F;


cpuInfo.put("cpuUsed", cpu);

cpuInfo.put("cpuFree", idle);

cpuInfo.put("sysCpu", sysCpu);

cpuInfo.put("userCpu", userCpu);


return cpuInfo;

}


public static Map<String, Float> getMemInfo() throws Exception {

Map<String, Float> memInfo = new HashMap<String, Float>();

Mem m = sigar.getMem();

float tmem = m.getTotal();

float fmem = m.getActualFree();

float umem = m.getActualUsed();

float memrate = (float) m.getUsedPercent();

memInfo.put("memTotal", tmem);

memInfo.put("memFree", fmem);

memInfo.put("memUsed", umem);

memInfo.put("memRate", memrate);


Swap sw = sigar.getSwap();


float pagein = sw.getPageIn();

float pageout = sw.getPageOut();

float tswap = sw.getTotal();

float uswap = sw.getUsed();

float swaprate = tswap == 0L ? 0.0F : (float) uswap * 100.0F / (float) tswap;


memInfo.put("pageIn", pagein);

memInfo.put("pageOut", pageout);

memInfo.put("swapTotal", tswap);

memInfo.put("swapUsed", uswap);

memInfo.put("swapRate", swaprate);


return memInfo;

}

}


소스코드를 수행하면 다음과 같은 오류메세지가 발생한다.


■ 오류 


no sigar-amd64-winnt.dll in java.library.path

org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path 

위의 오류를 해결하기 위해 sigar에서 제공하는 OS 환경에 맞는 Library를 설정해야한다.


먼저 hyperic-sigar-1.6.4.zip를 다운로드하여 압축을 해제한 후 Runtime 환경에 맞는 Library를 디렉토리에 Copy 한다.


프로그램을 실행할 때 JVM 파라미터로 -Djava.library.path=Library Directory 입력한 후 프로그램을 실행한다.


■ 실행결과


 


{cpuFree=0.92296225, cpuUsed=7.7037754, userCpu=1.4910537, sysCpu=5.417495}

{memFree=6.194135E8, swapUsed=6.4725484E9, memTotal=4.19631923E9, swapTotal=8.3907338E9, pageIn=2.0350976E8, memUsed=3.57690573E9, pageOut=1691194.0, swapRate=77.139244, memRate=85.23912}