linux各发行版本的系统资源获取方式调研

来源:互联网 发布:网络言论自由的特点 编辑:程序博客网 时间:2024/06/01 09:25

一、各linux发行版本信息统计

linux发行版本中获取系统资源的文件中字段对比如下图所示:

发行版本

cpu

cpu load

net

 disk

net_io

memery

内核版本

/proc/stat

/proc/loadavg

/proc/net/dev

/etc/mtab

/proc/diskstats

/proc/meminfo

CentOS-6.4

10个字段

user sys nice …

取前3个字段   1分钟负载     5分钟负载    15分钟负载

字段相同,取 Receive和 Transmit 中的bytes列

前三列: filesystem  mount on filesystem type

14个字段,取第6和第10个字段sector read sector write

MemTotal MemFree SwapFree

2.6.32-358.el6.x86_64

CentOS-6.5

10个字段

同上

同上

同上

同上

同上

2.6.32-431.el6.x86_64

CentOS-7.0

10个字段

同上

同上

同上

同上

同上

3.10.0-123.el7.x86_64

rhel-server-5.5

9个字段

同上

同上

同上

同上

同上

2.6.18-194.el5

rhel-server-6.3

10个字段

同上

同上

同上

同上

同上

2.6.32-279.el6.x86_64

rhel-server-6.4

10个字段

同上

同上

同上

同上

同上

2.6.32-358.el6.x86_64

Ubuntu-12.04.5-server

11个字段

同上

同上

同上

同上

同上

3.13.0-32-generic

Ubuntu-15.05.4-server

11个字段

同上

同上

同上

同上

同上

3.19.0-15-generic

Ubuntu-17.05.4-server

11个字段

同上

同上

同上

同上

同上

4.10.0-19-generic

SLES-11-SPA

11个字段

同上

同上

同上

同上

同上

linux-63h3 3.0.101-63-default

 

二、目前问题

1、获取cpu数据

问题:/proc/stat文件字段个数不同,但是目前测试至少有9个字段。(现在程序中只读了前7个字段。)

 

CentOS 6.5:

user (38082)      从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负的进程。

system (27594) 从系统启动开始累计到当前时刻,处于核心态的运行时间。

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

idle (893908)     从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间

iowait (12256)  从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)。 内核版本

irq (581)             从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)。

softirq (895)     从系统启动开始累计到当前时刻,软中断时间(since2.6.0-test4)

stealstolen(0)   which is the time spent in otheroperating systems when running in a virtualizedenvironment(since 2.6.11)。

guest(0)       whichis the time spent running a virtual CPU  for guest operating systems under the control ofthe Linux kernel(since 2.6.24)。

 

2、获取磁盘容量:

通过读取/etc/mtab文件,获取所有挂载点,然后通过java File类中函数获取挂载点的总空间和使用空间;

 

File file =new File(dir);

file.getTotalSpace(),file.getUsableSpace();

 

注:/etc/fstab   /etc/mtab  /proc/mounts 均可获取磁盘挂载点信息;但每当 mount挂载分区、umount 卸载分区,都会动态更新 mtab,mtab  总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况。

 http://www.metsky.com/archives/711.html

 

 

问题:在/etc/mtab文件中有很多虚拟文件的信息:是否需要过滤(现在将挂载点的总空间为0的挂载点过滤掉,这样获取的数据和df –h 命令得到的数据一致)

ubuntu17.04

3、获取磁盘IO

通过读取 /proc/diskstats 文件,分别获取每个磁盘一秒内的读扇区数和写扇区数(取2个时间点的数据[当前时刻和下一秒],然后做差);最后将所有的磁盘读写扇区数各自相加(一个扇区是512Byte,如果换算成KB,需要除以2,1KB=2*512Byte; 512Byte=1扇区数)

现在过滤了(loop 和ram  [loop:虚拟块设备,影射正常文件,ram:将内存的一部分当做磁盘来用])

计算方法参照:

http://www.360doc.com/content/14/0603/14/14935022_383255906.shtml

 

问题: 现在的程序获取到的磁盘1秒内的读写量(单位:KB)与IOstat 命令1秒内的数据统计(iostat -k 1)基本一致,但是与zabbix的统计是不同的。

 

目前,cpu使用率,网络IO速率,磁盘IO速率都是通过sleep(1000) 获取的,用采集器每隔20s获取一次的方式会存在数据丢失。

