Beyond
posts - 46,  comments - 3,  trackbacks - 0
  2008年9月22日

java取得Linuxcpu,内存,磁盘实时信息

Java代码
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.StringTokenizer;  
 
/** 


* 取得linux系统下的cpu、内存信息 
*  
* */ 
public final class LinuxSystemTool  
{  
   /** 
   * get memory by used info 
   *  
   * @return int[] result 
   * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree; 
   * @throws IOException 
   * @throws InterruptedException 
   */ 
   public static int[] getMemInfo() 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:"))  
            result[0] = Integer.parseInt(token.nextToken());  
         else if(str.equalsIgnoreCase("MemFree:"))  
            result[1] = Integer.parseInt(token.nextToken());  
         else if(str.equalsIgnoreCase("SwapTotal:"))  
            result[2] = Integer.parseInt(token.nextToken());  
         else if(str.equalsIgnoreCase("SwapFree:"))  
            result[3] = Integer.parseInt(token.nextToken());  
      }  
     
      return result;  
   }  
 
   /** 
   * get memory by used info 
   *  
   * @return float efficiency 
   * @throws IOException 
   * @throws InterruptedException 
   */ 
   public static float getCpuInfo() 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();  
      int user1 = Integer.parseInt(token.nextToken());  
      int nice1 = Integer.parseInt(token.nextToken());  
      int sys1 = Integer.parseInt(token.nextToken());  
      int idle1 = Integer.parseInt(token.nextToken());  
     
      Thread.sleep(1000);  
 
      br = new BufferedReader(  
      new InputStreamReader(new FileInputStream(file)));  
      token = new StringTokenizer(br.readLine());  
      token.nextToken();  
      int user2 = Integer.parseInt(token.nextToken());  
      int nice2 = Integer.parseInt(token.nextToken());  
      int sys2 = Integer.parseInt(token.nextToken());  
      int idle2 = Integer.parseInt(token.nextToken());  
 
      return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1));  
   }  
}  
 
/** 
* 测试类 
*  
* <p>@author javer QQ:84831612</p> 
* @date 2005 
*/ 
public class JaverTest  
{  
    public static void main(String[] args) throws Exception  
    {  
        int[] memInfo = LinuxSystemTool.getMemInfo();  
        System.out.println("MemTotal:" + memInfo[0]);  
        System.out.println("MemFree:" + memInfo[1]);  
        System.out.println("SwapTotal:" + memInfo[2]);  
        System.out.println("SwapFree:" + memInfo[3]);  
 
        System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo());  
    }  


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**


* 取得linux系统下的cpu、内存信息
*
* */
public final class LinuxSystemTool
{
   /**
   * get memory by used info
   *
   * @return int[] result
   * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;
   * @throws IOException
   * @throws InterruptedException
   */
   public static int[] getMemInfo() 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:"))
            result[0] = Integer.parseInt(token.nextToken());
         else if(str.equalsIgnoreCase("MemFree:"))
            result[1] = Integer.parseInt(token.nextToken());
         else if(str.equalsIgnoreCase("SwapTotal:"))
            result[2] = Integer.parseInt(token.nextToken());
         else if(str.equalsIgnoreCase("SwapFree:"))
            result[3] = Integer.parseInt(token.nextToken());
      }
  
      return result;
   }

   /**
   * get memory by used info
   *
   * @return float efficiency
   * @throws IOException
   * @throws InterruptedException
   */
   public static float getCpuInfo() 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();
      int user1 = Integer.parseInt(token.nextToken());
      int nice1 = Integer.parseInt(token.nextToken());
      int sys1 = Integer.parseInt(token.nextToken());
      int idle1 = Integer.parseInt(token.nextToken());
  
      Thread.sleep(1000);

      br = new BufferedReader(
      new InputStreamReader(new FileInputStream(file)));
      token = new StringTokenizer(br.readLine());
      token.nextToken();
      int user2 = Integer.parseInt(token.nextToken());
      int nice2 = Integer.parseInt(token.nextToken());
      int sys2 = Integer.parseInt(token.nextToken());
      int idle2 = Integer.parseInt(token.nextToken());

      return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1));
   }
}

