2013년 12월 19일 목요일

JMX 사용




/**
 * 서버 IP별로 JMX(CPU, Memory)를 검사하고 저장한다 .
 * 
 * @param configId
 */
@Override
public void jmxCpuAndMemoryCheck(Long configId) {
List<ServerList> serverLists = healthCheckRepository.findServerList(configId);
JMXConnector jmxConnector = null;
Map<String, Object> params = null;
try {
for (ServerList serverList : serverLists) {
try {
jmxConnector = getJMXConnector(serverList.getIp(), JMX_PORT,
JMX_ID, JMX_PASSWORD);
MBeanServerConnection mbs = jmxConnector.getMBeanServerConnection();
params = new HashMap<String, Object>();
params.put("projectId", serverList.getProjectId());
params.put("ip", serverList.getIp());
params.put("useCpu", useCpu(mbs));
params.put("useMemory", useMemory(mbs));
jmxRepository.jmxMemorySave(params);
jmxRepository.jmxCpuSave(params);
} catch (Exception e) {
logger.error("Exception : " + e);
} finally {
if (jmxConnector != null)
jmxConnector.close();
}
}
} catch (Exception e) {
logger.error("Exception : " + e);
}
}
/**
 * JMX Server에 Connection 한다.
 * 
 * @param url
 *            SERVER-IP
 * @param port
 *            PORT
 * @param usr
 *            아이디
 * @param pwd
 *            암호
 * @return JMXConnector
 */
private JMXConnector getJMXConnector(String url, String port, String usr, String pwd) throws Exception {
String serviceUrl = "service:jmx:rmi:///jndi/rmi://" + url + ":" + port + "/jmxrmi";
if (usr == null || usr.trim().length() <= 0 || pwd == null || pwd.trim().length() <= 0) {
return JMXConnectorFactory.connect(new JMXServiceURL(serviceUrl));
}
Map<String, Object> envMap = new HashMap<String, Object>();
envMap.put("jmx.remote.credentials", new String[] { usr, pwd });
envMap.put(Context.SECURITY_PRINCIPAL, usr);
envMap.put(Context.SECURITY_CREDENTIALS, pwd);
return JMXConnectorFactory.connect(new JMXServiceURL(serviceUrl), envMap);
}
/**
 * 메모리 사용률을 가져온다.
 * 
 * @param MBeanServerConnection
 * @return useMemory 메모리사용률
 */
private int useMemory(MBeanServerConnection mbs) throws Exception {
MemoryUsage memoryUsage = MemoryUsage.from(
             (CompositeData) mbs.getAttribute( new ObjectName(ManagementFactory.MEMORY_MXBEAN_NAME),
                     "HeapMemoryUsage"));
long totalMemory = memoryUsage.getMax();
long useMemory = memoryUsage.getUsed();
double useMemoryDiv = ((double)useMemory / (double)totalMemory) * 100;
    /* 시스템 메모리 사용량(막음) */
     /*
    OperatingSystemMXBean osbean = ManagementFactory.newPlatformMXBeanProxy(mbs,
ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);
long totalMemory = osbean.getTotalPhysicalMemorySize();
long freeMemory = osbean.getFreePhysicalMemorySize();
double useMemory = ((double) (totalMemory - freeMemory) / (double) totalMemory) * 100;
*/
return (int) Math.round(useMemoryDiv);
}
/**
 * CPU 사용률을 가져온다.
 * 
 * @param MBeanServerConnection
 * @return cpuUsage CPU사용률
 */
@SuppressWarnings("restriction")
private int useCpu(MBeanServerConnection mbs) throws Exception {
RuntimeMXBean runbean = ManagementFactory.newPlatformMXBeanProxy(mbs, ManagementFactory.RUNTIME_MXBEAN_NAME,
RuntimeMXBean.class);
OperatingSystemMXBean op = ManagementFactory.newPlatformMXBeanProxy(mbs,
ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);
long cpuCount = Math.max(1, op.getAvailableProcessors());
long prevUpTime = runbean.getUptime();
long prevProcessCpuTime = op.getProcessCpuTime();
double cpuUsage;
try {
Thread.sleep(500);
} catch (Exception ignored) {
}
op = ManagementFactory.newPlatformMXBeanProxy(mbs, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME,
OperatingSystemMXBean.class);
long upTime = runbean.getUptime();
long processCpuTime = op.getProcessCpuTime();
long elapsedCpu = processCpuTime - prevProcessCpuTime;
long elapsedTime = upTime - prevUpTime;
cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * cpuCount));
return (int) Math.round(cpuUsage);
}



댓글 없음:

댓글 쓰기