|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( F/ J4 X6 A% f) C) j' c6 F m: e- s2 `
“proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。”
6 o# a8 `; T, |# y6 m$ Z7 v* k3 L( e
这里将介绍如何从/proc文件系统中获取与防火墙相关的一些性能参数,以及如何通过/proc文件系统修改内核的相关配置。/ M+ O" o; e; U, W v8 N! {2 {
6 x7 O! e, }' {
1、从/proc文件系统获取相关的性能参数
V) A _% Y/ R
( t" j- h& D2 H2 a. N2 x1 p cpu使用率: /proc/stat0 L" C: l+ Z! X' h4 b, `
, X7 o9 M# V: f! G, ~, V
内存使用情况: /proc/meminfo, g! j5 [* i" j, @; q& E) J4 y
: C7 X% s( K& o* s
网络负载信息: /proc/net/dev
5 V7 _$ R% u8 C" C& R7 R0 [/ [( d% t9 L9 u
相应的计算方法:(摘自:什么是proc文件系统,见参考资料)
& G1 g9 o1 _# R$ \0 M
; y n* j7 S* F- x& N# a. j (1) 处理器使用率; B& @$ e: b! j4 j- \/ m: w$ H( G
1 {% A" ^# x. F/ ?! o (2) 内存使用率
2 G, L/ S/ E9 L, |5 p
( K: D+ V! [' U& m- }9 N (3) 流入流出数据包8 O# o2 W. ~" u
# ?, L9 \7 k4 A% u1 D (4) 整体网络负载/ d1 A+ x' b: F. N T u& x
/ }/ A; p. c% L: _! e 这些数据分别要从/proc/stat、/proc/net/dev、/proc/meminfo三个文件中提取。如里有问题或对要提取的数据不太清楚,可以使用man proc来查看proc文件系统的联机手册。
4 U' |/ j# X ]* F
0 I+ y, O. @5 G1 `+ H5 D" J- B5 u (1) 处理器使用率, S2 j, O* Y+ C. U* k5 H4 B
4 n" v- L) p: R9 Y7 ]2 { 这里要从/proc/stat中提取四个数据:用户模式(user)、低优先级的用户模式(nice)、内核模式(system)以及空闲的处理器时间(idle)。它们均位于/proc/stat文件的第一行。CPU的利用率使用如下公式来计算。
) [; @$ X& t- e5 W# v, W, c Q+ ?/ L+ x4 r
CPU利用率 = 100 *(user + nice + system)/(user + nice + system + idle)
7 `" N4 o' k1 M8 M/ J0 n! _4 b, s' V. M. R
(2) 内存使用率* a z( t' j. N v! R1 |
4 V' j' w, C' F2 k$ H 这里需要从/proc/meminfo文件中提取两个数据,当前内存的使用量(cmem)以及内存总量(amem)。
( l; a0 F: q' T! \1 ~ h! \
o2 @3 l9 S* g6 [ 内存使用百分比 = 100 * (cmem / umem)
# L1 r' q, n7 t; d A5 F% U7 x5 A9 @8 b' @3 K9 }, m2 ]
(3)网络利用率3 f; o/ ^& V' @+ U$ W ]! e9 C/ m
5 @( `: F% |3 Z2 V
为了得到网络利用率的相关数据,需要从/proc/net/dev文件中获得两个数据:从本机输出的数据包数,流入本机的数据包数。它们都位于这个文件的第四行。( X! K$ Z" e0 E5 `
) h" w& D, I. K7 }
性能收集程序开始记录下这两个数据的初始值,以后每次获得这个值后均减去这个初始值即为从集群启动开始从本节点通过的数据包。% J7 E) B/ k- F# z. Q1 F
9 _$ U( N) @ s& |
利用上述数据计算出网络的平均负载,方法如下:; L& `5 Z: ~- Q2 ^) c; b
: V# r; j v& E% d4 c: Y 平均网络负载 = (输出的数据包+流入的数据包) / 2
1 e M! X) B G0 Z' v3 d% }; }, l9 _ Y
2. 通过/proc文件系统调整相关的内核配置- P3 h. v2 M, Z, W0 ?' Y+ b0 ?( e
2 {. Q* a6 h3 Y 允许ip转发 /proc/sys/net/ipv4/ip_forward
% E5 i2 ]* O/ C0 l* @$ A1 }% n9 F1 D, r9 z- ?, b( B B: h; z3 E
禁止ping /proc/sys/net/ipv4/icmp_echo_ignore_all
+ q. i B8 @8 `; A& i! m" ` v6 H* ~% B* b) M" I
可以在命令行下直接往上述两个“文件”里头写入“1”来实现相关配置,如果写入“0”将取消相关配置。不过在系统重启以后,这些配置将恢复默认设置,所以,如果想让这些修改生效,可以把下面的配置直接写入/etc/profile文件,或者其他随系统启动而执行的程序文件中。
4 I! g" j5 Q+ C9 D" `! y6 V
9 U3 \4 q$ j& I7 \" m echo 1 》 /proc/sys/net/ipv4/ip_forward
; `! w6 A' q0 Q: p1 V8 [5 M" L5 y* x" {: Q( {; e
echo 1 》 /proc/sys/net/ipv4/icmp_echo_ignore_all
+ v" R7 z2 s# _: \" B+ u- }6 @. M1 E+ q+ l1 E0 }
这里计算cpu使用率是有问题的,需要使用上一状态的值来计算) H) U8 J. _( J7 [) h; e
' u9 e( M8 l6 b9 Y: ~
正确的计算方法是,等上一个时间:
: O U- H- ^. R/ y2 |3 t, M7 G) g
1、记录某个时刻cpu的使用情况! d5 E% m8 f8 V |
' f0 w) K( k$ F! p
2、等上一个时间段
1 r! l( h) ]) C4 T- q4 A
- H) T' k0 O( \, t 3、再记录此刻的cpu使用情况" O% @, T$ f K" s* f/ J9 U! L
6 J- v5 _$ |9 [
4、计算总的时间片$ j& d' G9 a6 K- d+ _* g5 i H
) I K/ V7 ~( U# Q
把第一次的所有cpu使用情况求和,得到j1; |: g4 d1 ~+ F; |: |% i" t0 Y+ F
( W" X6 W% p' |; \9 n
把第二次的所有cpu使用情况求和,得到j2
7 U" [0 q* U f- ^6 }( y% c( r6 v) R
j2-j1得到这个时间段的所有时间片
* [8 i' r' ^+ f5 O$ S/ X$ {5 _0 _2 \
即total=j2-j1=第二次的所有列的和-第一次的所有列的和
- P; u& E/ Y9 k' C! E9 ?
3 r$ p; {' r/ w3 { 5、计算idle时间
9 L f- K. G# N. M7 r3 U. w( J4 n, N4 A
idle对应第五列的数据,用第二次的减去第一次的即可- }# R& Z3 S0 _$ L Q/ Z6 B
- O" s7 J6 g. I% N( O% _; w
idle=第二次的第五列-第一次的第五列
" Z' E& [3 R4 f* M! [* W
* b0 g+ b) }$ Q5 A 6、计算cpu使用率+ n, u# V( Q$ V: ^1 v) V8 w ~
4 }, F7 M+ G9 O1 _6 ]/ s rate=(total-idle)/total3 P3 g8 D/ @& x
0 ~0 r5 T5 _: Q7 G; `
在Linux/Unix下,CPU利用率分为用户态 ,系统态 和空闲态 ,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间 。9 ~/ |+ X0 ^' L1 L% K
$ q# O0 F: I# h8 I8 N! _
linux c程序获取cpu使用率及内存使用情况/ U* _6 g. H* M. A) f1 _& O
% _# m! e0 d: {) v& _8 t) ~
2009-05-17 23:108 r6 v& x$ `# X: l% \
2 g( W* } P: E$ k
想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了。! t3 r0 N# m5 P _: L8 ^7 _
* R( p& T1 R* b, M# D J
方法就是读取proc下的文件来获取了。 cpu使用率: /proc/stat ,内存使用情况: /proc/meminfo% ~8 Q. ?' @' t0 L
- [7 d8 N) v. m! o% U& D, \. k$ l/ d
看程序 :
. t1 G* e: J# X% \" O8 w8 f* s1 f) Y+ m2 g
/***************************************************************
, a2 G1 o6 ^) R" j1 q1 }
) M, f3 z5 Z7 Q: d1 D9 m' Z * @file: statusinfo.c7 U$ A+ z# r& V
/ J z7 ?8 r4 S$ }9 ~6 h( a *
8 ~7 K' J1 A$ V, E" d* V W/ \, |2 K, c* y) r
* @brief: 从linux系统获取cpu及内存使用情况
8 c/ D' x& b3 E6 }, Y% y5 Y0 p. G3 `9 T
*
8 |3 i) Z# h1 z* M, V
+ W1 e4 Z T3 v * @version 1.06 `! w* s9 g, b7 j* u8 v7 p7 Z
9 a( {3 Z9 [% d1 Y3 r3 I8 i *, B! [* c) U! ` {+ J2 B
: {/ |2 F/ m: G; \& |
***************************************************************/& n& G! k2 U- M+ O {' K
8 H2 X! K; d1 P: |# y
typedef struct PACKED //定义一个cpu occupy的结构体' u7 |" q* G& b/ B, X m8 o
' u/ I4 ^1 P3 u, T8 I {
; w" z8 J( t* R: D: b Z
! p0 s, ]* U" s: m# j char name[20]; //定义一个char类型的数组名name有20个元素
; o& | w+ v7 j# e$ R4 `
9 j' k" ^" U9 I1 N8 {9 N unsigned int user; //定义一个无符号的int类型的user9 J/ h5 T2 a# x0 b0 A
0 D/ |5 m! P1 Q7 }6 N$ {. a unsigned int nice; //定义一个无符号的int类型的nice
8 C( q* X% G! w, I" U& N5 Y) g1 e7 \: `
unsigned int system;//定义一个无符号的int类型的system$ u% }, E+ }0 x
3 e7 _8 q1 W9 i' L unsigned int idle; //定义一个无符号的int类型的idle
3 y* p K; Z* [6 O& i
+ a# o2 R! b0 ^ }CPU_OCCUPY;8 O; k2 I6 W+ c% V _/ G
2 z+ ?2 T; Y0 z
typedef struct PACKED //定义一个mem occupy的结构体
9 }. \) U0 `" j# g* v( ^% b4 |
1 Y# h. l5 h& |5 G% ] {; W( ~4 Q( T, [% n# c7 t$ y
, t, E+ K+ v$ ~
char name[20]; //定义一个char类型的数组名name有20个元素- B. `9 n7 J1 D) S) N: c
: N% p: i2 q8 B3 ]8 p: k
unsigned long total;
3 s q1 m/ q* x9 G% K4 Z6 p0 P' y/ P* w, d' `
char name2[20];8 z& v& r! g. j6 V
- L/ Y6 I5 M ?, Q( Y unsigned long free;
5 d9 B+ ?$ K* D0 S& @7 D' o5 P! t- q, v Z
}MEM_OCCUPY;
& }6 c% `; `1 Z1 k+ x9 i1 I' q
6 k/ X7 O- h/ D. z2 Z/ l get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O
S X8 Q7 K( n& b4 _9 d
+ s# _, \ B7 M6 z {) M7 Y8 U9 W* u/ u7 S
. _ D) G( k/ s0 v6 u" ~ FILE *fd;
3 L. x2 Y& J& Z" X* O6 w( v" b- E
int n;
) P& w7 G: A* J: e" ^. A; O$ y3 e3 n
char buff[256];: h7 y* y6 F7 v+ S2 y8 u
( {' z" N9 W' F/ d MEM_OCCUPY *m;
' h' S* F7 Q) q2 t
! }! q; L0 P- j4 [/ L m=mem;
0 n) R# m) | j: G2 c- K1 J
* s) l4 z; @2 y" J, V& z$ ?5 Z fd = fopen (“/proc/meminfo”, “r”);
0 B% `( `' l7 R1 j# Y! K& b: H; ~5 \% {5 |% [
fgets (buff, sizeof(buff), fd);
* L& v+ u7 p$ k
% D" g; S2 _) w6 ?, ]4 V3 E5 ?. m fgets (buff, sizeof(buff), fd);
3 S; g" K9 g. J K/ `% P
' p, b& H- ~! ~" U8 O, F& U9 o7 K! B fgets (buff, sizeof(buff), fd);
2 F" e) w% ~& w7 _- {; w7 d% ^7 f1 Y0 q* ]# `% m
fgets (buff, sizeof(buff), fd);
& h. p/ E) f; I) Y$ ^, W' P+ n$ [" V4 Z7 K( u+ Y7 G. g* h
sscanf (buff, “%s %u %s”, m-》name, &m-》total, m-》name2);
$ X2 {! k% ~" y' ]1 {
. h& p3 I1 ?- u0 d) E; C: _. x fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
4 @) e$ Y. ?) ]" ]$ Z, R
0 u* R3 \3 k1 Y- ^ sscanf (buff, “%s %u”, m-》name2, &m-》free, m-》name2);" b6 a- f9 B- J! y1 L. k9 P$ Y
5 m8 v( T! D3 B6 ~
fclose(fd); //关闭文件fd
( M( B# R: I7 q+ H( \* N% l G4 g3 v
}
# Z3 d+ B2 o6 }) H* {# V4 }: `6 o2 ^ }
int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)1 U& r' u$ |6 X: L2 [' J
) M6 Z+ ^/ d8 h0 Y2 C+ r
{
$ k4 K2 F7 P; s' G$ e2 a y& f
- [" \! G6 `2 L- g* T. [& B3 w unsigned long od, nd;0 A2 }5 M& q( @0 ~. B8 X8 M/ X
0 @ W o3 I' _" b9 A* C: i9 a
unsigned long id, sd;
o! p ^' b+ Z: j' j
0 @. @' N" a2 ^$ d( c( h int cpu_use = 0;
! O2 T9 }: m+ i _# R9 j
. i1 ~4 Y$ D: w4 A. R* S; B od = (unsigned long) (o-》user + o-》nice + o-》system +o-》idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od) [) E5 C! M: C: H/ x
" r/ m- J1 z% o2 A/ h6 s nd = (unsigned long) (n-》user + n-》nice + n-》system +n-》idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od
+ s, t8 G- ]& ?. F" Q
" k5 v# X/ {' ~2 I id = (unsigned long) (n-》user - o-》user); //用户第一次和第二次的时间之差再赋给id5 n5 [# C/ e$ V u
$ E- e) @6 U% V$ Q5 E& t) L
sd = (unsigned long) (n-》system - o-》system);//系统第一次和第二次的时间之差再赋给sd
8 ]& b. r. j; }3 c w' p( J! @* y/ s7 r" g. Z
if((nd-od) != 0)
" ^3 }* z! m5 H" @% C/ B! G$ ~
7 \- A2 ]0 ]- |) g2 t! Y7 @% o cpu_use = (int)((sd+id)*10000)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
$ Z! U/ H$ I' c/ R: ~ n# S( c6 q) {' P8 {$ ^
else cpu_use = 0;
8 p0 G; A# L' w$ _/ a. S# i8 f7 L& {+ ~
//printf(“cpu: %u/n”,cpu_use);
5 ~8 J G) P( l5 ^5 x: R3 d
% m3 w9 |# A+ ? return cpu_use;
* C: Q; M7 T1 G$ T' m8 g+ p6 Z; d0 K" r$ L- o& z* r6 n
}4 L* G. G. D9 q; ^" r+ `( Z) {
* z& ]- ~+ H7 a5 V3 }- M* D2 H get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形参结构体类弄的指针O7 j0 c! R% T2 x0 N I- {
3 O# b: e1 }* p0 }
{
: s- Q- z$ E8 `1 y5 l1 \$ N' [( k" j" @. d
FILE *fd;2 i6 Z, H Q0 T6 m% [) h
& B* @- i/ x0 V$ D# T: q' ` int n;* O" e6 b2 \' s
" U: O: X6 p4 C0 w char buff[256];
$ Y3 E9 N: |/ [- U+ p" H% o( }: C/ M
j# p, r) \9 D0 _. |& @7 O- F) T CPU_OCCUPY *cpu_occupy;
/ M; Z! o* G% b( w& l" H1 @9 r. r
6 b/ R) \5 ~5 j2 U4 E s3 {; l- @ p cpu_occupy=cpust; ~$ M- k, x* h) N
$ b/ u# `7 N4 K* ~ fd = fopen (“/proc/stat”, “r”);
: z* D: e- t6 U" Z8 ]7 F; Z# L1 l' n) g6 a: ^1 i
fgets (buff, sizeof(buff), fd);: ^( o# X& ~. [
4 G$ P, ~) T; U, Q' g sscanf (buff, “%s %u %u %u %u”, cpu_occupy-》name, &cpu_occupy-》user, &cpu_occupy-》nice,&cpu_occupy-》system, &cpu_occupy-》idle);1 y' p- J' M: S" c
, P; Q$ r _6 n7 b6 U% w; H
fclose(fd);# E7 T- C* v" B. r8 l3 c
8 S) v: t& J( S1 |8 Z9 A/ L1 c2 b
}, v9 Y! g( d& v3 a* s- w* Q/ }
- K( D t) Z9 U
int main()2 x1 y: L4 s5 w* h& d3 e% k" Z/ f* x
. ~1 W1 E$ m3 C; C/ Y" e0 R
{' t2 |2 l. F! F, o- m) ]
6 R1 J1 F) F9 z; b CPU_OCCUPY cpu_stat1;
3 M. v; ?' o1 Z/ i! u' [4 E# A+ k! s5 l1 C$ m# B: E6 Y/ C9 N8 ?5 ]
CPU_OCCUPY cpu_stat2;0 R$ c7 z' a2 |3 F/ y
1 u$ t- w* q% M MEM_OCCUPY mem_stat;
/ Y% l7 {+ ~) X9 w' i( R' c; O; h) f# b3 ?
int cpu;
) ~, O) y0 z" v4 g
+ d) q8 O( i6 { //获取内存
, |- y. I/ ]$ q. D# |# R" {: E, m6 K# ~9 [% f5 w
get_memoccupy ((MEM_OCCUPY *)&mem_stat);
o- k; [! U3 `" @$ t+ Z$ u! Y$ ]" {' p
//第一次获取cpu使用情况! M4 {( F- o0 D" F1 M8 a5 `
) `/ j, z, t: w2 d+ B2 b get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);
/ d5 o' f1 B5 J7 Q5 D
9 j6 @& T3 G9 q5 Y sleep(10);+ K$ y: N% u2 r% b4 w, {
: N+ I$ C& D. K- N$ U8 \4 D, P0 T
//第二次获取cpu使用情况
8 C. X* k2 B: L# m$ y J" h) w6 U) }! c# }6 j. K6 c5 m: g c. i
get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);
' q- O8 I0 K/ n/ F8 Y8 F* V$ U( T3 _( K0 m8 {/ K
//计算cpu使用率
9 b* A& ^2 f; I! J9 ~$ K: t0 h0 ^/ _" P9 {3 x3 L/ M- `
cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);
# M3 b/ d# ?! h X( G0 S" \+ Z) @
$ G7 K9 i5 K( T9 h return 0;, S' t% ?/ p+ k$ i
6 j9 q9 ] c {
}
4 T% _; L: I) ]3 |6 z9 p1 n
; _* `* A* o: U |
|