☞Linux进程管理与性能分析

Linux进程管理与性能分析

概述

系统维护的一个重要工作就是监控Linux系统的运行状态是否正常,分析系统资源的使用情况,进而对系统进行优化,提高其性能。在实际环境中,系统稳定性尤为重要,可以说系统的稳定性关系到企业的存亡。因此,第一时间掌握CPU、Memory、IO、Network的等系统资源的状态则可以在系统出现问题时及时解决,把损失降到最低。 
本篇主要介绍Linux下性能监控的常用工具,进程管理的有效办法,做到以下几点:

  • 查看所有运行中的进程

  • 查看进程消耗资源

  • 定位个别进程并且对其执行指定操作

  • 改变进程的优先级

  • 杀死指定进程

  • 限制进程可用的系统资源等

进程

  • 进程的概念 

    • 程序是指令的集合,进程是程序执行的基本单元。进程是由程序运行时创建的,是被载入内存的指令集合、数据以及一些用于存放程序命令行参数、环境变量的栈空间等内容。 
      因此,程序是静态的,进程则是动态的。 
      在Linux中通过fork(),clone()创建同一程序的多个进程,并且每个进程由PID来标记,同时执行不会互相干扰。 
      Linux中的一切皆文件思想决定了进程对文件系统的存取和访问权限通常继承自程序发起者。

    • 进程的优先级: 
      系统优先级(system):0 – 139,共140个优先级数字越优先级越高。 
      实时优先级(realtime):99 – 0 对应系统优先级的0-99,数值越优先级高。这些优先级都要高于正常进程的优先级(nice值)。 
      Nice优先级(man nice):-20 ~ +19 对应系统优先级中的100 – 139或99。正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其nice值最低,所以在LINUX系统中,值-20使得一项任务变得非常重要;与之相反,如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。

01进程优先级.jpg

    • 进程的上下文: 

    • 上下文切换(Context Switch)是多任务操作系统的基石,每个进程都有自己的执行环境就是进程的上下文,这些上下文就是当前进程使用的寄存器,比如PC、栈指针%esp、帧指针%ebp等。 
      当系统执行进程调度时会进行进程的上下文保存与恢复,因此,当系统中的进程繁多的情况下,频繁的上下文切换会消耗CPU时间

    • 进程间通信 
      在同一主机上通过signal、共享空间(shm)、信号量(semophore)实现 
      在不同主机上:rpc(remote procedure call)、socket机制

    • 内存资源 
      Linux系统中的内存采取分页机制进行管理,页框用来存储页面数据,大小为4k 
      Linux系统中内存回收算法用的是LRU(Least Recently Used) 最近最少使用算法进行轮询释放内存的。 
      通常程序执行从逻辑上的“0地址”开始的,所以必须把物理内存地址映射为逻辑地址,由CPU上的内存管理单元(MMU)负责转换线地址与物理地址的转换。

    • 进程的类型: 
      守护进程:daemon,在系统引导过程中启动的进程,和终端无关进程 
      前台进程:依赖终端,通过终端启动的进程 
      注意:两者可相互转换

    • 进程状态: 

      02.jpg

    • 进程的分类: 

    • CPU密集型:CPU开销很高的程序,如高并发的 web服务、图形图像处理、科学计算等类型的程序 
      IO密集型:IO相关的程序通常处理大量数据,需要大量内存和存储,频繁IO读写数据,对CPU要求较小,如数据库服务、文件服务等 
      交互型、非交互型

【SIGNAL】信号机制

信号(signal)是一种软中断,信号机制是进程间通信的一种方式 
数值1~31为不可靠信号也称为非实时信号,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次。

  • man 7 signal

  • kill -l #信号列表 
    1) SIGHUP(HUP): 无须关闭进程而让其重读配置文件 
    2) SIGINT(INT): 中止正在运行的进程;相当于Ctrl+c 
    9) SIGKILL(KILL): 杀死正在运行的进程 
    15) SIGTERM(TERM):终止正在运行的进程,kill pid 默认发送的信号,非正常退出 
    18) SIGCONT(CONT):继续运行 
    19) SIGSTOP(STOP):后台休眠

