一、获取CPU利用率信息

一般来说对于需要大量cpu计算的进程,当前端压力越大时,CPU利用率越高。但对于I/O网络密集型的进程,即使请求很多,服务器的CPU也不一定很到,这时的服务瓶颈一般是在磁盘的I/O上。比较长见的就是,大文件频繁读写的cpu开销远小于小文件频繁读写的开销。因为在I/O吞吐量一定时,小文件的读写更加频繁,需要更多的cpu来处理I/O的中断。



在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。



在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。



在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(详细的解释可参考:http://www.linuxhowtos.org/System/procstat.htm)。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。


示例:

linux-rd4x:~> cat /proc/stat
cpu  165297 50 5283 6021565 3674 1408 1872 0 0
cpu0 52247 43 2986 3060039 2755 918 1107 0 0
cpu1 113050 7 2297 2961526 918 489 764 0 0
intr 6617373 137 8 0 1 1 0 5 0 1 0 0 0 105 0 0 9889 0 17550 0 765780 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 5169085
btime 1328833557
processes 17639
procs_running 1
procs_blocked 0
softirq 5696593 0 3768625 166739 765254 26218 2 466192 5695 497868


输出解释
CPU                            CPU0、CPU1

cpu 0-4的和               分别对应多核cpu的1和2

参数 解释
user (165297) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (50) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system (5283) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle (6021565) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (3674) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
irq (1408) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq (1872) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

CPU时间=user+system+nice+idle(+iowait+irq+softirq)——后面三个参数信息在部分版本中可能没有

“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
“processes (total_forks) 自系统启动以来所创建的任务的个数目。
“procs_running”:当前运行队列的任务的数目。
“procs_blocked”:当前被阻塞的任务的数目。


cpu利用率的计算方式(需要取两个不同时刻的参数信息):

方式一:

cpu usage=(idle2-idle1)/(cpu2-cpu1)*100

方式二:
cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(cpu_2 - cpu_1)*100

或:

cpu usage=[(user_2 +sys_2) - (user_1 + sys_1)]/(cpu_2 - cpu_1)*100

PS:

1.两次的CPU采样需要隔一段时间;

2.需要注意分母若为0的情况,可理解为cpu利用率为0;


二、获取内存相关信息

linux-rd4x:~> free
             total       used       free     shared    buffers     cached
Mem:        502204     382416     119788          0      51300     280304
-/+ buffers/cache:      50812     451392
Swap:      1550232          0    1550232

数值解释:
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。

区别:

第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。

这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是16176KB,已用内存是3250004KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。
如上例:
451392=119788+51300+280304


从/proc/meminfo也可以查看内存信息,计算方式与上述相同:

linux-rd4x:~> cat /proc/meminfo


MemTotal:         502204 kB

MemFree:          120144 kB

Buffers:           50988 kB

Cached:           260348 kB


SwapCached:            0 kB


Active:           122912 kB


Inactive:         222692 kB


Active(anon):      34452 kB


Inactive(anon):        0 kB


Active(file):      88460 kB


Inactive(file):   222692 kB


Unevictable:           0 kB


Mlocked:               0 kB


HighTotal:             0 kB


HighFree:              0 kB


LowTotal:         502204 kB


LowFree:          120144 kB


SwapTotal:       1550232 kB


SwapFree:        1550232 kB


........