1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Linux下java获取CPU 内存 磁盘IO 网络带宽使用率

Linux下java获取CPU 内存 磁盘IO 网络带宽使用率

时间:2024-02-15 14:27:53

相关推荐

Linux下java获取CPU 内存 磁盘IO 网络带宽使用率

对/proc/net目录的解释参考:

/pub/a/linux/2000/11/16/LinuxAdmin.html?page=1

一、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来表示。

在Linux系统中,CPU利用率的计算来源在/proc/stat文件,这个文件的头几行记录了每个CPU的用户态,系统态,空闲态等状态下的不同的Jiffies,常用的监控软件就是利用/proc/stat里面的这些数据来计算CPU的利用率的。

包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。

[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

输出解释:

CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例)为:

参数 解释

user (432661) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒

nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)

system (86656) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)

idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)

iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,

irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)

softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

CPU时间=user+system+nice+idle+iowait+irq+softirq

“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。

“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。

“btime”给出了从系统启动到现在为止的时间,单位为秒。

“processes (total_forks) 自系统启动以来所创建的任务的个数目。

“procs_running”:当前运行队列的任务的数目。

“procs_blocked”:当前被阻塞的任务的数目。那么CPU利用率的计算方法:可以使用取两个采样点,计算其差值的办法。 CPU利用率 = 1- (idle2-idle1)/(cpu2-cpu1)

参考:linux下如何获取cpu的利用率

java中调用Linux的shell命令使用Process和Runtime jdk1.6 API doc:

public classRuntimeextends Object

每个 Java 应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime方法获取当前运行时。

应用程序不能创建自己的 Runtime 类实例。

public abstract classProcessextends Object

ProcessBuilder.start()Runtime.exec方法创建一个本机进程,并返回Process子类的一个实例,该实例可用来控制进程并获得相关信息。

代码:

package site.mwq.resource;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.StringWriter;/*** 采集CPU使用率*/public class CpuUsage extends ResourceUsage {private static CpuUsage INSTANCE = new CpuUsage();private CpuUsage(){}public static CpuUsage getInstance(){return INSTANCE;}public String[] getCpuData(Runtime r){Process pro = null;String[] res = null;String command = "cat /proc/stat";try {pro = r.exec(command);BufferedReader in1 = new BufferedReader(new InputStreamReader(pro.getInputStream()));String line = null;while((line=in1.readLine()) != null){if(line.startsWith("cpu")){line = line.trim();res = line.split("\\s+"); if(res[0].equals("cpu")){Print.printLine(line);break;}}}in1.close();pro.destroy();} catch (IOException e) {StringWriter sw = new StringWriter();e.printStackTrace(new PrintWriter(sw));}return res;}/*** Purpose:采集CPU使用率* @param args* @return float,CPU使用率,小于1*/@Overridepublic float get() {long idleCpuTime1 = 0, totalCpuTime1 = 0;//分别为系统启动后空闲的CPU时间和总的CPU时间long idleCpuTime2 = 0, totalCpuTime2 = 0;float cpuUsage = 0;Runtime runtime = Runtime.getRuntime();String[] data1 = getCpuData(runtime);//第一次测数据for(int i=1;i<data1.length;i++){totalCpuTime1 += Long.parseLong(data1[i]);}idleCpuTime1 = Long.parseLong(data1[4]);try {Thread.sleep(1000);/**等待时间**/} catch (InterruptedException e) {StringWriter sw = new StringWriter();e.printStackTrace(new PrintWriter(sw));}String[] data2 = getCpuData(runtime);//第二次测数据for(int i=1;i<data2.length;i++){totalCpuTime2 += Long.parseLong(data2[i]);}idleCpuTime2 = Long.parseLong(data2[4]);if(idleCpuTime1 != 0 && totalCpuTime1 !=0 && idleCpuTime2 != 0 && totalCpuTime2 !=0){cpuUsage = 1 - (float)(idleCpuTime2 - idleCpuTime1)/(float)(totalCpuTime2 - totalCpuTime1);}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);}}}

二、内存

从/proc文件系统获取内存使用情况: cat /proc/meminfo

MemTotal: 8167348 kB

MemFree: 4109964 kB

Buffers:35728 kB

Cached: 1877960 kB

SwapCached: 159088 kB

Active: 3184176 kB

Inactive: 672132 kB

HighTotal:0 kB

HighFree:0 kB

LowTotal: 8167348 kB

LowFree: 4109964 kB

SwapTotal: 26738680 kB

SwapFree: 26373632 kB

Dirty: 40 kB

Writeback:0 kB

AnonPages: 1872416 kB

Mapped:24928 kB

Slab:107804 kB

PageTables: 34612 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

CommitLimit: 30822352 kB

Committed_AS: 5386080 kB

VmallocTotal: 34359738367 kB

VmallocUsed: 276892 kB

VmallocChunk: 34359460287 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

Hugepagesize: 2048 kB

内存使用率 = 1 -MemFree/MemTotal

代码:

package site.mwq.resource;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.StringWriter;/*** 采集内存使用率*/public class MemUsage extends ResourceUsage{private static MemUsage INSTANCE = new MemUsage();private MemUsage(){}public static MemUsage getInstance(){return INSTANCE;}/*** Purpose:采集内存使用率* @param args* @return float,内存使用率,小于1*/@Overridepublic float get() {float memUsage = 0.0f;Process pro = null;Runtime r = Runtime.getRuntime();String command = "cat /proc/meminfo";try {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){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;if(++count == 2){break;}}in.close();pro.destroy();} catch (IOException e) {StringWriter sw = new StringWriter();e.printStackTrace(new PrintWriter(sw));}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);}}}

