您的位置:首页 > 运维架构 > Linux

linux 常用操作命令(续)- 统计,管理

2013-09-18 15:13 267 查看
        本篇主要讲解在linux系统上面进行管理、统计时常用的一些命令,主要有
ps、sed、awk、iostat、、和 /proc/stat
的查看

1、ps

 ps -l   查看用户进程

 ps aux  查看目前系统所有进程

 pa axjf 列出类似进程树的程序显示

 ps -ef  所有程序

 USER 进程的属主;

 PID 进程的ID;

 PPID 父进程;

 %CPU 进程占用的CPU百分比;

 %MEM 占用内存的百分比;

 NI 进程的NICE值,数值大,表示较少占用CPU时间;

 VSZ 该进程使用的虚拟内存量(KB);

 RSS 该进程占用的固定内存量(KB)(驻留中页的数量);

 TTY 该进程在那个终端上运行(登陆者的终端位置),若与终端无关,则显示(?)。若为pts/0等,则表示由网络连接主机进程

 WCHAN 当前进程是否正在进行,若为-表示正在进行;

 START 该进程被触发启动时间;

 TIME 该进程实际使用CPU运行的时间;

 COMMAND 命令的名称和参数

 STAT状态位常见的状态字符

 D 无法中断的休眠状态(通常 IO 的进程);

 R 正在运行可中在队列中可过行的;

 S 处于休眠状态;

 T 停止或被追踪;

 W 进入内存交换 (从内核2.6开始无效);

 X 死掉的进程 (基本很少见);

 Z 僵尸进程;

 < 优先级高的进程

 N 优先级较低的进程

 L 有些页被锁进内存;

 s 进程的领导者(在它之下有子进程);

 l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);

 + 位于后台的进程组;



                                                                                         图1 ps

 

2、sed

 sed是非交互式的编辑器。

  它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

  sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。

 具体过程如下:

  首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。

  sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。

  sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

 例子:

  sed -n '3p' datafile    只打印第三行

  sed -n '100,200p' mysql_slow_query.log  只查看文件的第100行到第200行

  sed '2,5d' datafile  删除第二到第五行

  sed '/My/,/You/d' datafile   删除包含"My"的行到包含"You"的行之间的行

  sed '/My/,10d' datafile    删除包含"My"的行到第十行的内容

  sed 's/^My/You/g' datafile  命令末端的g表示在行内进行全局替换,也就是说如果某行出现多个My,所有的My都被替换为You。

  sed -n '1,20s/My$/You/gp' datafile  #取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的My替换为You,并打印到屏幕上。

  sed 's#My#Your#g' datafile  #紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。
 

3、awk

 awk非常的优秀,运行效率高,而且代码简单,对格式化的文本处理能力超强。基本上grep和sed能干的活awk全部都能干,而且干得更好

 awk 用法:awk ' pattern {action} ' 

 变量名 含义

 ARGC 命令行变元个数

 ARGV 命令行变元数组

 FILENAME 当前输入文件名

 FNR 当前文件中的记录号

 FS 输入域分隔符,默认为一个空格

 RS 输入记录分隔符

 NF 当前记录里域个数

 NR 到目前为止记录数

 OFS 输出域分隔符

 ORS 输出记录分隔符

 sub 与 gsub 函数

  awk的sub函数用法:

  sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。

  如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。

  格式如下:

  sub (regular expression, substitution string):

  sub (regular expression, substitution string, target string)

  实例:

  $ awk '{ sub(/test/, "mytest"); print }' testfile

  $ awk '{ sub(/test/, "mytest", $1); print }' testfile

  第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。

  第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。

  如要在整个文件中进行匹配需要用到gsub

  gsub函数作用如sub,但它在整个文档中进行匹配。

  格式如下:

  gsub (regular expression, substitution string)

  gsub (regular expression, substitution string, target string)

  实例:

  $ awk '{ gsub(/test/, "mytest"); print }' testfile

  $ awk '{ gsub(/test/, "mytest", $1); print }' testfile

  第一个例子在整个文档中匹配test,匹配的都被替换成mytest。

  第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest

  gsub返回的是替换的次数。

  echo "a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)'

  结果:

  a b c 2 a:d

 

