一、获取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
........