三、磁盘IO

使用iostat:

[root@localhost LoadBalanceAlg]# iostat -d -x

Linux 2.6.18-238.el5 (localhost.localdomain) Äê03ÔÂ30ÈÕ

Device:rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util

sda 0.09 0.28 0.02 0.03 0.92 2.57 60.71 0.00 63.28 3.33 0.02

sda1 0.00 0.00 0.00 0.00 0.00 0.00 24.40 0.00 2.59 2.53 0.00

sda2 0.09 0.28 0.02 0.03 0.92 2.57 60.76 0.00 63.36 3.34 0.02

sdb 0.03 0.72 0.04 0.53 2.57 10.04 22.09 0.01 17.36 5.12 0.29

sdb1 0.03 0.72 0.04 0.53 2.57 10.04 22.09 0.01 17.36 5.12 0.29

dm-0 0.00 0.00 0.07 1.30 2.63 10.40 9.53 0.03 24.95 2.15 0.29

dm-1 0.00 0.00 0.11 0.28 0.86 2.21 8.00 0.12 300.47 0.16 0.01

man iostat: -d The -d option is exclusive of the -c option and displays only the device utilization report.

-x Display extended statistics. This option is exclusive of the -p and -n, and works with post 2.5 kernels since it needs /proc/diskstats file or a mounted sysfs to getthe statistics. This option may also work with older kernels (e.g. 2.4) only if extended statistics are available in /proc/partitions (the kernel needs to be patchedfor that).

%utilPercentage of CPU time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value isclose to 100%. 一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。如果%util接近100%,表明I/O请求太多,I/O系统已经满负荷,磁盘可能存在瓶颈,一般%util大于70%,I/O压力就比较大,读取速度有较多的wait。

参考:linux 查看磁盘IO状态操作指南

