아키텍처와 함께

블로그 이미지
by gregorio
  • Total hit
  • Today hit
  • Yesterday hit

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}






AND

ARTICLE CATEGORY

분류 전체보기 (56)
Spring Framrwork (33)
Linux (1)
APM (1)
Java (8)
python (0)
ant (1)
chart (1)
OS (1)
tomcat (1)
apache (1)
database (0)

RECENT ARTICLE

RECENT COMMENT

CALENDAR

«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

ARCHIVE

LINK