标签:des style blog http color io os 使用 java
一、CPU
使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。"
从/proc文件系统获取cpu使用情况: cat /proc/stat
在Linux的内核中,有一个全 局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是 1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。
[root@localhost LoadBalanceAlg]# cat /proc/stat
cpu 71095 55513 76751 2545622893 303185 4160 47722 0
cpu0 3855 1134 4284 159122519 3882 0 717 0
cpu1 4236 770 5837 159113370 11291 6 865 0
cpu2 4934 1142 5048 158991321 130622 362 2939 0
cpu3 2320 14774 5177 159111528 1417 8 1138 0
cpu4 2694 405 3086 159071174 56284 235 2477 0
cpu5 1701 886 2560 159129034 1316 2 849 0
cpu6 2937 450 2863 159068480 59183 228 2198 0
cpu7 916 316 2426 159130057 1682 1 933 0
cpu8 2543 50 3509 159122844 4467 1 2911 0
cpu9 4761 827 6296 159118849 4490 8 1086 0
cpu10 8517 4236 9148 159102063 9791 173 2382 0
cpu11 22001 29737 14602 159065992 2583 6 1382 0
cpu12 3453 150 3075 159113794 5387 1162 9276 0
cpu13 2120 424 3403 159126526 2608 7 1199 0
cpu14 2637 65 2663 159107796 6704 1914 14503 0
cpu15 1462 142 2763 159127539 1470 39 2859 0
intr 1636622296 1591605869 4 0 4 4 0 0 0 1 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 952 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1005479 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32763528 0 0 0 0 0 0 0 1697776 0 0 0 0 0 0 0 1556158 2 0 0 0 0 0 0 1598011 0 0 0 0 0 0 0 1287622 0 0 0 0 0 0 0 1522517 0 0 0 0 0 0 0 2467360 0 0 0 0 0 0 0 1116999 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 431778894
btime 1363058934
processes 279394
procs_running 1
procs_blocked 0
public class Runtimeextends Object
每个 Java 应用程序都有一个 Runtime
类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime
方法获取当前运行时。
应用程序不能创建自己的 Runtime 类实例。
public abstract class Processextends Object
ProcessBuilder.start()
和Runtime.exec
方法创建一个本机进程,并返回 Process
子类的一个实例,该实例可用来控制进程并获得相关信息。
<span style="font-size:14px;">import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; /** * 采集CPU使用率 */ public class CpuUsage extends ResourceUsage { private static Logger log = Logger.getLogger(CpuUsage.class); private static CpuUsage INSTANCE = new CpuUsage(); private CpuUsage(){ } public static CpuUsage getInstance(){ return INSTANCE; } /** * Purpose:采集CPU使用率 * @param args * @return float,CPU使用率,小于1 */ @Override public float get() { log.info("开始收集cpu使用率"); float cpuUsage = 0; Process pro1,pro2; Runtime r = Runtime.getRuntime(); try { String command = "cat /proc/stat"; //第一次采集CPU时间 long startTime = System.currentTimeMillis(); pro1 = r.exec(command); BufferedReader in1 = new BufferedReader(new InputStreamReader(pro1.getInputStream())); String line = null; long idleCpuTime1 = 0, totalCpuTime1 = 0; //分别为系统启动后空闲的CPU时间和总的CPU时间 while((line=in1.readLine()) != null){ if(line.startsWith("cpu")){ line = line.trim(); log.info(line); String[] temp = line.split("\\s+"); idleCpuTime1 = Long.parseLong(temp[4]); for(String s : temp){ if(!s.equals("cpu")){ totalCpuTime1 += Long.parseLong(s); } } log.info("IdleCpuTime: " + idleCpuTime1 + ", " + "TotalCpuTime" + totalCpuTime1); break; } } in1.close(); pro1.destroy(); try { Thread.sleep(100); } catch (InterruptedException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); log.error("CpuUsage休眠时发生InterruptedException. " + e.getMessage()); log.error(sw.toString()); } //第二次采集CPU时间 long endTime = System.currentTimeMillis(); pro2 = r.exec(command); BufferedReader in2 = new BufferedReader(new InputStreamReader(pro2.getInputStream())); long idleCpuTime2 = 0, totalCpuTime2 = 0; //分别为系统启动后空闲的CPU时间和总的CPU时间 while((line=in2.readLine()) != null){ if(line.startsWith("cpu")){ line = line.trim(); log.info(line); String[] temp = line.split("\\s+"); idleCpuTime2 = Long.parseLong(temp[4]); for(String s : temp){ if(!s.equals("cpu")){ totalCpuTime2 += Long.parseLong(s); } } log.info("IdleCpuTime: " + idleCpuTime2 + ", " + "TotalCpuTime" + totalCpuTime2); break; } } if(idleCpuTime1 != 0 && totalCpuTime1 !=0 && idleCpuTime2 != 0 && totalCpuTime2 !=0){ cpuUsage = 1 - (float)(idleCpuTime2 - idleCpuTime1)/(float)(totalCpuTime2 - totalCpuTime1); log.info("本节点CPU使用率为: " + cpuUsage); } in2.close(); pro2.destroy(); } catch (IOException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); log.error("CpuUsage发生InstantiationException. " + e.getMessage()); log.error(sw.toString()); } return cpuUsage; } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { while(true){ System.out.println(CpuUsage.getInstance().get()); Thread.sleep(5000); } } }</span>
<span style="font-size:14px;">import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; /** * 采集内存使用率 */ public class MemUsage extends ResourceUsage{ private static Logger log = Logger.getLogger(MemUsage.class); private static MemUsage INSTANCE = new MemUsage(); private MemUsage(){ } public static MemUsage getInstance(){ return INSTANCE; } /** * Purpose:采集内存使用率 * @param args * @return float,内存使用率,小于1 */ @Override public float get() { log.info("开始收集memory使用率"); float memUsage = 0.0f; Process pro = null; Runtime r = Runtime.getRuntime(); try { String command = "cat /proc/meminfo"; pro = r.exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(pro.getInputStream())); String line = null; int count = 0; long totalMem = 0, freeMem = 0; while((line=in.readLine()) != null){ log.info(line); String[] memInfo = line.split("\\s+"); if(memInfo[0].startsWith("MemTotal")){ totalMem = Long.parseLong(memInfo[1]); } if(memInfo[0].startsWith("MemFree")){ freeMem = Long.parseLong(memInfo[1]); } memUsage = 1- (float)freeMem/(float)totalMem; log.info("本节点内存使用率为: " + memUsage); if(++count == 2){ break; } } in.close(); pro.destroy(); } catch (IOException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); log.error("MemUsage发生InstantiationException. " + e.getMessage()); log.error(sw.toString()); } return memUsage; } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { while(true){ System.out.println(MemUsage.getInstance().get()); Thread.sleep(5000); } } }</span>
<span style="font-size:14px;">import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; /** * 采集磁盘IO使用率 */ public class IoUsage extends ResourceUsage{ private static Logger log = Logger.getLogger(IoUsage.class); private static IoUsage INSTANCE = new IoUsage(); private IoUsage(){ } public static IoUsage getInstance(){ return INSTANCE; } /** * @Purpose:采集磁盘IO使用率 * @param args * @return float,磁盘IO使用率,小于1 */ @Override public float get() { log.info("开始收集磁盘IO使用率"); float ioUsage = 0.0f; Process pro = null; Runtime r = Runtime.getRuntime(); try { String command = "iostat -d -x"; pro = r.exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(pro.getInputStream())); String line = null; int count = 0; while((line=in.readLine()) != null){ if(++count >= 4){ // log.info(line); String[] temp = line.split("\\s+"); if(temp.length > 1){ float util = Float.parseFloat(temp[temp.length-1]); ioUsage = (ioUsage>util)?ioUsage:util; } } } if(ioUsage > 0){ log.info("本节点磁盘IO使用率为: " + ioUsage); ioUsage /= 100; } in.close(); pro.destroy(); } catch (IOException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); log.error("IoUsage发生InstantiationException. " + e.getMessage()); log.error(sw.toString()); } return ioUsage; } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { while(true){ System.out.println(IoUsage.getInstance().get()); Thread.sleep(5000); } } }</span>
<span style="font-size:14px;">import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; /** * 采集网络带宽使用率 */ public class NetUsage extends ResourceUsage { private static Logger log = Logger.getLogger(NetUsage.class); private static NetUsage INSTANCE = new NetUsage(); private final static float TotalBandwidth = 1000; //网口带宽,Mbps private NetUsage(){ } public static NetUsage getInstance(){ return INSTANCE; } /** * @Purpose:采集网络带宽使用率 * @param args * @return float,网络带宽使用率,小于1 */ @Override public float get() { log.info("开始收集网络带宽使用率"); float netUsage = 0.0f; Process pro1,pro2; Runtime r = Runtime.getRuntime(); try { String command = "cat /proc/net/dev"; //第一次采集流量数据 long startTime = System.currentTimeMillis(); pro1 = r.exec(command); BufferedReader in1 = new BufferedReader(new InputStreamReader(pro1.getInputStream())); String line = null; long inSize1 = 0, outSize1 = 0; while((line=in1.readLine()) != null){ line = line.trim(); if(line.startsWith("eth0")){ log.info(line); String[] temp = line.split("\\s+"); inSize1 = Long.parseLong(temp[0].substring(5)); //Receive bytes,单位为Byte outSize1 = Long.parseLong(temp[8]); //Transmit bytes,单位为Byte break; } } in1.close(); pro1.destroy(); try { Thread.sleep(1000); } catch (InterruptedException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); log.error("NetUsage休眠时发生InterruptedException. " + e.getMessage()); log.error(sw.toString()); } //第二次采集流量数据 long endTime = System.currentTimeMillis(); pro2 = r.exec(command); BufferedReader in2 = new BufferedReader(new InputStreamReader(pro2.getInputStream())); long inSize2 = 0 ,outSize2 = 0; while((line=in2.readLine()) != null){ line = line.trim(); if(line.startsWith("eth0")){ log.info(line); String[] temp = line.split("\\s+"); inSize2 = Long.parseLong(temp[0].substring(5)); outSize2 = Long.parseLong(temp[8]); break; } } if(inSize1 != 0 && outSize1 !=0 && inSize2 != 0 && outSize2 !=0){ float interval = (float)(endTime - startTime)/1000; //网口传输速度,单位为bps float curRate = (float)(inSize2 - inSize1 + outSize2 - outSize1)*8/(1000000*interval); netUsage = curRate/TotalBandwidth; log.info("本节点网口速度为: " + curRate + "Mbps"); log.info("本节点网络带宽使用率为: " + netUsage); } in2.close(); pro2.destroy(); } catch (IOException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); log.error("NetUsage发生InstantiationException. " + e.getMessage()); log.error(sw.toString()); } return netUsage; } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { while(true){ System.out.println(NetUsage.getInstance().get()); Thread.sleep(5000); } } }</span>
Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
标签:des style blog http color io os 使用 java
原文地址:http://www.cnblogs.com/gisblogs/p/3985393.html