4、iostat

  iostat可以显示CPU和I/O系统的负载情况及分区状态信息.

 avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值

 Device: 各磁盘设备的IO统计信息

 我们可以使用-c选项单独显示avg-cpu部分的结果,使用-d选项单独显示Device部分的信息

 avg-cpu段:

  %user: 在用户级别运行所使用的CPU的百分比.

  %nice: nice操作所使用的CPU的百分比.

  %sys: 在系统级别(kernel)运行所使用CPU的百分比.

  %iowait: CPU等待硬件I/O时,所占用CPU百分比.

  %idle: CPU空闲时间的百分比.

 Device段:

  tps: 每秒钟发送到的I/O请求数.

  Blk_read /s: 每秒读取的block数.  (扇区 一扇区为512bytes)

  Blk_wrtn/s: 每秒写入的block数.   (扇区 一扇区为512bytes)

  Blk_read:   读入的block总数.   (扇区 一扇区为512bytes)

  Blk_wrtn:  写入的block总数.   (扇区 一扇区为512bytes)

  Blk_read  读入块的当总数.   取样时间间隔内读扇区总数量          

  Blk_wrtn  写入块的总数.    取样时间间隔内读扇区总数量         

  kB_read/s  每秒从驱动器读入的数据量,单位为K.             

  kB_wrtn/s  每秒向驱动器写入的数据量,单位为K.             

  kB_read  读入的数据总量,单位为K.             

  kB_wrtn  写入的数据总量,单位为K.             

  rrqm/s  将读入请求合并后,每秒发送到设备的读入请求数.             

  wrqm/s  将写入请求合并后,每秒发送到设备的写入请求数.             

  r/s  每秒发送到设备的读入请求数.             

  w/s  每秒发送到设备的写入请求数.             

  rsec/s  每秒从设备读入的扇区数.             

  wsec/s  每秒向设备写入的扇区数.             

  rkB/s  每秒从设备读入的数据量,单位为K.             

  wkB/s  每秒向设备写入的数据量,单位为K.             

  avgrq-sz  发送到设备的请求的平均大小,单位是扇区.             

  avgqu-sz  发送到设备的请求的平均队列长度.             

  await  I/O请求平均执行时间.包括发送请求和执行的时间.单位是毫秒.             

  svctm  发送到设备的I/O请求的平均执行时间.单位是毫秒.             

  %util  在I/O请求发送到设备期间,占用CPU时间的百分比.用于显示设备的带宽利用率.  当这个值接近100%时,表示设备带宽已经占满.

  例子:

  我们可以以"iostat interval [count] ”形式指定iostat命令的采样间隔和采样次数

  iostat -d 1 2

  我们可以使用-k选项,指定iostat的部分输出结果以kB为单位,而不是以扇区数为单位

  iostat -d -k

  更详细的io统计信息(-x选项)

  为显示更详细的io设备统计信息,我们可以使用-x选项,在分析io瓶颈时,一般都会开启-x选项

  linux # iostat -x -k -d 1

  Linux 2.6.16.60-0.21-smp (linux)     06/13/12

  ……

  Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

  sda               0.00  9915.00    1.00   90.00     4.00 34360.00   755.25    11.79  120.57   6.33  57.60

  rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并

  wrqm/s: 每秒对该设备的写请求被合并次数

  r/s: 每秒完成的读次数

  w/s: 每秒完成的写次数

  rkB/s: 每秒读数据量(kB为单位)

  wkB/s: 每秒写数据量(kB为单位)

  avgrq-sz:平均每次IO操作的数据量(扇区数为单位)

  avgqu-sz: 平均等待处理的IO请求队列长度

  await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)

  svctm: 平均每次IO请求的处理时间(毫秒为单位)

  %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率

  对于以上示例输出,我们可以获取到以下信息:

  1.每秒向磁盘上写30M左右数据(wkB/s值)

  2.每秒有91次IO操作(r/s+w/s),其中以写操作为主体

  3.平均每次IO请求等待处理的时间为120.57毫秒,处理耗时为6.33毫秒

  4.等待处理的IO请求队列中,平均有11.79个请求驻留

  以上各值之间也存在联系,我们可以由一些值计算出其他数值,例如:

  util = (r/s+w/s) * (svctm/1000)

  对于上面的例子有:util = (1+90)*(6.33/1000) = 0.57603



                                                                                      图2 iostat



                                                                                       图2 iostat -d -x
 
 
5、/proc/stat

       http://www.linuxhowtos.org/System/procstat.htm
       linux下/proc/stat 计算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活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。

 cat /proc/stat

 cpu 432661 13295 86656 422145968 171474 233 5346

 cpu0 123075 2462 23494 105543694 16586 0 4615

 cpu1 111917 4124 23858 105503820 69697 123 371

 cpu2 103164 3554 21530 105521167 64032 106 334

 cpu3 94504 3153 17772 105577285 21158 4 24

 intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0

 ctxt 19067887

 btime 1139187531

 processes 270014

 procs_running 1

 procs_blocked 0

 CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例)为:

 参数 解释

 user (432661) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒

 nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)

 system (86656) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)

 idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)

 iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,

 irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)

 softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

 CPU时间=user+system+nice+idle+iowait+irq+softirq

 “intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。

 “ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。

 “btime”给出了从系统启动到现在为止的时间,单位为秒。

 “processes (total_forks) 自系统启动以来所创建的任务的个数目。

 “procs_running”:当前运行队列的任务的数目。

 “procs_blocked”:当前被阻塞的任务的数目。

 
那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:

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

2、   cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
 
下用用bash写的一个cpu利用率的计算:

采用公式为:

total_0=USER[0]+NICE[0]+SYSTEM[0]+IDLE[0]+IOWAIT[0]+IRQ[0]+SOFTIRQ[0]
total_1=USER[1]+NICE[1]+SYSTEM[1]+IDLE[1]+IOWAIT[1]+IRQ[1]+SOFTIRQ[1]
cpu usage=(IDLE[0]-IDLE[1]) / (total_0-total_1) * 100

 

bash 代码

#!/bin/sh

##echo user nice system idle iowait irq softirq
CPULOG_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_1=$(echo $CPULOG_1 | awk '{print $4}')
Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')

sleep 5

CPULOG_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_2=$(echo $CPULOG_2 | awk '{print $4}')
Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}')

SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`

Total=`expr $Total_2 - $Total_1`
SYS_USAGE=`expr $SYS_IDLE/$Total*100 |bc -l`

SYS_Rate=`expr 100-$SYS_USAGE |bc -l`

Disp_SYS_Rate=`expr "scale=3; $SYS_Rate/1" |bc`
echo $Disp_SYS_Rate%




                                          图4 cpu 利用率统计
 
 
 
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  awk sed ps iostat procstat