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里面获得。同样也是需要两次取值取其差作为流量值。

 

 


1. Java代码 
2. import
3. import
4. import
5. import
6. import
7. import
8.   
9. /**  
10. 
11. 
12. * 取得linux系统下的cpu、内存信息  
13. *   
14. * */
15. public final class
16. {   
17. /**  
18.    * get memory by used info  
19.    *   
20.    * @return int[] result  
21.    * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;  
22.    * @throws IOException  
23.    * @throws InterruptedException  
24.    */
25. public static int[] getMemInfo() throws
26.    {   
27. new File("/proc/meminfo");   
28. new BufferedReader(new
29. new
30. int[] result = new int[4];   
31. null;   
32. null;   
33. while((str = br.readLine()) != null)   
34.       {   
35. new
36. if(!token.hasMoreTokens())   
37. continue;   
38.       
39.          str = token.nextToken();   
40. if(!token.hasMoreTokens())   
41. continue;   
42.       
43. if(str.equalsIgnoreCase("MemTotal:"))   
44. 0] = Integer.parseInt(token.nextToken());   
45. else if(str.equalsIgnoreCase("MemFree:"))   
46. 1] = Integer.parseInt(token.nextToken());   
47. else if(str.equalsIgnoreCase("SwapTotal:"))   
48. 2] = Integer.parseInt(token.nextToken());   
49. else if(str.equalsIgnoreCase("SwapFree:"))   
50. 3] = Integer.parseInt(token.nextToken());   
51.       }   
52.       
53. return
54.    }   
55.   
56. /**  
57.    * get memory by used info  
58.    *   
59.    * @return float efficiency  
60.    * @throws IOException  
61.    * @throws InterruptedException  
62.    */
63. public static float getCpuInfo() throws
64.    {   
65. new File("/proc/stat");   
66. new BufferedReader(new
67. new
68. new
69.       token.nextToken();   
70. int
71. int
72. int
73. int
74.       
75. 1000);   
76.   
77. new
78. new InputStreamReader(new
79. new
80.       token.nextToken();   
81. int
82. int
83. int
84. int
85.   
86. return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1));   
87.    }   
88. }   
89.   
90. /**  
91. * 测试类  
92. *   
93. * <p>@author javer QQ:84831612</p>  
94. * @date 2005  
95. */
96. public class
97. {   
98. public static void main(String[] args) throws
99.     {   
100. int[] memInfo = LinuxSystemTool.getMemInfo();   
101. "MemTotal:" + memInfo[0]);   
102. "MemFree:" + memInfo[1]);   
103. "SwapTotal:" + memInfo[2]);   
104. "SwapFree:" + memInfo[3]);   
105.   
106. "CPU利用率:"
107.     }   
108. }  
109. 
110. import
111. import
112. import
113. import
114. import
115. import
116. 
117. /** 
118. 
119. 
120. * 取得linux系统下的cpu、内存信息 
121. * 
122. * */
123. public final class
124. { 
125. /** 
126.    * get memory by used info 
127.    * 
128.    * @return int[] result 
129.    * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree; 
130.    * @throws IOException 
131.    * @throws InterruptedException 
132.    */
133. public static int[] getMemInfo() throws
134.    { 
135. new File("/proc/meminfo"); 
136. new BufferedReader(new
137. new
138. int[] result = new int[4]; 
139. null; 
140. null; 
141. while((str = br.readLine()) != null) 
142.       { 
143. new
144. if(!token.hasMoreTokens()) 
145. continue; 
146.    
147.          str = token.nextToken(); 
148. if(!token.hasMoreTokens()) 
149. continue; 
150.    
151. if(str.equalsIgnoreCase("MemTotal:")) 
152. 0] = Integer.parseInt(token.nextToken()); 
153. else if(str.equalsIgnoreCase("MemFree:")) 
154. 1] = Integer.parseInt(token.nextToken()); 
155. else if(str.equalsIgnoreCase("SwapTotal:")) 
156. 2] = Integer.parseInt(token.nextToken()); 
157. else if(str.equalsIgnoreCase("SwapFree:")) 
158. 3] = Integer.parseInt(token.nextToken()); 
159.       } 
160.    
161. return
162.    } 
163. 
164. /** 
165.    * get memory by used info 
166.    * 
167.    * @return float efficiency 
168.    * @throws IOException 
169.    * @throws InterruptedException 
170.    */
171. public static float getCpuInfo() throws
172.    { 
173. new File("/proc/stat"); 
174. new BufferedReader(new
175. new
176. new
177.       token.nextToken(); 
178. int
179. int
180. int
181. int
182.    
183. 1000); 
184. 
185. new
186. new InputStreamReader(new
187. new
188.       token.nextToken(); 
189. int
190. int
191. int
192. int
193. 
194. return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1)); 
195.    } 
196. } 
197. 
198. /** 
199. * 测试类 
200. * 
201. * <p>@author javer QQ:84831612</p> 
202. * @date 2005 
203. */
204. public class
205. { 
206. public static void main(String[] args) throws
207.     { 
208. int[] memInfo = LinuxSystemTool.getMemInfo(); 
209. "MemTotal:" + memInfo[0]); 
210. "MemFree:" + memInfo[1]); 
211. "SwapTotal:" + memInfo[2]); 
212. "SwapFree:" + memInfo[3]); 
213. 
214. "CPU利用率:"
215.     } 
216. }