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} |