三、java实现

package com.yoyosys.crawler.system_info;import java.io.BufferedReader;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileNotFoundException;import java.io.IOException;  import java.io.InputStreamReader;  import java.io.PrintWriter;import java.io.StringWriter;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringTokenizer;  import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.log4j.Logger;  import com.alibaba.fastjson.JSON;import com.yoyosys.crawler.DataObject;  /**  * 取得linux系统下的cpu、内存信息  */public final class LinuxSystemTool {    private static Logger log = Logger.getLogger(LinuxSystemTool.class);    // private final static float TotalBandwidth = 1000;   //网口带宽,Mbps        private static LinuxSystemTool linuxSystemTool = new LinuxSystemTool();        public  static LinuxSystemTool getInstance(){    return linuxSystemTool;        }     /**     * 单位是 Byte     * @param list     * @return     * @throws IOException     * @throws InterruptedException     */    public static long[] getMemInfo(List<DataObject> list) throws IOException, InterruptedException {          File file = new File("/proc/meminfo");        BufferedReader br = new BufferedReader(new InputStreamReader(                  new FileInputStream(file)));          long[] result = new long[4];          String str = null;          StringTokenizer token = null;               while ((str = br.readLine()) != null) {              token = new StringTokenizer(str);              if (!token.hasMoreTokens())                  continue;                str = token.nextToken();              if (!token.hasMoreTokens())                continue;                if (str.equalsIgnoreCase("MemTotal:")){            String memtotal=token.nextToken();                result[0] = Long.parseLong(memtotal);                  DataObject memTotalData= new DataObject();                memTotalData.setClock(System.currentTimeMillis());                memTotalData.setKey("vm.memory.size[total]");                memTotalData.setValue(result[0] * 1024 + "");                list.add(memTotalData);            } else if (str.equalsIgnoreCase("MemFree:"))  {            String memFree=token.nextToken();                result[1] = Long.parseLong(memFree);                  DataObject memFreeData= new DataObject();                memFreeData.setClock(System.currentTimeMillis());                memFreeData.setKey("vm.memory.size[free]");                memFreeData.setValue(result[1] * 1024 + "");                list.add(memFreeData);            } else if (str.equalsIgnoreCase("SwapTotal:"))  {            String swapTotal=token.nextToken();                result[2] = Long.parseLong(swapTotal);                  DataObject swapTotalData= new DataObject();                swapTotalData.setClock(System.currentTimeMillis());                swapTotalData.setKey("system.swap.size[,total]");                swapTotalData.setValue(result[2] * 1024 +"");                list.add(swapTotalData);            } else if (str.equalsIgnoreCase("SwapFree:"))  {            String swapFree=token.nextToken();                result[3] = Long.parseLong(swapFree);                  DataObject swapFreeData= new DataObject();                swapFreeData.setClock(System.currentTimeMillis());                swapFreeData.setKey("system.swap.size[,free]");                swapFreeData.setValue(result[3]*1024 +"");                list.add(swapFreeData);            }                               }          // float  memUsage = 1- (float)freeMem/(float)totalMem;         float  mem_pused = 1- (float)result[1]/(float)result[0];        DataObject memUsageData= new DataObject();        memUsageData.setClock(System.currentTimeMillis());        memUsageData.setKey("vm.memory.size[pused]");        memUsageData.setValue(mem_pused+"" );        list.add(memUsageData);                float swap_pfree=(float)result[3]/(float)result[2];        DataObject swapUsageData= new DataObject();        swapUsageData.setClock(System.currentTimeMillis());        swapUsageData.setKey("system.swap.size[,pfree]");        swapUsageData.setValue(swap_pfree+"");        list.add(swapUsageData);                long swap_used=result[2]-result[3];        DataObject swapUsedData= new DataObject();        swapUsedData.setClock(System.currentTimeMillis());        swapUsedData.setKey("system.swap.size[,used]");        swapUsedData.setValue(swap_used*1024 +"");        list.add(swapUsedData);                   long mem_used=result[0]-result[1];        DataObject memUsedData= new DataObject();        memUsedData.setClock(System.currentTimeMillis());        memUsedData.setKey("vm.memory.size[used]");        memUsedData.setValue(mem_used*1024 +"");        list.add(memUsedData);                return result;              }          /**      * 获取cpu信息   百分率     *       * @return float efficiency      * @throws IOException      * @throws InterruptedException      */      public static float getCpuInfo(List<DataObject> list) throws IOException, InterruptedException {             File file = new File("/proc/stat");        BufferedReader br = new BufferedReader(new InputStreamReader(                  new FileInputStream(file)));          StringTokenizer token = new StringTokenizer(br.readLine());          token.nextToken();                  long user1 = Long.parseLong(token.nextToken());          long nice1 = Long.parseLong(token.nextToken());          long sys1 = Long.parseLong(token.nextToken());          long idle1 = Long.parseLong(token.nextToken());        long iowait1 = Long.parseLong(token.nextToken());        long irq1 = Long.parseLong(token.nextToken());        long softirq1 = Long.parseLong(token.nextToken());                Thread.sleep(1000);          br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));                token = new StringTokenizer(br.readLine());          token.nextToken();              long user2 = Long.parseLong(token.nextToken());          long nice2 = Long.parseLong(token.nextToken());          long sys2 = Long.parseLong(token.nextToken());          long idle2 = Long.parseLong(token.nextToken());        long iowait2 = Long.parseLong(token.nextToken());        long irq2 = Long.parseLong(token.nextToken());        long softirq2 = Long.parseLong(token.nextToken());                float totalCpu=(user2 + nice2 + sys2 + idle2 + iowait2 +irq2 +softirq2) - (user1 + nice1                  + sys1 + idle1 + iowait1 +irq1 +softirq1);                float usageCpu=(float) ((user2 + sys2 + nice2) - (user1 + sys1 + nice1))                  / totalCpu ;                usageCpu=(totalCpu-(idle2-idle1))/totalCpu;                DataObject userData = new DataObject();        userData.setClock(System.currentTimeMillis());        userData.setKey("system.cpu.util[,user]");        userData.setValue((user2-user1)/totalCpu*100 +"");        list.add(userData);                DataObject niceData = new DataObject();        niceData.setClock(System.currentTimeMillis());        niceData.setKey("system.cpu.util[,nice]");        niceData.setValue((nice2-nice1)/totalCpu*100 +"");        list.add(niceData);                DataObject sysData = new DataObject();        sysData.setClock(System.currentTimeMillis());        sysData.setKey("system.cpu.util[,system]");        sysData.setValue( (sys2-sys1)/totalCpu*100 +"");        list.add(sysData);                DataObject idleData = new DataObject();        idleData.setClock(System.currentTimeMillis());        idleData.setKey("system.cpu.util[,idle]");        idleData.setValue( (idle2-idle1)/totalCpu*100 +"");        list.add(idleData);                 DataObject iowaitData = new DataObject();        iowaitData.setClock(System.currentTimeMillis());        iowaitData.setKey("system.cpu.util[,iowait]");        iowaitData.setValue( (iowait2-iowait1)/totalCpu*100 +"");        list.add(iowaitData);                DataObject irqData = new DataObject();        irqData.setClock(System.currentTimeMillis());        irqData.setKey("system.cpu.util[,interrupt]");        irqData.setValue( (irq2-irq1)/totalCpu*100 +"");        list.add(irqData);                DataObject softirqData = new DataObject();        softirqData.setClock(System.currentTimeMillis());        softirqData.setKey("system.cpu.util[,softirq]");        softirqData.setValue( (softirq2-softirq1)/totalCpu*100 +"");        list.add(softirqData);                        return 0.0f;              }          /**     * cpu 平均负载 百分率     *      * @param list     */    public static void getCpuLoadAvg(List<DataObject> list){      File file = new File("/proc/loadavg");          BufferedReader br;try {br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));    StringTokenizer token = new StringTokenizer(br.readLine());                         DataObject oneMinuteLoad=new DataObject();            oneMinuteLoad.setClock(System.currentTimeMillis());            oneMinuteLoad.setKey("system.cpu.load[,avg1]");            oneMinuteLoad.setValue(token.nextToken());            list.add(oneMinuteLoad);                        DataObject fiveMinuteLoad=new DataObject();            fiveMinuteLoad.setClock(System.currentTimeMillis());            fiveMinuteLoad.setKey("system.cpu.load[,avg5]");            fiveMinuteLoad.setValue(token.nextToken());            list.add(fiveMinuteLoad);                        DataObject fifteenMinuteLoad=new DataObject();            fifteenMinuteLoad.setClock(System.currentTimeMillis());            fifteenMinuteLoad.setKey("system.cpu.load[,avg15]");            fifteenMinuteLoad.setValue(token.nextToken());            list.add(fifteenMinuteLoad);       } catch (Exception e) {log.error("get cpu loadavg error:"+e.getMessage());log.error("get cpu loadavg error:"+e.getLocalizedMessage());}      }        //单位是  byte    /**     * 网络流量 IO  Byte     * @param list     * @return     */    public  static float getNetInfo(List<DataObject> list) {                float netUsage = 0.0f;          Map<String,Object>  mapNet=new HashMap<String,Object>();        BufferedReader in1 = null;        BufferedReader in2 = null;         try {                File file = new File("/proc/net/dev");            in1 = new BufferedReader(new InputStreamReader(                        new FileInputStream(file)));  //            //第一次采集流量数据              long startTime = System.currentTimeMillis();              String line = null;              long inSize1 = 0, outSize1 = 0;            in1.readLine();            in1.readLine();            //[face, |bytes, packets, errs, drop, fifo, frame, compressed, multicast|bytes, packets, errs, drop, fifo, colls, carrier, compressed]                     while((line=in1.readLine()) != null){                            line = line.trim();                                String[] temp = line.split("\\s+");                String eth_name=temp[0].substring(0,temp[0].lastIndexOf(":"));                                if(eth_name.equals("lo"))                continue;                int _index=temp[0].lastIndexOf(":");                            if(temp[0].length() > _index+1){                inSize1 = Long.parseLong(temp[0].substring(temp[0].lastIndexOf(":")+1)); //Receive bytes,单位为Byte                      outSize1 = Long.parseLong(temp[8]);//Transmit bytes,单位为Byte                  }else{                inSize1 = Long.parseLong(temp[1]);                    outSize1 = Long.parseLong(temp[9]);//Transmit bytes,单位为Byte                  }                long[] size={inSize1,outSize1};                mapNet.put(eth_name, size);             }                 in1.close();                      try {                  Thread.sleep(1000);             } catch (InterruptedException e) {                  StringWriter sw = new StringWriter();                e.printStackTrace(new PrintWriter(sw));              }              //第二次采集流量数据              long endTime = System.currentTimeMillis();            in2 = new BufferedReader(new InputStreamReader(                      new FileInputStream(file)));              long inSize2 = 0 ,outSize2 = 0;              in2.readLine();            in2.readLine();            while((line=in2.readLine()) != null){                line = line.trim();                String[] temp = line.split("\\s+");                String eth_name=temp[0].substring(0,temp[0].lastIndexOf(":"));                if(eth_name.equals("lo"))                continue;                                int _index=temp[0].lastIndexOf(":");                            if(temp[0].length() > _index+1){                                inSize2 = Long.parseLong(temp[0].substring(temp[0].lastIndexOf(":")+1));                  outSize2 = Long.parseLong(temp[8]);                }else{                inSize2 = Long.parseLong(temp[1]);                    outSize2 = Long.parseLong(temp[9]);//Transmit bytes,单位为Byte                                  }                long [] d =(long[]) mapNet.get(eth_name);                long inNet=d[0];                long outNet=d[1];                                DataObject  inNetData = new   DataObject();                inNetData.setClock(System.currentTimeMillis());                inNetData.setKey("net.if.in["+eth_name+"]");                inNetData.setValue( (inSize2-inNet) +"");                list.add(inNetData);                                DataObject  outNetData = new   DataObject();                outNetData.setClock(System.currentTimeMillis());                outNetData.setKey("net.if.out["+eth_name+"]");                outNetData.setValue( (outSize2-outNet) + "");                list.add(outNetData);                //              System.out.println(inSize2 + " - " + inNet + "=" + (inSize2-inNet)/128.0);   //除以128   单位KB    (换算成 bps    Kbps)//              outNetData.setValue( (outSize2-outNet)*8 +"");  //乘以8   单位B            }                        in2.close();        } catch (IOException e) {            StringWriter sw = new StringWriter();              e.printStackTrace(new PrintWriter(sw));              log.error("NetUsage发生InstantiationException. " + e.getMessage());              log.error(sw.toString());        } finally{        try {if ( in1 != null ) in1.close();if (  in2 != null ) in2.close();} catch (IOException e) {log.info("IOException :" + e.getMessage());}        }        return netUsage;    }        /**     * 获取主机状态信息   1 是正常       *      * @param list     */    public static void getHostStatus(List<DataObject> list){        DataObject data = new DataObject();    data.setClock(System.currentTimeMillis());    data.setKey("agent.ping");    data.setValue("1");    list.add(data);        }        public static List<DataObject>  get()  {    List<DataObject> list= new ArrayList<DataObject>();    //内存  cpu  网络IO 磁盘IO    try{        LinuxSystemTool.getMemInfo(list);        LinuxSystemTool.getCpuInfo(list);        LinuxSystemTool.getCpuLoadAvg(list);        LinuxSystemTool.getNetInfo(list);        LinuxSystemTool.getDiskSpace(list);        LinuxSystemTool.getIOstats(list);        LinuxSystemTool.getHostStatus(list);            }catch(Exception e){    log.error("exception:"+e.getMessage());    }    log.info(JSON.toJSONString(list, true));            return list;    }      //http://www.360doc.com/content/14/0603/14/14935022_383255906.shtml  推导公式/*     8       0 sda 84369 44065 3313744 31078 72767 195050 2144912 56178 0 54484 87178    8       1 sda1 804 823 6430 90 11 7 72 2 0 90 91    8       2 sda2 82544 41372 3284186 30663 71229 162201 1869888 47523 0 48303 78111    8       3 sda3 863 1870 21864 290 1527 32842 274952 8653 0 6547 8941*/    /**     * 磁盘IO  单位Byte     *      * @param list     */    public static void getIOstats(List <DataObject> list){        File file = new File("/proc/diskstats");        BufferedReader in1=null;        BufferedReader in2=null;        String line = null;     try {    in1 = new BufferedReader(new InputStreamReader(            new FileInputStream(file)));try {long tmp[]={0,0};while((line=in1.readLine()) != null){line = line.trim();String [] ss = line.split("\\s+");Pattern p = Pattern.compile("sd[a-z][0-9]\\d{0,}$|hd[a-z][0-9]\\d{0,}$");Matcher matcher = p.matcher(ss[2]);boolean flag=matcher.matches();if(ss[2].contains("loop") || ss[2].contains("ram") || flag)continue;tmp[0]+=Long.parseLong(ss[5]);tmp[1]+=Long.parseLong(ss[9]);}Thread.sleep(1000);in2 = new BufferedReader(new InputStreamReader(            new FileInputStream(file)));long[] tmp2={0,0};while((line=in2.readLine()) != null){line = line.trim();String [] ss = line.split("\\s+");Pattern p = Pattern.compile("sd[a-z][0-9]\\d{0,}$|hd[a-z][0-9]\\d{0,}$");Matcher matcher = p.matcher(ss[2]);boolean flag=matcher.matches();if( ss[2].contains("loop") || ss[2].contains("ram") || flag)continue;long rd_sectors2 = Long.parseLong(ss[5]);long wr_sectors2 = Long.parseLong(ss[9]);tmp2[0]+=rd_sectors2;tmp2[1]+=wr_sectors2;}long rd_sector = tmp2[0]-tmp[0];long wr_sector = tmp2[1]-tmp[1];DataObject readData = new DataObject();readData.setClock(System.currentTimeMillis());readData.setKey("vfs.dev.read[,,avg1]");readData.setValue(rd_sector *512 +"");list.add(readData);DataObject writeData = new DataObject();writeData.setClock(System.currentTimeMillis());writeData.setKey("vfs.dev.write[,,avg1]");writeData.setValue(wr_sector *512 +"");list.add(writeData);log.info(JSON.toJSONString(list,true));//一个扇区是 512 Byte;re_sector wr_sector是扇区数,换算成KB,要除以2;1KB=2*512Bytess//System.out.println(JSON.toJSONString(list,true));} catch (Exception e) {log.error("diskstats error:"+e.getMessage());}finally{try {if ( in1 != null ) in1.close();if (  in2 != null ) in2.close();} catch (IOException e) {log.info("IOException :" + e.getMessage());}}} catch (FileNotFoundException e) {log.error("diskstats exception:"+e.getMessage());}    }        /**     * 磁盘总量 单位 Byte     *      * @param list     */    public static  void getDiskSpace( List <DataObject> list) {    File file = new File("/etc/mtab");        BufferedReader in1 = null;        String line = null;      /*       * /dev/sda2 / ext4 rw 0 0proc /proc proc rw 0 0sysfs /sys sysfs rw 0 0devpts /dev/pts devpts rw,gid=5,mode=620 0 0tmpfs /dev/shm tmpfs rw 0 0/dev/sda1 /boot ext4 rw 0 0/dev/sdb5 /data/logic ext3 rw 0 0/dev/sdb1 /data/primary ext4 rw 0 0none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0/dev/sr0 /media/VMware\040Tools iso9660 r   *   一个目录可以挂载多个分区,(一个分区挂在到多个目录中没有意义)         * */        try {        in1 = new BufferedReader(new InputStreamReader(            new FileInputStream(file)));while((line=in1.readLine()) != null){line = line.trim();String [] ss = line.split("\\s+");File ff=new File(ss[1]);if(ss[2].equals("xfs") || ss[2].contains("ext") || ss[2].equals("btrfs")){//long usdSpace=(long) (ff.getUsableSpace());long freeSpace=(long)ff.getFreeSpace();long totalSpace=(long) (ff.getTotalSpace());DataObject totalSpaceData = new DataObject();totalSpaceData.setClock(System.currentTimeMillis());totalSpaceData.setKey("vfs.fs.size["+ss[1]+",total]");totalSpaceData.setValue(totalSpace +"");list.add(totalSpaceData);DataObject usedSpaceData = new DataObject();usedSpaceData.setClock(System.currentTimeMillis());usedSpaceData.setKey("vfs.fs.size["+ss[1]+",used]");usedSpaceData.setValue(totalSpace-freeSpace +"");list.add(usedSpaceData);DataObject typeFileSystemData = new DataObject();typeFileSystemData.setClock(System.currentTimeMillis());typeFileSystemData.setKey("fs_type_"+ss[1]);typeFileSystemData.setValue(ss[2]);list.add(typeFileSystemData);DataObject  pusedData = new DataObject();pusedData.setClock(System.currentTimeMillis());pusedData.setKey("vfs.fs.size["+ ss[1] +",pused]");pusedData.setValue( (totalSpace-freeSpace)/(float)totalSpace +"" );list.add(pusedData);}//map.put(ss[1], obj);}log.info(JSON.toJSONString(list,true)); //System.out.print(JSON.toJSONString(list,true));} catch (Exception e1) {log.info("Exception:"+e1.getMessage());}finally{if(in1 != null){try {in1.close();} catch (IOException e) {log.error("IOexception :"+e.getMessage());}}}    }        public static void main(String[] args) throws Exception {     String tmp="";    if(args.length != 0){    tmp=args[0];    }     //    tmp="diskIO";//    //内存    while(true){     //内存(读文件)-》proc/meminfo    //cpu(读文件)-》/proc/stat     //网络(读文件)-》/proc/net/dev          //磁盘-》执行命令    /*        List<DataObject>  list= new ArrayList<DataObject>();    if(tmp.equals("mem") || "".equals(tmp)){       LinuxSystemTool.getMemInfo(list);        }    if(tmp.equals("cpu") || "".equals(tmp)){      LinuxSystemTool.getCpuInfo(list);      LinuxSystemTool.getCpuLoadAvg(list);    }    if(tmp.equals("net") || "".equals(tmp)){      LinuxSystemTool.getNetInfo(list);         }    if(tmp.equals("diskIO" )|| "".equals(tmp) ){     LinuxSystemTool.getIOstats(list);    }          //磁盘IO  执行命令;    if(tmp.equals("disk") || "".equals(tmp) ){      LinuxSystemTool.getDiskSpace(list);//      System.out.println(JSON.toJSONString(list,true));//      break;    }    */         List<DataObject>  list= new ArrayList<DataObject>();     LinuxSystemTool.getDiskSpace(list);                 System.out.println(JSON.toJSONString(list,true));     break;    }    }  }  



参考博客:

http://www.makaidong.com/IT%E5%8D%9A%E5%AE%A2%E5%9B%AD/29313.shtml  硬盘原理与IO吞吐量计算
http://avery-leo.iteye.com/blog/298724  获取cpu,网络,磁盘资源的源码参考
http://www.360doc.com/content/14/0603/14/14935022_383255906.shtml linux内核源码解析




如果通过采集器的方式每20s采集一次数据,那只能获取20s前一刻的IO速率,不具有代表性。如果这20s内有数据拷贝,IO速率信息也是统计不到的。

Cpunet IO 都会有数据丢失的问题

原创粉丝点击