zoukankan      html  css  js  c++  java
  • Linux系统资源监控--linux命令、nmon和spotlight

    转载自:http://www.cnblogs.com/hanxiaobei/p/5514544.html

    前言:

    系统资源监控一般监控系统的CPU,内存,磁盘和网络。系统分为windows和Linux。本篇主要记录Linux。

    Linux系统资源监控常用命令及工具

    一、常用命令:top、free、iostat、netstat、vmstat

    top

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,下面详细介绍它的使用方法

    复制代码
     1 统计信息区
     2 top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
     3 Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
     4 Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
     5 Mem: 191272k total, 173656k used, 17616k free, 22052k buffers
     6 Swap: 192772k total, 0k used, 192772k free, 123988k cached
     7 进程信息区
     8 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
     9 1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd
    10 14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top
    11 1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init
    12 2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
    13 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
    复制代码

    统计信息区:
    前五行是系统整体的统计信息。第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:
    01:06:48 当前时间
    up 1:22 系统运行时间,格式为时:分
    1 user 当前登录用户数
    load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。
    三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
    第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:
    Tasks: 29 total 进程总数
    1 running 正在运行的进程数
    28 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    Cpu(s): 0.3% us 用户空间占用CPU百分比
    1.0% sy 内核空间占用CPU百分比
    0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
    98.7% id 空闲CPU百分比
    0.0% wa 等待输入输出的CPU时间百分比
    最后两行为内存信息。内容如下:
    Mem: 191272k total 物理内存总量
    173656k used 使用的物理内存总量
    17616k free 空闲内存总量
    22052k buffers 用作内核缓存的内存量
    Swap: 192772k total 交换区总量
    0k used 使用的交换区总量
    192772k free 空闲交换区总量
    123988k cached 缓冲的交换区总量。

    进程信息区:
    统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
    列名 含义
    PID 进程id
    USER 进程所有者的用户名
    PR 优先级
    NI nice值。负值表示高优先级,正值表示低优先级
    VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    SHR 共享内存大小,单位kb
    S 进程状态。
    D=不可中断的睡眠状态
    R=运行
    S=睡眠
    T=跟踪/停止
    Z=僵尸进程
    %CPU 上次更新到现在的CPU时间占用百分比
    %MEM 进程使用的物理内存百分比
    TIME+ 进程使用的CPU时间总计,单位1/100秒
    COMMAND 命令名/命令行

    以下为默认不展示的列名:
    PPID 父进程id
    RUSER Real user name
    UID 进程所有者的用户id
    GROUP 进程所有者的组名
    TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
    P 最后使用的CPU,仅在多CPU环境下有意义
    TIME 进程使用的CPU时间总计,单位秒
    SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
    CODE 可执行代码占用的物理内存大小,单位kb
    DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    nFLT 页面错误次数
    nDRT 最后一次写入到现在,被修改过的页面数。
    WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
    Flags 任务标志,参考 sched.h

    free

    free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。

    1 [root@zhoucentos home]# free -m
    2              total       used       free     shared    buffers     cached
    3 Mem:          1006        988         17          0         96         72
    4 -/+ buffers/cache:        819        186
    5 Swap:         2015          1       2014

    第3行内容代表是从系统的角度来统计的数据,其中的used包含了buffers和cached
    第4行内容是代表从应用程序的角度来统计的数据,used是真正应用程序占用的内存
    第3行的used = 第4行的used+第3行的buffers和cached
    第5行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free)
    如果是应用服务器的话,一般只看第4行:+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。

    iostat

    可以用iostat工具查看进程IO请求下发的数量、系统处理IO请求的耗时,进而分析进程与操作系统的交互过程中IO方面是否存在瓶颈。
    下面通过iostat命令使用实例,说明使用iostat查看IO请求下发情况、系统IO处理能力的方法,以及命令执行结果中各字段的含义。
    1.不加选项执行iostat

    复制代码
    1 linux # iostat
    2 Linux 2.6.16.60-0.21-smp (linux) 06/12/12
    3 
    4 avg-cpu: %user %nice %system %iowait %steal %idle
    5 0.07 0.00 0.05 0.06 0.00 99.81
    6 
    7 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    8 sda 0.58 9.95 37.47 6737006 25377400
    9 sdb 0.00 0.00 0.00 824 0
    复制代码

    单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。以上输出中,除最上面指示系统版本、主机名和日期的一行外,另有两部分:

    avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值
    Device: 各磁盘设备的IO统计信息
    对于cpu统计信息一行,我们主要看iowait的值,它指示cpu用于等待io请求完成的时间。Device中各列含义如下:
    • Device: 以sdX形式显示的设备名称
    • tps: 每秒进程下发的IO读、写请求数量
    • Blk_read/s: 每秒读扇区数量(一扇区为512bytes)
    • Blk_wrtn/s: 每秒写扇区数量
    • Blk_read: 取样时间间隔内读扇区总数量
    • Blk_wrtn: 取样时间间隔内写扇区总数量
    我们可以使用-c选项单独显示avg-cpu部分的结果,使用-d选项单独显示Device部分的信息。
    2.指定采样时间间隔与采样次数
    linux # iostat -d 1 2

    复制代码
    1 Linux 2.6.16.60-0.21-smp (linux) 06/13/12
    2 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    3 sda 0.55 8.93 36.27 6737086 27367728
    4 sdb 0.00 0.00 0.00 928 0
    5 
    6 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    7 sda 2.00 0.00 72.00 0 72
    8 sdb 0.00 0.00 0.00 0 0
    复制代码

    以上命令输出Device的信息,采样时间为1秒,采样2次,若不指定采样次数,则iostat会一直输出采样信息,直到按”ctrl+c”退出命令。
    注意,第1次采样信息与单独执行iostat的效果一样,为从系统开机到当前执行时刻的统计信息。
    3.以kB为单位显示读写信息(-k选项)
    我们可以使用-k或-M选项,指定iostat的部分输出结果以kB或MB为单位,而不是以扇区数为单位

    1 linux # iostat -d -k
    2 Linux 2.6.16.60-0.21-smp (linux) 06/13/12
    3 
    4 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    5 sda 0.55 4.46 18.12 3368543 13686096
    6 sdb 0.00 0.00 0.00 464 0

    以上输出中,kB_read/s、kB_wrtn/s、kB_read和kB_wrtn的值均以kB为单位,相比以扇区数为单位,这里的值为原值的一半(1kB=512bytes*2)
    4.更详细的io统计信息(-x选项)
    为显示更详细的io设备统计信息,可以使用-x选项,在分析io瓶颈时,一般都会开启-x选项: 

    1 linux # iostat -x -k -d 1
    2 Linux 2.6.16.60-0.21-smp (linux) 06/13/12
    3 
    4 ……
    5 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
    6 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

     netstat

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

    执行netstat后,其输出结果为:

    复制代码
     1 Active Internet connections (w/o servers)
     2 Proto Recv-Q Send-Q Local Address Foreign Address State
     3 tcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHED
     4 tcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHED
     5 tcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHED
     6 tcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHED
     7 tcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSE
     8 
     9 Active UNIX domain sockets (w/o servers)
    10 Proto RefCnt Flags Type State I-Node Path
    11 unix 1 [ ] STREAM CONNECTED 16178 @000000dd
    12 unix 1 [ ] STREAM CONNECTED 16176 @000000dc
    13 unix 9 [ ] DGRAM 5292 /dev/log
    14 unix 1 [ ] STREAM CONNECTED 16182 @000000df
    复制代码

    从整体上看,netstat的输出结果可以分为两个部分:

    1、Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。

    2、Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。

    Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。

    常见参数:

    -a (all)显示所有选项,默认不显示LISTEN相关

    -t (tcp)仅显示tcp相关选项

    -u (udp)仅显示udp相关选项

    -n 拒绝显示别名,能显示数字的全部转化成数字。

    -l 仅列出有在 Listen (监听) 的服務状态

    -p 显示建立相关链接的程序名

    -r 显示路由信息,路由表

    -e 显示扩展信息,例如uid等

    -s 按各个协议进行统计

    -c 每隔一个固定时间,执行该netstat命令。

    提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

    实用命令实例:

    1、列出所有监听和未监听的端口  netstat -a

         列出所有 tcp 端口 netstat -at;

         列出所有 udp 端口 netstat -au

    2、列出所有处于监听状态的 Sockets

         只显示监听端口 netstat -l;

       只列出所有监听 tcp 端口 netstat -lt;

        只列出所有监听 udp 端口 netstat -lu;

        只列出所有监听 UNIX 端口 netstat -lx

    3、显示每个协议的统计信息

        显示所有端口的统计信息 netstat -s;

      显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su;

    4、在 netstat 输出中显示 PID 和进程名称 netstat -p

    5、当你不想让主机,端口和用户名显示,使用 netstat -n

        如果只是不想让这三个名称中的一个被显示,使用以下命令

       # netsat -a --numeric-ports

       # netsat -a --numeric-hosts

       # netsat -a --numeric-users

    6、持续输出 netstat 信息,netstat 将每隔一秒输出网络信息  netstat -c

    7、显示核心路由信息 netstat -r(使用 netstat -rn 显示数字格式,不查询主机名称)

    8、找出程序运行的端口  netstat -ap | grep ssh

         找出运行在指定端口的进程  netstat -an | grep ':80'

    9、显示网络接口列表  netstat -i

         显示详细信息  netstat -ie等同于ifconfig

    10、IP和TCP分析

        查看连接某服务端口最多的的IP地址 netstat -nat | grep "192.168.1.101:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20

        TCP各种状态列表   netstat -nat |awk '{print $6}'

        先把状态全都取出来,然后使用uniq -c统计,之后再进行排序  netstat -nat |awk '{print $6}'|sort|uniq -c |sort -rn

        分析access.log获得访问前10位的ip地址 netstat -ant |awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10

    vmstat

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存 交换情况,IO读写情况。
    可以看到整个机器的 CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
    一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

    1 root@ubuntu:~# vmstat 2 1
    2 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
    3 r b swpd free buff cache si so bi bo in cs us sy id wa
    4 1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0

    2表示每个两秒采集一次服务器状态,1表示只采集一次。
    实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:

    复制代码
    1 root@ubuntu:~# vmstat 2 
    2 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
    3 r b swpd free buff cache si so bi bo in cs us sy id wa
    4 1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
    5 0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
    6 0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
    7 0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
    8 1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
    复制代码

    这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。
    每个参数的意思:

    r   表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈 了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队 列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
    b  表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
    swpd  虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
    free    空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
    buff    Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
    cache  cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
    si     每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
    so    每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
    bi    块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
    bo   块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
    in    每秒CPU的中断次数,包括时间中断
    cs    每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的 数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或 者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核 空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的 时间少了,CPU没有充分利用,是不可取的。
    us   用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
    sy   系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
    id   空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
    wt  等待IO CPU时间。
    vmstat –s 可以查看page in/page out的数量 

    二、常用工具:nmon、spotlight

    nmon

    Nmon的使用
    1、赋予nmon可执行权限并在命令行输入: ./nmon 即可启动交互界面可时时显示系统资源
    2、输入命令如下,即可对Linux进行监控,并生成.nmon格式的文件
    [root@localhost ]# nmon -s 300 -c 288 -f -m /tmp
    备注:
    -s 300:表示每300秒采集一次数据,
    -c 288 :表示采集288次,300*288=86400秒,刚好是1天的数据,这样运行一次这个程序就会生成一个一天的数据文件,
    -m /tmp:表示生成的数据文件的路径
    -f:表示生成的数据文件名中有时间
    进入tmp目录,查看生成的xxx.nmon文件 
    使用sz/sftp下载该文件:sz localhost_160521_1314.nmon

    使用分析工具对.nmon文件进行分析
    打开分析工具nmon analyser v46.xlsm
    点击【Analyze nmon data】按钮,加载下载的.nmon监控文件,生成新的excel文件先保存即可查看到Linux的各性能指标情况

    !重点关注四项
    cpu:cpu_all,cpu_summ
    disk:diskbusy
    memory的使用百分比:(total-free-buffer-cache)/total
    netIO:eth0-total

    spotlight

    spotlight的使用

    1、安装:像windows其他软件安装一样

    2、展示界面

  • 相关阅读:
    20145313《信息安全系统设计基础》第0周学习总结
    20145313张雪纯课程总结
    RocEDU.阅读.写作《苏菲的世界》书摘(七)
    RocEDU.阅读.写作《苏菲的世界》书摘(六)
    20145310《信息安全系统设计基础》课程总结
    20145310 《信息安全系统设计基础》第五周同学问题总结
    20145310《信息安全系统设计基础》第十四周学习总结
    20145310《信息安全系统设计基础》第十三周学习总结
    20145310《信息安全系统设计基础》实验五 网络通信
    20145310《信息安全系统设计基础》实验四 外设驱动程序设计
  • 原文地址:https://www.cnblogs.com/yetj/p/8757567.html
Copyright © 2011-2022 走看看