nice 、renice进程优先级调整

nice – run a program with modified scheduling priority

  • nice [OPTION] [COMMAND [ARG]…] 

    • -n [+|-]# #执行时设置优先级最大为-20,如果不加-n设置负值为–n

  • renice – alter priority of running processes 

    • top — r — pid — nice值 #同top设置pid的NI值

    • 普通user只能调整进程大于当前nice且为正数的nice值,如用户自己用renice调整为5,下次调整必须大于5,最大为19,超了还是19。

    • renice [-n] priority [-gpu] identifier…

    • renice [+|-]# pid

    • -g # as GID

    • -u # as usernames or UIDs 

rtprio实时优先级调整

  • chrt #显示所有选项

[root@cent7]~>chrt

chrt - manipulate real-time attributes of a process

Set policy:
 chrt [options] [-policy] <priority> [-p <pid> | <command> <arg> ...]

Get policy:
 chrt [options] -p <pid>

Scheduling policies:
 -b | --batch         set policy to SCHED_BATCH
 -f | --fifo          set policy to SCHED_FIFO
 -i | --idle          set policy to SCHED_IDLE
 -o | --other         set policy to SCHED_OTHER
 -r | --rr            set policy to SCHED_RR (default)

Scheduling flags:
 -R | --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR

Options:
 -a | --all-tasks     operate on all the tasks (threads) for a given pid
 -h | --help          display this help
 -m | --max           show min and max valid priorities
 -p | --pid           operate on existing given pid
 -v | --verbose       display status information
 -V | --version       output version information
  • chrt # comm #以0-99的优先级范围执行命令,值越大优先级越高

  • chrt -p $$ #显示当前bash 的调度策略,实时优先级

前、后台作业管理

  • 前台作业:通过终端启动,且启动后一直占据终端;

  • 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

  • 并行任务 

    1. 脚本调用多个脚本,加上&使之在后台运行 
      parallel.sh 
      a.sh& 
      b.sh& 
      c.sh&

    2. 以子进程方式执行 
      (f1.sh&);(f2.sh&);(f3.sh&)

    3. 无名函数

    4. { f1.sh& f2.sh& f3.sh& }

  • 后台运行作业 

    • COMMAND & #后台,Running态

    • Ctrl + z #后台,Stopped态 
      #执行命令终端退出,进程也将关闭

  • 剥离进程与终端的关系 

    • nohup comm& #如法和screen那样再切回来

    • screen ;comm #中断可恢复,常用选项 -S -ls -x -r

  • 管理当前终端的后台进程(运行、终止态) 

    • jobs -l #作业号,pid,stat,comm

    • jobs #查看所有作业,如果有标准输出则正常输出,但是屏蔽了标准输入 

    • fg[[%]JOB_NUM]:把指定的后台作业调回前台;

    • bg[[%]JOB_NUM]:后台作业在后台继续运行;手动调入后台的进程为Stopped态

    • kill [%JOB_NUM]:终止指定的作业;

    • killall comm #-9强制kill,comm的所有进程都kill

    • pkill -t pts/x #kill终端产生的进程,建议先用ps看看终端或bash产生的进程,以免误杀其他重要进程

进程管理工具

  • kill [-SIGNAL] pid…

  • killall[-SIGNAL] comm…

  • pkill[options] pattern 
    -SIGNAL 
    -u uid: effective user,生效者 
    -U uid: real user,真正发起运行命令者 
    -t terminal: 与指定终端相关的进程 
    -l: 显示进程名 
    -a: 显示完整格式的进程名 
    -P pid: 显示父进程为此处指定的进程的进程列表

进程查看工具

pgrep

pgrep[options] pattern

  • -u uid: effective user,生效者euser

  • -U uid: real user,真正发起运行命令者ruser

  • -t terminal: 与指定终端相关的进程

  • -l: 显示进程名

  • -a:显示进程名和参数

  • -P pid: 显示指定进程的子进程列表,与pidof的结果互逆