/**
* 测试类
*
* <p>@author javer QQ:84831612</p>
* @date 2005
*/
public class JaverTest
{
    public static void main(String[] args) throws Exception
    {
        int[] memInfo = LinuxSystemTool.getMemInfo();
        System.out.println("MemTotal:" + memInfo[0]);
        System.out.println("MemFree:" + memInfo[1]);
        System.out.println("SwapTotal:" + memInfo[2]);
        System.out.println("SwapFree:" + memInfo[3]);

        System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo());
    }
} (http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、perl之类的东西。而且安装也要好几个步骤,似乎比较麻烦。本来也想直接调用sar、vmstat之类的命令,parse一下结果就算了。哪知道发现不同的版本的linux这些命令的结果也都是不一样。既然要按版本 parse它们的结果,那还不如直接去系统里面获得算了。于是研究了一下sysstat(http://freshmeat.net/projects/sysstat/)和gkrellm(http://gkrellm.net )的源代码,找到监测性能的数据所在。



1、CPU



在文件"/proc/stat"里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分别是: user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在,CPU的每tick用在了哪里。例如:

cpu0 256279030 0 11832528 1637168262

就是cpu0从开机到现在有 256279030 tick用在了user消耗,11832528用在了sys消耗。所以如果想计算单位时间(例如1s)里面CPU的负载,那只需要计算1秒前后数值的差除以每一秒的tick数量就可以了。gkrellm就是这样实现的:((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2

例如,第一次读取/proc/stat,user的值是256279030;一秒以后再读一次,值是256289030,那么CPU在这一秒的user消耗就是:((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。



2、内存消耗



文件"/proc/meminfo"里面包含的就是内存的信息,还包括了swap的信息。例如:





$ cat /proc/meminfo

total:    used:    free:  shared: buffers:  cached:
Mem:  1057009664 851668992 205340672        0 67616768 367820800
Swap: 2146787328 164429824 1982357504
MemTotal:      1032236 kB
MemFree:        200528 kB
MemShared:           0 kB
……

不过从gkrellm的源代码看,有些版本没有前面那两行统计的信息,只能够根据下面的Key: Value这种各式的数据收集。



3、磁盘空间



从gkrellm的源代码看,这个是一个很复杂的数据。磁盘分区的数据有可能分布在:/proc/mounts、/proc/diskstats、 /proc/partitions等等。而且如果想要检查某几个特定的路径,还需要通过mount、df等命令的帮助。为了减少麻烦,这个数据我就直接用 statfs函数直接获得了。



int statfs(const char *path, struct statfs *buf);

这个函数只需要输入需要检查的路径名称,就可以返回这个路径所在的分区的空间使用情况:

总空间:buf.f_bsize * buf.f_blocks

空余空间:buf.f_bsize * buf.f_bavail



4、磁盘I/O



磁盘I/O的数据也同样比较复杂,有些版本看/proc/diskstats,有些版本看/proc/partitions,还有些版本至今我也不知道在那里看……不过可以看到数据的版本也像CPU那样,需要隔一段时间取值,两次取值的差就是流量。



5、网络流量



网络流量也是五花八门,不过基本上都可以在/proc/net/dev里面获得。同样也是需要两次取值取其差作为流量值。

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
posted @ 2008-09-22 20:01 无会 阅读(124) 评论(0) 编辑
  2008年7月14日
1,直辖市:
北京市-ペキン市  
天津市-テンシン市
上海市-シャンハイ市
重庆市-じゅうけい市

2,自治区:
内蒙古自治区-うちもうこ じちく(首府フホウト)
新疆维吾尔自治区-しんきょう ウイグル じちく(首府ウルムチ)
宁夏回族自治区-ねいか かいぞく じちく(首府ぎんせん,インツアン)
广西壮族自治区-こうせい チワンぞく じつく(首府ナンイン)
西藏自治区-チベット じちく(首府ラサ)

3,省:
黑龙江省-こくりゅうこう しょう(省会ハルピン)
吉林省-きつりん しょう (省会ちょうしゅん,チャンツン)
辽宁省-りょうねい しょう(省会しんよう,センヤン)
河北省-かほく しょう(省会せつかしょう,シジャツアン)
河南省-かなん しょう(省会ていしゅう,ゼンゾウ)  
山东省-さんとう しょう(省会さいなん,チーナン)
山西省-さんせい しょう(省会たいげん,たいンユァン)
湖南省-こなん しょう(省会ちょうさ,チヤンサー)
湖北省-こほく しょう(省会ぶかん,ウーハン)
江苏省-こうそ しょう(省会ナンキン)
安徽省-あんき しょう(省会ごうひ,ホウヘイ)
浙江省-せっこう しょう(省会こうしゅう,ハンジョウ)
福建省-ふっけん しょう(省会ふくしゅう,フウジョウ)
江西省-こうせい しょう(省会なんしょう,ナンチヤン)
广东省-カントン しょう(省会こうしゅう,ぐアンジョウ)
海南省-かいなん しょう(省会かいこう,ハイコウ)
贵州省-きしゅう しょう(省会きよう,クイヤン)
云南省-うんなん しょう(省会こんめい,クンミン)
四川省-しせん しょう(省会せいと,チエンドー)
陕西省-せんせい しょう(省会せいあん,しいアン)
青海省-せいかい しょう(省会せいねい,シイニン)
甘肃省-かんしゅく しょう(省会らんしゅう,ランジョウ)
台湾省-たいわん しょう(省会たいほく,タイベイ)

4,特别行政区
香港特别行政区ーホンコン とくべつぎょうせいく
澳门特别行政区ーマカオとくべつぎょうせいく
posted @ 2008-07-14 16:39 无会 阅读(135) 评论(0) 编辑
  2008年1月10日
A:エ   B:ビ     C:シ   D:ディ   E:イ  F:エフ  
G:ジ    H:エイチ    I:アイ  J:ジェ   K:ケ   L:エル 
M:エム   N:エヌ   O:オ   P:ピ   Q:キュ   R:アル 
S:エス   T:ティ   U:ユ   V:ヴイ  W:ダブリュ X:エックス
Y:ワイ Z:ゼット
posted @ 2008-01-10 07:54 无会 阅读(505) 评论(1) 编辑
  2007年12月26日

65个源代码网站

1.51源码:http://www.51aspx.com/
2.源码之家:http://www.codejia.com/
3.源码网:http://www.codepub.com/
4.虾客源码:http://www.xkxz.com/
5.源码开发网:http://www.codedn.com/
6.洪越源代码:http://www.softhy.net/
7.锋网源码:http://www.fwvv.net/
8.代码爱好者:http://www.codefans.com/
9.爱源码:http://www.aiyuanma.com/
10.酷源码:http://www.kyuanma.com/
11.搜源码:http://www.soucode.com/
12.拉基源码:http://www.lajicode.com/
13.源软中国:http://www.600it.com/
14.源码天空:http://www.codesky.net/
15.源码吧:http://www.asp88.net/
16.绿色源码:http://code888.cn/
17.9号源码中心:http://www.9code.com/
18.网馨源码:http://www.asppsa.com/
20.源码天下:http://www.pccode.net/
21.需要源码:http://www.needcode.cn/(感觉不错!)
22.华夏源码:http://www.haocpu.com/
23.天新网:http://codes.21tx.com/
24.源码网:http://www.yuanma5.com/(感觉不错!)
25.无忧源码:http://www.5uym.com/(有演示地址)
26.中国下载站:http://www.cnz.cc/
27.资源吧:http://www.ziyuan8.com/
28.启明星源码:http://www.codewww.com/
29.我要源码:http://www.xia51.com/
30.清秋源码:http://www.asp678.com/
31.万润源码:http://www.mwzv.com/
32.代码秀:http://www.39g.com/
33.中文天下源码站:http://www.zwsky.net/
34.世纪源码:http://www.sjcodes.com/
35.源码300:http://www.ym300.com/
36.问友源码:http://www.winu.cn/
37.梦想源码:http://gjj.cc/ZongHe/ZiXun/52086.htm
38.源码联盟:http://www.aspsun.com
39.168源码:http://www.168code.com/
40.源码大全:http://www.2007boys.cn/
41.易搜源码:http://www.yscode.com/
42.下吧源码:http://www.xia8.com/
43.早雪网:http://www.zaoxue.com
44.我要下源码:http://www.51xia.net/
45.54源码:http://www.54code.com/
46.久久源码:http://www.99code.net
47.中国web开发者网络:http://www.webasp.net/
48.源码之家:http://www.mycodes.net/
49.新E家源码:http://www.92e.net/
50.中国源码下载站:http://www.downcode.com/
51.第四源码:http://www.asp4.cn/
52.asp1源码:http://www.asp1.com.cn/
53.华南源码:http://www.fjcode.cn
54.源码分享:http://www.codeftp.cn/
55.好源码:http://www.haocodes.com/
56.算法源码吧:http://www.sfcode.cn/(有意思!)
57.龙都源码:http://www.londu.net/
58.精华源码:http://www.jhdown.com/
59.逆流源码:http://www.niliu.cn/
60.中国源码教程网:http://www.kuziyuan.com/
61.源代码:http://www.fgfg.net/
62.源码中国:http://www.cn700.com/
63.怀化源码网:http://www.xp90.com/sort/242_1.html
64.中国源码之家:http://www.chcode.net/
65.侠载源码:http://www.xiacode.com/

posted @ 2007-12-26 21:29 无会 阅读(171) 评论(1) 编辑
  2007年12月17日
小明和小强都是张老师的学生,张老师的生日是 M月 N日,
2人都知道张老师的生日是下列 10组中的一天,
张老师把 M值告诉了小明,把 N值告诉了小强,
张老师问他们知道他的生日是那一天吗?
3月4日 3月 5日 3月8 日
6月4日 6 月7日
9月1 日 9月5日
12 月1日 12月2 日 12月8日
小明说:如果我不知道的话,小强肯定也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
原文
posted @ 2007-12-17 22:08 无会 阅读(411) 评论(0) 编辑