代码:[java]view plain copy importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.io.StringWriter; importorg.apache.log4j.Logger; /** *采集磁盘IO使用率 */ publicclassIoUsageextendsResourceUsage{ privatestaticLoggerlog=Logger.getLogger(IoUsage.class); privatestaticIoUsageINSTANCE=newIoUsage(); privateIoUsage(){ } publicstaticIoUsagegetInstance(){ returnINSTANCE; } /** *@Purpose:采集磁盘IO使用率 *@paramargs *@returnfloat,磁盘IO使用率,小于1 */ @Override publicfloatget(){ log.info("开始收集磁盘IO使用率"); floatioUsage=0.0f; Processpro=null; Runtimer=Runtime.getRuntime(); try{ Stringcommand="iostat-d-x"; pro=r.exec(command); BufferedReaderin=newBufferedReader(newInputStreamReader(pro.getInputStream())); Stringline=null; intcount=0; while((line=in.readLine())!=null){ if(++count>=4){ //log.info(line); String[]temp=line.split("\\s+"); if(temp.length>1){ floatutil=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(IOExceptione){ StringWritersw=newStringWriter(); e.printStackTrace(newPrintWriter(sw)); log.error("IoUsage发生InstantiationException."+e.getMessage()); log.error(sw.toString()); } returnioUsage; } /** *@paramargs *@throwsInterruptedException */ publicstaticvoidmain(String[]args)throwsInterruptedException{ while(true){ System.out.println(IoUsage.getInstance().get()); Thread.sleep(5000); } } }

四、网络带宽

从/proc文件系统获取网络使用情况: cat /proc/net/dev

[root@localhost LoadBalanceAlg]# cat /proc/net/dev

Inter-| Receive | Transmit

face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed

lo:1402131426 15109136 0 0 0 000 1402131426 15109136 0 0 0 0 00

eth0:4546168400 42535979 0 0 0 00 44 5610190492 8943999 0 0 0 0 00

eth1: 0 0 0 0 0 000 0 0 0 0 0 0 00

eth3: 0 0 0 0 0 000 0 0 0 0 0 0 00

__tmp945063435: 0 0 0 0 0 000 0 0 0 0 0 0 00

bond0:4546168400 42535979 0 0 0 00 44 5610190492 8943999 0 0 0 0 00

统计一段时间内Receive和Tramsmit的bytes数的变化,即可获得网口传输速率,再除以网口的带宽就得到带宽的使用率

代码:

package site.mwq.resource;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.StringWriter;/*** 采集网络带宽使用率*/public class NetUsage extends ResourceUsage {private static NetUsage INSTANCE = new NetUsage();private final static float TotalBandwidth = 1000;//网口带宽,Mbps,使用命令ethtool eth0查看private NetUsage(){}public static NetUsage getInstance(){return INSTANCE;}public String[] getNetData(Runtime r){Process pro1 = null;String command = "cat /proc/net/dev";String[] res = null;try {pro1 = r.exec(command);BufferedReader in1 = new BufferedReader(new InputStreamReader(pro1.getInputStream()));String line = null;while((line=in1.readLine()) != null){line = line.trim();if(line.startsWith("eth0")){res = line.split("\\s+"); break;}}in1.close();pro1.destroy();} catch (IOException e) {e.printStackTrace();}return res;}/*** @Purpose:采集网络带宽使用率* @param args* @return float,网络带宽使用率,小于1*/@Overridepublic float get() {float netUsage = 0.0f;long inSize1 = 0, outSize1 = 0;long inSize2 = 0 ,outSize2 = 0;///Runtime r = Runtime.getRuntime();long startTime = System.currentTimeMillis();String[] data1 = getNetData(r);//第一次测数据inSize1 = Long.parseLong(data1[1]);//Receive bytes,单位为ByteoutSize1 = Long.parseLong(data1[9]);//Transmit bytes,单位为Bytetry {Thread.sleep(1000);/**等待一段时间**/} catch (InterruptedException e) {StringWriter sw = new StringWriter();e.printStackTrace(new PrintWriter(sw));}long endTime = System.currentTimeMillis();String[] data2 = getNetData(r);//第二次测数据inSize2 = Long.parseLong(data2[1]);outSize2 = Long.parseLong(data2[9]);if(inSize1 != 0 && outSize1 !=0 && inSize2 != 0 && outSize2 !=0){float interval = (float)(endTime - startTime);//单位为毫秒float curRate = (float)(inSize2 - inSize1 + outSize2 - outSize1)*8/(1000*interval); //网口传输速度, 单位为bps bit每秒netUsage = curRate/TotalBandwidth;}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);}}}

用于记录日志的类Print:

package site.mwq.resource;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.PrintWriter;public class Print {public static File file = null;public static PrintWriter pw = null;static{String path = System.getProperty("user.dir");file = new File(path+"/log.txt");try {pw = new PrintWriter(new FileOutputStream(file));} catch (FileNotFoundException e) {e.printStackTrace();}}public static void printLine(String str){pw.println(str);pw.flush();}public static void main(String[] args) {printLine("test");}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。