[root@cent7]~>pgrep -t pts/3
2701
3053
3112
[root@cent7]~>pgrep -t pts/3 -l
2701 bash
3053 vim
3112 ping
[root@cent7]~>pgrep -P 2701
3053
3112
[root@cent7]~>pgrep -P 2701 -l
3053 vim
3112 ping
[root@cent7]~>pgrep -P 2701 -a
3053 vim
3112 ping 127.0.0.1

pidof

find the process ID of a running program

  • pidof comm #逆序显示comm产生的子进程,comm的pid在最后

  • pidof -s comm #显示上面的第一个pid,即最后一个子进程的pid

pstree

display a tree of processes #打印系统进程调用树,可以非常清楚地看到当前系统中所有活动进程之间的调用关系

  • -a显示每个进程的参数或选项,如─ping 127.0.0.1

  • pstree pid #指定pid的进程树

[root@cent7]~>pstree -a 3160
bash
 └─vim f1.txt
  • pstree #默认从init(pid=1)输出整个进程树

init-+-getty
    |-getty
    |-getty
    `-getty

ps

ps [options] #默认显示当前终端的进程,查看系统中瞬间进程信息,来自/proc下的pid文件

  • UNIX选项:-A -e

  • BSD选项:a f

  • GNU选项:–help

  • [option] 不带 – 的BSD格式 
    •a:选项包括所有终端的依赖进程,包括会话发起者 
    •-a:所有终端的依赖进程,不包括会话发起者 
    •-e = -A:所有进程=ax 
    •x:包括所有不链接终端的进程 
    •u:选项显示进程所有者的信息 
    •f:显示进程的父进程,进程树,pstree更直接 
    l:长格式显示,最全的输出 
    •o:属性… 选项显示定制的信息 
    pid , comm , %cpu , %mem , state , tty , euser , ruser , nice 
    [VSZ]:Virtual memory SiZe,虚拟内存集,线性内存,给每个进程最大3G 
    [RSS]:ReSidentSize, 常驻内存集,实际分配的内存 
    [STAT]: 进程的状态,zombie状态时会造成资源不可回收 

    003.jpg

  • 常用组合:-ef,区别于ef(父子进程关系及参数) 
    -e: 显示所有进程 
    -f: 显示完整格式程序信息

    [root@cent7]~>ps -ef
   UID         PID   PPID  C  STIME TTY          TIME CMD
  • 常用组合:-eFH 
    -F: 显示更完整格式的进程信息 
    -H: 以进程层级格式显示进程相关信息

    [root@cent7]~>ps -eFH | head -2
   UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD

004.jpg

ps通过进程名过滤,显示效果优于pgrep、pidof

[root@cent7]~>ps -C vim
PID TTY          TIME CMD
3689 pts/0    00:00:00 vim

[root@cent7]~>pgrep -a vim
3689 vim

[root@cent7]~>ps aux | grep [v]im
root       3053  0.0  1.2 152332  6048 pts/3    T    Sep09   0:00 vim

[root@cent7]~>ps aux | grep -v grep | grep vim
root       3053  0.0  1.2 152332  6048 pts/3    T    Sep09   0:00 vim

常用组合:自定义在o之后

  • -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

  • -axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

性能监控

  • 查看和管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup

性能指标

  • CPU 
    CPU 利用率,如果 CPU 有 100% 利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time; 
    上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的; 
    可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。

  • Memroy 
    内存不足:free memory 急剧减少,回收buffer和cache也无济于事,大量使用交换分区(swpd),页面交换(swap)频繁,读写磁盘数量(io)增多,缺页中断(in)增多,上下文切换(cs)次数增多,等待IO的进程数(b)增多,大量CPU时间用于等待IO(wa)。

  • SWAP 
    当系统没有足够物理内存来应付所有请求的时候就会用到 swap 设备,swap 设备可以是一个文件,也可以是一个磁盘分区。 
    使用 swap 的代价非常大,如果系统没有物理内存可用,就会频繁 swapping,如果 swap 设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的 IO 问题,最终导致整个系统迟缓,甚至崩溃。 
    swap 设备和内存之间的 swapping 状况是判断 Linux 系统性能的重要参考,我们已经有很多工具可以用来监测 swap 和 swapping 情况,比如:topcat /proc/meminfovmstat 等

  • network 
    网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。使用ethtool可以查看网口的信息。

  • IOPS 
    IO 可分为顺序 IO 和 随机 IO 两种,性能监测前需要弄清楚系统偏向顺序 IO 的应用还是随机 IO 应用。 

    • 顺序 IO 是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序 IO 可以同时很快的移动大量数据。

    • 随机 IO 是指随机请求数据,其 IO 速度不依赖于数据的大小和排列,依赖于磁盘的每秒能 IO 的次数,比如 Web 服务、Mail 服务等每次请求的数据都很小,随机 IO 每秒同时会有更多的请求数产生,所以磁盘的每秒能 IO 多少次是关键。 

top – Linux Process Monitoring

top可以实时监控系统和进程的状态,相比瞬时的结果可以实时的变化,但是不能清晰显示数据随时间变动的情况。相较而言,vmstat和pidstat的输出不会覆盖掉之前的结果,因此更适合查看数据随时间的变动情况。另外,如果你不能及时暂停top的输出(Ctrl-s 暂停,Ctrl-q 继续),也许某些关键线索会湮灭在新的输出中。

top - 03:53:00 up 12:56,  4 users,  load average: 0.00, 0.01, 0.05
Tasks: 371 total,   2 running, 368 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 s
KiB Mem :   485252 total,    23704 free,   132008 used,   329540 buff/cache
KiB Swap:  2098172 total,  2098172 free,        0 used.   304324 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND  
    4109 root      20   0  146276   2268   1420 R  0.3  0.5   0:00.25 top  
  • CPU栏目信息: 
    us:用户空间 
    sy:内核空间 
    ni:调整nice时间 
    id:空闲 
    wa:等待IO时间 
    hi:硬中断 
    si:软中断(模式切换) 
    st:虚拟机偷走的时间

  • 进程栏目信息 
    PID (Process Id):任务的进程ID 
    PPID (Parent Process Pid):父任务的进程ID 
    RUSER (Real User Name):任务的所有者真实名称 
    UID (User Id):任务所有者ID 
    USER (User Name):任务所有者名称 
    GROUP (Group Name):任务所有者群组名 
    TTY (Controlling Tty):终端 
    PR (Priority):优先级 
    %CPU (CPU usage):CPU使用率 
    %MEM (Memory usage (RES)):内存使用率 
    S (Process Status):进程状态 
    TIME+ (CPU Time, hundredths):CPU时间,精确到秒

  • 暂停与恢复 
    Ctrl s 
    Ctrl q

  • 常用内置命令 

    • 排序:(shiht + p m t) 
      P:以占据的CPU百分比,%CPU 
      M:占据内存百分比,%MEM 
      T:累积占据CPU时长,TIME+

    • 首部信息开关显示: 
      uptime信息:l 
      tasks及cpu信息:t 
      cpu切换显示各核心(默认为总和):1 (数字) 
      memory信息:m

    • 退出命令:q

    • 修改刷新时间间隔:s

    • 终止指定进程:k

    • 保存文件/root/.toprc:W

  • 命令选项 
    -d #: 指定刷新时间间隔,默认为3秒 
    -b: 以批次方式 
    -n #: 显示多少批次

htop

interactive process viewer,更容易被理解,色彩丰富 
htop 1

  CPU[|                        0.1%]     Tasks: 47, 20 thr; 2 running
 Mem[||||||||||||||||||||219/473MB]     Load average: 0.00 0.01 0.05
 Swp[                     0/2048MB]     Uptime: 13:23:53

   PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
  4223 root       20   0  119M  2080  1428 R  0.1  0.4  0:00.05 htop

F1Help  F2Setup F3SearchF4FilterF5Tree  F6SortByF7Nice -F8Nice +F9Kill  F10Quit
htop 1.0.3 - (C) 2004-2012 Hisham Muhammad
  • 选项: 
    -d #: 指定延迟时间; 
    -u UserName: 仅显示指定用户的进程; 
    -s COLUME: 以指定字段进行排序;

  • 内置命令: 
    s: 跟踪选定进程的系统调用; 
    l: 显示选定进程打开的文件列表; 
    a:将选定的进程绑定至某指定CPU核心; 
    t: 显示进程树 
    F1 – F9:F7和F8改变优先级,F9杀死进程

uptime

这个命令显示了要运行的任务(进程)数,通过它能够快速了解系统的平均负载。在 Linux 上,这些数值既包括正在或准备运行在 CPU 上的进程,也包括阻塞在不可中断 I/O(通常是磁盘 I/O)上的进程。它展示了资源负载(或需求)的大致情况,不过进一步的解读还有待其它工具的协助。

$ uptime
23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02

最右的三个数值分别是1分钟、5分钟、15分钟系统负载的移动平均值。它们共同展现了负载随时间变动的情况。举个例子,假设你被要求去检查一个出了问题的服务器,而它最近1分钟的负载远远低于15分钟的负载,那么你很可能已经扑了个空。 
在上面的例子中,负载均值最近呈上升态势,其中1分钟值高达30,而15分钟值仅有19。这种现象有许多种解释,很有可能是对 CPU 的争用;——vmstat和mpstat——可以帮助我们进一步确定问题所在。

vmstat – Virtual Memory Statistics

Report virtual memory statistics

  • vmstat[options] [delay [count]]

  • 选项: 
    -s: 显示内存的统计数据

[root@cent7]/home/nethogs>vmstat 1 5
procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0
32  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  0
32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0
  • procs: 
    r:等待运行的进程的个数,和核心数有关 
    b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)

  • memory: 
    swpd: 交换内存的使用总量 
    free:空闲物理内存总量 
    buffer:用于buffer的内存总量 
    cache:用于cache的内存总量

  • swap: 
    si:从磁盘交换进内存的数据速率(kb/s),不为0,性能已经急剧下降 
    so:从内存交换至磁盘的数据速率(kb/s) 
    -io: 
    bi:从块设备读入数据到系统的速率(kb/s) 
    bo: 保存数据至块设备的速率

  • system: 
    in: interrupts, 中断速率,包括时钟 
    cs: context switch, 进程切换速率,超过几十万次则不正常

  • cpu: 
    us:Timespent running non-kernel code,用户空间 
    sy: Time spent running kernel code,内核空间 
    id: Time spent idle. 空闲 #Linux 2.5.41前,包括IO-wait time. 
    wa: Time spent waiting for IO.等待IO时间 2.5.41前,包括in idle. 
    st: Time stolen from a virtual machine.虚拟化 2.6.11前, unknown.

  • 总结 
    通过相加 us 和 sy 的百分比,你可以确定 CPU 是否处于忙碌状态。一个持续不变的 I/O 等待意味着瓶颈在硬盘上,这种情况往往伴随着 CPU 的空闲,因为任务都卡在磁盘 I/O 上了。你可以把 I/O 等待当作 CPU 空闲的另一种形式,它额外给出了 CPU 空闲的线索。 
    I/O 处理同样会消耗系统时间。一个高于20%的平均系统时间,往往值得进一步发掘:也许系统花在 I/O 的时间太长了。 
    在上面的例子中,CPU 基本把时间花在用户态里面,意味着跑在上面的应用占用了大部分时间。此外,CPU 平均使用率在90%之上。这不一定是个问题;检查下“r”列,看看是否饱和了。

pidstat

类似于top,但数据不会被覆盖,pidstat的输出则添加在之前的输出的后面。这有利于观察数据随时间的变动情况,也便于把你看到的内容复制粘贴到调查报告中。

$ pidstat 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  09/6/2016    _x86_64_    (32 CPU)

09:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
09:41:03 PM     0      6521 1596.23    1.89    0.00    1.94     1  nginx

07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:04 PM     0      6521 1596.23    1.89    0.00    1.94    15  mesos-slave

上面的例子表明,CPU 主要消耗在两个 Java 进程上。%CPU列是在各个 CPU 上的使用量的总和;1591%意味着 nginx 进程消耗了将近2个 CPU。

iostat – Input/Output Statistics

监控磁盘的状况,包括工作负载和处理性能

[root@cent7]~>iostat -xz 1
Linux 3.10.0-327.el7.x86_64 (cent7)     09/10/2016  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          0.17    0.00    0.91    0.01    0.00   98.91
          Device:   rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda        0.00     0.23    0.21    0.18     4.52     2.08    34.37     0.00    9.98   13.80    5.42   2.44   0.09

r/s,w/s,rkB/s,wkB/s:分别表示每秒设备读次数,写次数,读的 KB 数,写的 KB 数。它们描述了磁盘的工作负载。也许性能问题就是由过高的负载所造成的。 
await:I/O 平均时间,以毫秒作单位。它是应用中 I/O 处理所实际消耗的时间,因为其中既包括排队用时也包括处理用时。如果它比预期的大,就意味着设备饱和了,或者设备出了问题。 
avgqu-sz:分配给设备的平均请求数。大于1表示设备已经饱和了。(不过有些设备可以并行处理请求,比如由多个磁盘组成的虚拟设备) 
%util:设备使用率。这个值显示了设备每秒内工作时间的百分比,一般都处于高位。低于60%通常是低性能的表现(也可以从 await 中看出),不过这个得看设备的类型。接近100%通常意味着饱和。 
如果某个存储设备是由多个物理磁盘组成的逻辑磁盘设备,100%的使用率可能只是意味着 I/O 占用。 
磁盘 I/O 性能低不一定是个问题。应用的 I/O 往往是异步的(比如预读read-ahead和写缓冲buffering for writes),所以不一定会被阻塞并遭受延迟。

free

显示Mem和Swap的使用情况,还可以显示被buffer和cache的内存。

$ free -m
        total       used       free     shared    buffers     cached
Mem:        245998      24545     221453         83         59        541
-/+ buffers/cache:      23944     222053
Swap:            0          0          0

buffers:用于块设备 I/O 的缓冲区缓存 
cached:用于文件系统的页缓存 
-buffers/cache反映的是被程序占用的内存,而+buffers/cache反映的是可以挪用的内存。这两个值接近0时往往导致较高的磁盘I/O(iostat 1) 
CentOS6中total=used+free,used – buffers – cached,free + buffers + cached

dstat

统计系统资源,显示cpu使用情况,磁盘io 情况,网络发包情况和换页情况 
iostat和vmstat 的输出虽然详细,但是不够直观,不如dstat 好用,且dstat具有色彩,显示更直观,dstat综合了 vmstat, iostat, ifstat, netstat 等多个信息

  • dstat[-afv] [options..] [delay [count]] 
    -c: 显示cpu相关信息 
    -C #,#,…,total 
    -d: 显示disk相关信息 
    -D total,sda,sdb,… 
    -l:平均负载 
    -g:显示page相关统计数据 
    -m:显示memory相关统计数据 
    -n:显示network相关统计数据 
    -p:显示process相关统计数据 
    -r:显示io请求相关的统计数据 
    -s:显示swapped相关的统计数据 
    -y:系统system相关的统计数据

  • dstat -lcdmnprgsy

[root@cent7]/home/nethogs>dstat 
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
 0   0  99   0   0   0|1491k 1195B|   0     0 |   2B    9B|  31    27
  • –tcp 
    –udp 
    –unix 
    –raw 
    –socket 
    –ipc 
    –top-cpu:显示最占用CPU的进程 
    –top-io: 显示最占用io的进程 
    –top-mem: 显示最占用内存的进程 
    –top-latency: 显示延迟最大的进程

[root@cent7]~>dstat --tcp --udp --top-io
----tcp-sockets---- --udp-- ----most-expensive----
lis act syn tim clo|lis act|     i/o process      
 5   4   0   0   0|  2   0|bash       2337k 2328k
 5   4   0   0   0|  2   0|sshd: root@ 466B  516B

glances

  • A cross-platform curses-based monitoring tool 
    glance是一款Python语言开发的系统监控工具,能够监视CPU、负载、内存、磁盘I/O、网络流量、文件系统、系统温度等信息。 

    • 功能 
      CPU 使用率 
      内存使用情况 
      内核统计信息和运行队列信息 
      磁盘 I/O 速度、传输和读/写比率 
      文件系统中的可用空间 
      磁盘适配器 
      网络 I/O 速度、传输和读/写比率 
      页面空间和页面速度 
      消耗资源最多的进程 
      计算机信息和系统资源

    • glance实时显示系统信息,占用CPU资源通常低于2%,默认刷新间隔2秒,可输出.csv或.html格式报表

    • 常用选项 
      -b: 以Byte为单位显示网卡数据速率 
      -d: 关闭磁盘I/O模块 
      -f /path/to/somefile: 设定输入文件位置 
      -o {HTML|CSV}:输出格式 
      -m: 禁用mount模块 
      -n: 禁用网络模块 
      -t #: 延迟时间间隔 
      -1:每个CPU的相关数据单独显示

    • 工作界面

cent6 (CentOS 6.8 64bit / Linux 2.6.32-642.el6.x86_64)     Uptime: 3:35:25

CPU       3.2%   Load   1-core   Mem    49.2%  active:   53.9M   Swap    1.1%
user:     1.3%   1 min:   0.00   total:  475M  inactive:  163M   total: 1024M
system:   1.9%   5 min:   0.01   used:   233M  buffers:  8.40M   used:  11.4M
idle:    96.8%   15 min:  0.05   free:   241M  cached:    110M   free:  1013M

Network    Rx/s    Tx/s   Tasks  135 (221 thr),  1 run, 134 slp,  0 oth
bond0       6Kb     2Kb
eth0        3Kb      0b    VIRT   RES  CPU%  MEM% NAME
eth1        3Kb     2Kb    205M   12M   2.9   2.4 glances
lo           0b      0b     19M    1M   0.0   0.3 /sbin/init
                             0     0   0.0   0.0 kthreadd
Disk I/O   In/s   Out/s       0     0   0.0   0.0 migration/0
sda1          0       0       0     0   0.0   0.0 ksoftirqd/0
sda2          0       0       0     0   0.0   0.0 stopper/0
sda3          0       0       0     0   0.0   0.0 watchdog/0
                             0     0   0.0   0.0 events/0
Mount      Used   Total       0     0   0.0   0.0 events/0
/         3.35G   11.5G       0     0   0.0   0.0 events_long/0
/boot     33.3M    141M       0     0   0.0   0.0 cgroup

Press 'h' for help
  • 参数说明 
    VIRT: 虚拟内存大小 
    RES: 进程占用的物理内存值 
    %CPU:该进程占用的 CPU 使用率 
    %MEM:该进程占用的物理内存和总内存的百分比 
    PID: 进程 ID 号 
    USER: 进程所有者的用户名 
    TIME+: 该进程启动后占用的总的 CPU 时间 
    IO_R 和 IO_W: 进程的读写 I/O 速率 
    NAME: 进程名称 
    NI: 进程优先级 
    S: 进程状态,其中 S 表示休眠,R 表示正在运行,Z 表示僵死状态。

  • 快捷键 
    h : 显示帮助信息 
    q : 离开程序退出 
    c :按照 CPU 实时负载对系统进程进行排序 
    m :按照内存使用状况对系统进程排序 
    i:按照 I/O 使用状况对系统进程排序 
    p: 按照进程名称排序 
    d : 显示磁盘读写状况 
    w : 删除日志文件 
    l :显示日志 
    s: 显示传感器信息 
    f : 显示系统信息 
    1 :轮流显示每个 CPU 内核的使用情况(次选项仅仅使用在多核 CPU 系统)

  • 服务器 / 客户端工作方式 
    Server端:

glances -s -B IPADDR    #本机ip

Client端:

glances -c IPADDR  #服务端ip

总结

理解所有的 linux 性能分析工具并做出理性的选择是一个浩大的工程,这是一个很好的例程: 


总结.jpg

原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/45404