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

一、各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;
    	
    }
 
    public static int[] getMemInfo(List<DataObject> list) throws IOException, InterruptedException {  
    	
    	File file = new File("/proc/meminfo");
        BufferedReader br = new BufferedReader(new InputStreamReader(  
                new FileInputStream(file)));  
        int[] result = new int[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] = Integer.parseInt(memtotal);  
                DataObject memTotalData= new DataObject();
                memTotalData.setClock(System.currentTimeMillis());
                memTotalData.setKey("vm.memory.size[total]");
                memTotalData.setValue(memtotal);
                list.add(memTotalData);
            } else if (str.equalsIgnoreCase("MemFree:"))  {
            	String memFree=token.nextToken();
                result[1] = Integer.parseInt(memFree);  
                DataObject memFreeData= new DataObject();
                memFreeData.setClock(System.currentTimeMillis());
                memFreeData.setKey("vm.memory.size[free]");
                memFreeData.setValue(memFree);
                list.add(memFreeData);
            } else if (str.equalsIgnoreCase("SwapTotal:"))  {
            	String swapTotal=token.nextToken();
                result[2] = Integer.parseInt(swapTotal);  
                DataObject swapTotalData= new DataObject();
                swapTotalData.setClock(System.currentTimeMillis());
                swapTotalData.setKey("system.swap.size[,total]");
                swapTotalData.setValue(swapTotal);
                list.add(swapTotalData);
            } else if (str.equalsIgnoreCase("SwapFree:"))  {
            	String swapFree=token.nextToken();
                result[3] = Integer.parseInt(swapFree);  
                DataObject swapFreeData= new DataObject();
                swapFreeData.setClock(System.currentTimeMillis());
                swapFreeData.setKey("system.swap.size[,free]");
                swapFreeData.setValue(swapFree);
                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);
        
        
        int swap_used=result[2]-result[3];
        DataObject swapUsedData= new DataObject();
        swapUsedData.setClock(System.currentTimeMillis());
        swapUsedData.setKey("system.swap.size[,used]");
        swapUsedData.setValue(swap_used+"");
        list.add(swapUsedData);
           
        int mem_used=result[0]-result[1];
        DataObject memUsedData= new DataObject();
        memUsedData.setClock(System.currentTimeMillis());
        memUsedData.setKey("vm.memory.size[used]");
        memUsedData.setValue(mem_used+"");
        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;
        
      }  
    
    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
    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;
    }
    
    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
*/
//当前单位是KB
    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/2.0 +"");
				list.add(readData);
				
				DataObject writeData = new DataObject();
				writeData.setClock(System.currentTimeMillis());
				writeData.setKey("vfs.dev.write[,,avg1]");
				writeData.setValue(wr_sector/2.0 +"");
				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());
			
		}
    }
    
    public static  void getDiskSpace( List <DataObject> list) {
    	File file = new File("/etc/mtab");
        BufferedReader in1 = null;
        String line = null;

      /*
       * /dev/sda2 / ext4 rw 0 0
		proc /proc proc rw 0 0
		sysfs /sys sysfs rw 0 0
		devpts /dev/pts devpts rw,gid=5,mode=620 0 0
		tmpfs /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 0
		none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
		sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
		gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0
		/dev/sr0 /media/VMware40Tools 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].contains("xfs") || ss[2].contains("ext") || ss[2].contains("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);
    		 
    	}
    	  //磁盘IO  执行命令;
    	if(tmp.equals("disk") || "".equals(tmp) ){
    		  LinuxSystemTool.getDiskSpace(list);
//    		  System.out.println(JSON.toJSONString(list,true));
//    		  break;
    	}
    	if(tmp.equals("diskIO" )|| "".equals(tmp) ){
    		 LinuxSystemTool.getIOstats(list);
    	}
    	
    	 System.out.println(JSON.toJSONString(list,true));
    	 
    	}
    }  
}  




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

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

原文地址:https://www.cnblogs.com/yeemi/p/7470119.html