进程的基本概念:


进程可以理解成运行中的程序的一个副本。程序通过内核调度运行起来成为一个进程,并由内核负责调度其运行于CPU之上以执行程序中的一部分或全部代码,因此进程是运行中的动态实体。而程序是放在文件系统上的一个文件,只要不删除将永久存在,而进程是有生命周期的,每个进程都有创建、运行、结束这一时间段。同一个程序的代码可以被复制多份并由内核调度成多个进程运行,因此可称为运行中的程序的一个副本。


进程调度:


进程管理中最重要的一部分是进程调度,可理解成对各个进程运行时的各种细节的安排和管理。当文件系统上一个可执行程序文件被触发并通过内核调度运行为一个进程时,进程中的指令、数据以及进程相关的属性信息(例如进程的属主、属组、PID等)被内核加载至内存空间中,而指令需要运行在CPU之上,此时CPU中的寄存器可记录正在运行中的指令的状态,例如正在取指令、执行指令、加工数据、取数据...,其中指令指针寄存器IP用于存放下一条要执行的指令的内存地址。


但是需要CPU运行的有众多进程而不只有一个进程,因此内核将CPU切分为多个时间片,并负责将这多个时间片按照优先级分配给各个进程。当一个进程在某一时间片运行与CPU上时,这个时间片就是该进程允许运行的时间,一旦过了这个时间片,该进程将被中断,这时内核把这个进程的中间状态信息按照固定的格式存储于内存中,重新调度另一个进程运行于CPU之上,接着,CPU中用于存放进程状态相关数据将被下一个进程所覆盖。其中,将进程的相关状态信息存储于内存中这一过程称为保存现场,而Linux内核存储进程状态信息是存储进具有固定格式的结构体的,这个结构体就是task struct多个任务(进程)的结构体(task struct)组成链表结构(task list),根据组成方式的不同有单向链表结构、双向链表结构、循环链表结构、双向循环列表结构等。打个比方,我们盛酒水需要用坛子,而这个固定结构的容器--坛子,就是结构体,总不能用地板装酒水吧?而这些坛子按照一定的组织排列起来的结构可类比为链表结构。


需要注意的是,当CPU上的某一时间片结束后,内核会调度另一个进程运行于CPU之上,而问题是内核该如何从众多等待运行的进程中挑选出一个进程并使其运行于CPU上呢?为了在调度进程时明确哪个进程优先执行,哪个进程后执行,需要用进程优先级来做判断。进程优先级范围是0-139,分为实时优先级(1-99)和静态优先级(100-139),其中实时优先级与内核执行的系统管理操作有关,用户不可对实时优先级进行调整;而用户可以调整的是静态优先级(可通过nice值进行调整),普通用户只可调低不可调高,只有系统管理员才可随意调整。因此,内核是将进程优先级来作为调度进程次序的依据的,但由此内核首先必须知道各个进程的属性(优先级),因此在每次调度进程执行时总得遍历内存上所有结构体中的信息,这将会消耗掉大量的时间。


Linux的2.6版本内核通过精巧的设计解决了这一问题:将所有进程排成140个队列,每个队列对应一个优先级,每个进程归属至其优先级的队列中。而每次内核调度进程执行时只需扫描这140个队列的首部,并从这些队列中挑选出一个进程出来执行即可。这样一来,无论进程有多少个,内核都是通过扫描140个队列首部来实现快速明确调度哪个进程执行于CPU上,因此调度时间不会随进程数量而改变。内核的这种工作模式基于的算法符合程序界的Big O中的O(1)理想模型,即意味着随着算法复杂度的增加,算法解决问题(这里是进程调度速度问题)的时间不会变化。


但这样一来又有一个问题,当一个进程在一个时间片执行完之后应该如何归队呢?在Linux中,进程按照优先级排出队列,而每个队列内部又分为运行队列过期队列,实际上内核就是通过扫描各个运行队列首部来做判断的,而进程在CPU执行之后返回过期队列中,而运行队列继续等待内核的调度;一旦运行队列中的进程全部执行完毕(每个进程都在CPU上轮流执行了一遍),这时运行队列将转变为过期队列,而原来的过期队列则转变为运行队列等待内核再次调度,重复上述逻辑。



进程创建:


主机开机后,首先将内核加载至内存中,在CPU上开始运行内核代码。接着由进程开始创建初始化进程init,并将用户空间的管理事务交给init这个进程管理。接着init会创建出子进程,而这些子进程可以分别创建出各自的子进程,因此除了init进程之外,其他的进程都由其父进程创建;init进程可视为内核的代理,负责管理用户空间进程的创建和关闭,并向内核提交相应的请求,但init不能代替内核执行特权指令。


那么,在什么情况下父进程需要创建子进程呢?当一个父进程需要借助于某些程序完成复杂任务时,通常需要调用系统上某个可执行程序文件,将其创建为进程,而创建子进程需要通过fork()这个系统调用接口向内核申请提交要创建的进程,而后再通过clone()接口将自身的数据复制一份给子进程;需要注意的是,此时父进程和子进程在内存中占据相同的空间,而一旦子进程需要修改数据时,父进程会重新开辟一个相同的内存空间给子进程,这是父进程和子进程不在占据同一内存空间,这种机制称为写时复制机制(CoW)


当子进程完成复杂任务时,其父进程会关闭该子进程,内核将内存收回。


init程序在不同版本的体现:

CentOS 5:
    SysV init,经典版本,缺陷是在系统启动和引导时,它创建各子进程是通过写脚本方式借助于
    shell来实现的,因为shell脚本是大量命令的堆砌,每个命令运行时会创建进程,因此每启动一
    次就需要创建上千个进程,因此执行速度非常慢。
    
CentOS 6:
    upstart,基于dbus方式进行通信,同SysV init是通过运行很多命令创建很多进程来完成的,但
    不同的是upstart能够并行启动具有关联性的服务程序,实现多线创建进程,如果CPU有多个时会
    快很多,而SysV init仅能以串行方式实现启动程序。
    
CentOS 7:
    systemd,以一个程序完成整个系统的启动和引导,而且需要启动的进程总数仅有10个左右,因此
    系统启动和引导非常快。CentOS7上启动或关闭服务程序时需要通过systemctl实现,因为这些服
    务统一由systemd控制;
    

#不同版本的init程序文件名都为init。


进程内存:


承接上述,当内核运行起来之后,会占据一定的内存空间,例如对于Linux来讲一般是1G。其他进程运行起来之后,内核会将内存按空间分成多片分配给各个进程使用,这里的每个“片”指的是页框(page frame),页框就是用来存储页面数据(内存进程信息)的,一个页框就是4K大小的内存空间块。而将真实的物理内存空间连续地分配给各进程使用明显不合适,因为往往空闲的内存空间是离散分布的,而且各个进程在运行过程中会产生各种中间数据,这也会导致进程占据的内存空间加大。因此,内核将底层的物理内存上的空闲的碎片(页框)收集起来,并为上层运行的进程虚拟出连续的内存空间,这个虚拟的内存地址也称为逻辑地址,让每个进程“以为”其占据的内存空间是连续分布的,这个连续的逻辑地址称为线性地址空间。内核会为每个进程虚拟出一个“假象”,即主机上只运行两个程序:内核和进程自己,并且“以为”线性地址空间中除了1G内存分配给内核使用,其余的内存空间均可由进程自己使用。事实上,进程真正只用到一小部分内存空间,并映射到真实的物理内存上连续或离散的内存空间。逻辑地址和物理地址之间映射关系则存储于task struct。当进程执行时,CPU中有专门用于将逻辑地址转换为物理内存地址的电路,即内存管理单元(MMU, Memory Management Unit),因此需要内核将内存的映射关系加载至MMU中。


当进程被分配好内存后,其指令、数据以及进程相关的属性信息会加载至内存中,在内存低地址的地方存放指令(code),而数据可以由变量等数据结构组织存放于内存中,当然也可以是普通数据;进程还会将一部分空间作为堆(heap)内存和栈(stack)内存;当进程运行的中间数据增加时,或者需要加载磁盘上更多数据至内存时,存放于堆内存和栈内存中的数据量增大,堆内存空间向栈顶的方向扩展,而栈内存空间向堆的方向扩展;一旦两者在扩展时相遇,则说明物理内存空间不足;这时交换空间(swap)就出场了,swap可通过近期最少使用算法(LRU, Least Recently Used)扫描出内存上内存上最近不常用的数据,将其暂存于swap中,而腾挪出来的内存空间可供进程使用。


当然,并非所有内存空间中的数据都可交换至swap中,关键性数据(如程序指令code)就不可交换,但非关键性数据(例如程序中的一些不常用数据data);我们把不能用于交换的内存空间称为常驻内存集,而能够交换的内存空间称为虚拟内存集。不过,如果交换了内存空间,那么线性地址空间中映射的物理内存空间地址也会发生改变,因此当进程需要重新访问被交换至磁盘上的swap或加载磁盘上其他空间的数据至内存时,需要先请求内核调用,内核将磁盘上的数据先加载至内核内存中,再复制一份给进程内存。并且,当进程在CPU上执行时需要更新MMU上的映射关系。


进程间通信:


虽说进程“以为”主机上只运行内核和进程自己,但进程间是可以通过IPC(Inter-Process Communication)技术实现通信的。而进程间通信在同一主机上和不同主机上是各不相同的。


IPC(Inter-Process Communication):

同一主机上:

signal:通过发送信号方式通信;
shm:通过共享内存方式通信;
semerphor:旗语,通过类似“打手势”方式通信;

不同主机上上:

rpc:remote procecure call,即远程过程调用,进程通过调用远程主机上的库函数或数据加工处理
的结果实现通信;rpc是基于socket实现,但比socket更为抽象的一种通信方式;

socket:通过进程监听的方式实现通信,通信双方事先需要建立虚链路(tcp连接);在用户空间表现为
socket文件,双方主机上的socket文件都保存本地主机的IP/Port以及对方主机的IP/Port,一方用户
可通过向socket文件写数据,另一方用户则可通过读取socket文件获取数据;


进程类型:


根据是否与终端相关分类:

守护进程:在系统引导过程中启动的进程,跟终端无关;
前台进程:通过终端启动的进程,跟终端相关;

#注意:也可以把在前台启动的进程送往后台,以守护模式运行;


根据进程占用CPU多还是IO多分类:

CPU-bound:一般非交互式进程属于CPU密集型;
IO-bound:一般交互式进程属于IO密集型;IO密集型进程的优先级应比CPU密集型进程高;

#根据Linux哲学思想之一:程序启动之后应尽量避免与用户交互,可知CPU-bound这一类进程应该多
分配一些CPU资源。


进程状态:

(1)运行态:running;

(2)就绪态:ready,可以运行但没在CPU上运行;也可以称为睡眠态;

(3)睡眠态:分为可中断睡眠和不可中断睡眠;
        可中断睡眠:interruptable,任何时候都可唤醒并运行;
        不可中断睡眠:uninterruptable,例如等待IO过程;
        
(4)停止态:stopped,即暂停于内存中,不会别调度,除非手动启动之;

(5)僵死态:zombie,子进程运行结束之后需要等待其父进程关闭,但若其父进程意外事先关闭,则
子进程会一直等待下去,此时该子进程即为僵尸进程,或者说处于僵死态;

#等待IO过程:
当进程执行时需要用到的数据不在内存中时,需要向内核发起申请(通过系统调用接口,进程无法直接
访问硬件),内核将磁盘上的数据先加载至内核内存中,再将内核内存中加载的数据复制一份给进程内
存;


线程的基本概念:


一般来讲,每个程序运行时只能有一个执行流;而如果程序内部有很多代码需要执行并且这些代码彼此之间实现的功能又比较独立,为了让程序执行速度更快,则可通过并行编程的模式将程序开发成可以互相独立并且能单独执行的执行流,而这个执行流就是线程;线程是进程的子单位。当有多个CPU时,程序启动后创建出多个并行执行的线程(执行流),这些线程可分别运行于不同颗CPU之上。不过,当主机只有一个CPU时,将进程分成多个线程执行反而会降低运行速度,因为内核在切换调度进程(线程)时会消耗很多CPU时间。


关于服务类程序:


对于Linux来讲,基本是通过各个具有简单功能的小程序组合起来完成复杂任务的,因此在Linux上进程都是轻量级的,和线程几乎没差别。虽然现在很多服务类程序都是基于并行编程模式编写的,但当服务器接收到的请求过多时响应速度仍然会非常慢,因此现在编程时可通过精巧的设计,使一个进程能同时响应多个进程。


作为一名Linux运维人员,需要有鉴定当前系统的运行状态、资源的消耗情况、进程启动的数量和模式等,例如当用户网页打开速度慢时,我们需要查看当前系统上运行了哪些进程、是否有我们期望运行的进程、期望运行的这个进程占据了CPU和内存多大百分比、是否要调整进程的优先级、以及是否把CPU和内存资源占满......对于较大型的服务类程序,例如Java编写的程序比较吃内存,常常需要运维人员查看jvm虚拟机运行是否正常、是否要调整其垃圾回收策略、是否其内存资源使用的上限或下限、是否要再启动一个jvm进程来实现并行响应......总之,对于运维人员来讲,具有鉴定当前系统上的运行状态的能力非常重要,因为运维基本都是服务,而服务是通过进程来提供的。


Linux系统上的进程查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup, nice, renice, killall, ...


pstree命令:

display a tree of processes

用于显示进程树。


示例:

在CentOS 6上显示进程树:

[root@osyunwei ~]# pstree
init─┬─NetworkManager
      ├─abrtd
      ├─acpid
      ├─atd
      ├─auditd───{auditd}
      ├─automount───4*[{automount}]
      ├─bluetoothd
      ├─certmonger
      ├─console-kit-dae───63*[{console-kit-da}]
      ├─crond
      ├─cupsd
      ├─dbus-daemon───{dbus-daemon}
      ├─dmeventd───2*[{dmeventd}]
      ├─gpm
      ├─hald─┬─hald-runner─┬─hald-addon-acpi
      │        │                 ├─hald-addon-inpu
      │        │                 ├─hald-addon-rfki
      │        │                 └─hald-addon-stor
      │        └─{hald}
      ├─2*[iscsid]
      ├─iscsiuio───2*[{iscsiuio}]
      ├─ksmtuned───sleep
      ├─login───bash
      ├─master─┬─pickup
      │          └─qmgr
      ├─5*[mingetty]
      ├─modem-manager
      ├─pcscd───{pcscd}
      ├─polkitd
      ├─portreserve
      ├─rpc.statd
      ├─rpcbind
      ├─rsyslogd───3*[{rsyslogd}]
      ├─sshd─┬─sshd───bash
      │        └─sshd───bash───pstree
      ├─udevd───2*[udevd]
      └─wpa_supplicant


在CentOS 7上显示进程树:

[root@www ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
         │                  └─2*[{NetworkManager}]
         ├─abrt-watch-log
         ├─abrtd
         ├─anacron
         ├─atd
         ├─auditd───{auditd}
         ├─crond
         ├─dbus-daemon───{dbus-daemon}
         ├─firewalld───{firewalld}
         ├─httpd───6*[httpd]
         ├─irqbalance
         ├─login───bash
         ├─lsmd
         ├─lvmetad
         ├─master─┬─pickup
         │          └─qmgr
         ├─polkitd───5*[{polkitd}]
         ├─rngd
         ├─rpcbind
         ├─rsyslogd───2*[{rsyslogd}]
         ├─smartd
         ├─sshd───sshd───bash───pstree
         ├─systemd-journal
         ├─systemd-logind
         ├─systemd-udevd
         ├─tuned───4*[{tuned}]
         └─vmtoolsd───{vmtoolsd}


ps命令:

report a snapshot of the current processes.

显示ps命令执行那一刻系统上进程的运行状态。


ps命令查看内核管理进程参数的接口 --> 伪文件系统/proc

进程是由内核管理的,而内核管理进程的相关信息可通过接口来查询,在Linux上这个接口就是/proc目录,内核参数是模拟成文件系统类型的,每个文件即为内核参数。/proc文件系统存放于内存空间中,用于存放内核中的状态信息。

内核参数有两种:

(1)可设置其值从而调整内核运行特性的参数:这些参数通常存放于/proc/sys/目录下,但并非位于
/proc/sys目录下的文件(参数)均可设置,只能设置具有写权限的文件(参数)。

(2)状态参数:用于输出内核中的统计信息和状态信息;仅用于查看。

每个进程在/proc目录下都有一个与其PID同名的目录,这个目录下的每个文件都是内核参数,用于专保存当前进程的相关信息。

如下,显示init进程对应的目录:

wKiom1ii8duA2cNEAABX0XtaCDQ227.png









通过参数comm可查看启动该进程的程序文件:

[root@osyunwei ~]# cat /proc/1/comm 
init

通过参数maps可查看逻辑地址和物理内存地址的映射关系:

[root@osyunwei ~]# cat /proc/1/maps
7f10e779e000-7f10e77ab000 r-xp 00000000 fd:01 398008    /lib64/libnss_files-2.12.so
                                                        #库函数
7f10e77ab000-7f10e79aa000 ---p 0000d000 fd:01 398008    /lib64/libnss_files-2.12.so
7f10e79aa000-7f10e79ab000 r--p 0000c000 fd:01 398008    /lib64/libnss_files-2.12.so
7f10e79ab000-7f10e79ac000 rw-p 0000d000 fd:01 398008    /lib64/libnss_files-2.12.so
7f10e79ac000-7f10e7b36000 r-xp 00000000 fd:01 462418    /lib64/libc-2.12.so
7f10e7b36000-7f10e7d36000 ---p 0018a000 fd:01 462418    /lib64/libc-2.12.so
.....(中间省略).....
7f10e8c01000-7f10e8c24000 r-xp 00000000 fd:01 149577    /sbin/init
7f10e8e23000-7f10e8e25000 r--p 00022000 fd:01 149577    /sbin/init
7f10e8e25000-7f10e8e26000 rw-p 00024000 fd:01 149577    /sbin/init
7f10eaa25000-7f10eaa64000 rw-p 00000000 00:00 0         [heap]    #堆内存
7ffc9a845000-7ffc9a85a000 rw-p 00000000 00:00 0         [stack]   #栈内存
7ffc9a8fd000-7ffc9a8fe000 r-xp 00000000 00:00 0         [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

因为在/proc目录下的内核参数对于非内核级开发人员来说不便于查看,因此就有诸多查看命令专门将其中这些内核参数信息收集起来并以一种直观的方式显示出来,ps命令就是其中一个比较经典的命令;


ps命令格式:

ps [options]


ps命令选项有三种风格:

(1)UNIX选项:选项之前必须带'-'
(2)BSD选项:选项之间不能带'-'
(3)GNU长格式选项:选项之前必须带'--'


常用选项:

    a:显示所有与终端相关的进程;

    x:显示所有与终端无关的进程;

    u:以用户为中心组织进程状态信息的显示;

    o field1,field2,...:自定义要显示的字段列表;各字段以逗号分隔;


    -e:显示所有进程

    -f:以完整格式显示进程状态信息;

    -F:以完整格式显示进程状态信息(显示项比-f选项更多);

    -H:Hierarchy,以层级结构显示进程的相关信息;


进程启动方式:

(1)系统启动过程中自动启动:与终端无关的进程;

(2)用户通过终端启动的进程:与终端相关的进程;


①常用组合之一:aux


显示所有与终端相关的进程:

[root@localhost ~]# ps a
   PID TTY      STAT   TIME COMMAND
  2571 tty1     Ss+    0:02 -bash
 13604 pts/0    Ss     0:00 -bash
 13742 pts/0    R+     0:00 ps a
 
 
 #各字段意义:
 PID:进程号;
 TTY:与进程相关的终端设备;
 STAT:进程的状态;
 TIME:进程累积占用CPU的时间;
 COMMAND:启动该进程的程序命令(包括选项和参数)


显示所有与终端无关的进程:

[root@localhost ~]# ps x
  PID TTY    STAT   TIME COMMAND
    1 ?      Ss     0:28 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
    2 ?      S      0:00 [kthreadd]
    3 ?      S      0:00 [ksoftirqd/0]
    5 ?      S<     0:00 [kworker/0:0H]
    7 ?      S      0:02 [migration/0]
    8 ?      S      0:00 [rcu_bh]
    9 ?      R      0:30 [rcu_sched]
   10 ?      S      0:00 [watchdog/0]
    .....(省略).....
 1982 ?      Ss     0:12 /usr/sbin/httpd -DFOREGROUND
 2571 tty1   Ss+    0:02 -bash
 5213 ?      Ssl    0:12 /usr/sbin/NetworkManager --no-daemon
 7625 ?      S<     0:00 [kworker/1:2H]
    .....(省略).....
13739 ?      S      0:00 [kworker/3:1]
13740 ?      S<     0:00 [kworker/3:2H]
13755 pts/0  R+     0:00 ps x


#'?'表示与终端无关;
#根据PID号从小到大排序,各字段意义同上;


显示所有进程:

[root@localhost ~]# ps ax


以用户为中心显示所有进程:

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.6 193628  6732 ?        Ss   Feb13   0:28 /usr/lib/systemd/systemd 
--switched-root --system --des
root          2  0.0  0.0      0     0 ?        S    Feb13   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    Feb13   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   Feb13   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    Feb13   0:02 [migration/0]
root          8  0.0  0.0      0     0 ?        S    Feb13   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    Feb13   0:30 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S    Feb13   0:00 [watchdog/0]
root         11  0.0  0.0      0     0 ?        S    Feb13   0:00 [watchdog/1]
root         12  0.0  0.0      0     0 ?        S    Feb13   0:03 [migration/1]
root         13  0.0  0.0      0     0 ?        S    Feb13   0:03 [ksoftirqd/1]
.....(以下省略).....


#各字段意义:
USER:运行进程的用户;
PID:进程号;
%CPU:进程占用CPU资源的百分比;
%MEM:进程占用内存资源的百分比;
VSZ:Virtual memory SiZe,虚拟内存集;
RSS:ReSident Size,常驻内存集;
TTY:与进程相关的终端设备;
STAT:进程状态;
START:进程的启动时间;
TIME:进程累积占用CPU时间;
COMMAND:进程由哪个命令程序启动,带'[]'代表为内核线程,而通过pstree命令只能显示进程;


进程状态(STAT):

R:running,运行态;
S:interruptable sleeping,可中断睡眠;
D:uninterruptable sleeping,不可中断睡眠;
T:stopped,停止态;
Z:zombie,僵死态;

+:前台进程(前台指的是通过终端运行,需要占据命令提示符);
l:多线程进程;
N:低优先级进程;
<:高优先级进程;
s:session leader,会话主导者(例如bash);


②常用组合之二:ef


显示所有进程:

[root@localhost ~]# ps -e
  PID TTY          TIME CMD
    1 ?        00:00:28 systemd
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 ksoftirqd/0
   .....(以下省略).....


以完整格式显示进程信息:

[root@localhost ~]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root      13604  13600  0 19:42 pts/0    00:00:00 -bash
root      13882  13604  0 21:03 pts/0    00:00:00 ps -f

#STIME:进程的启动时间;


以完整格式显示所有进程:

[root@localhost ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 Feb13 ?        00:00:28 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2      0  0 Feb13 ?        00:00:00 [kthreadd]
root          3      2  0 Feb13 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 Feb13 ?        00:00:00 [kworker/0:0H]
root          7      2  0 Feb13 ?        00:00:02 [migration/0]
root          8      2  0 Feb13 ?        00:00:00 [rcu_bh]
root          9      2  0 Feb13 ?        00:00:31 [rcu_sched]
root         10      2  0 Feb13 ?        00:00:00 [watchdog/0]
root         11      2  0 Feb13 ?        00:00:00 [watchdog/1]
.....(以下省略).....


#各字段意义:
UID:effective user,有效用户,即运行该进程的用户;
PID:进程号;
PPID:父进程号;
C:cpu utilization,CPU使用率,即占用CPU资源的百分比;
STIME:进程的启动日期;
TTY:与进程相关的终端设备;'?'表示与终端无关;
TIME:进程累积占用CPU的时间;
CMD:启动进程的命令程序,带'[]'表示为内核线程;


以更为完整的格式显示所有进程:

[root@localhost ~]# ps -eF
UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root          1      0  0 48407  6732   3 Feb13 ?        00:00:28 /usr/lib/systemd/systemd 
--switched-root --system --des
root          2      0  0     0     0   0 Feb13 ?        00:00:00 [kthreadd]
root          3      2  0     0     0   0 Feb13 ?        00:00:00 [ksoftirqd/0]
root          5      2  0     0     0   0 Feb13 ?        00:00:00 [kworker/0:0H]
root          7      2  0     0     0   0 Feb13 ?        00:00:02 [migration/0]
root          8      2  0     0     0   2 Feb13 ?        00:00:00 [rcu_bh]
root          9      2  0     0     0   0 Feb13 ?        00:00:31 [rcu_sched]
root         10      2  0     0     0   0 Feb13 ?        00:00:00 [watchdog/0]
root         11      2  0     0     0   1 Feb13 ?        00:00:00 [watchdog/1]


#各字段意义:
UID:运行该进程的用户;
PID:进程号;
PPID:父进程号;
C:CPU使用率;
SZ:即VSZ,虚拟内存集;
RSS:常驻内存集;
STIME:进程的启动日期;
TTY:与进程相关的终端设备;
TIME:进程累积占用CPU的时间;
CMD:启动进程的命令程序;


③常用组合之三:-efH


以层级结构显示进程相关信息:

[root@localhost ~]# ps -efH
UID         PID   PPID  C STIME TTY          TIME CMD
root          2      0  0 Feb13 ?        00:00:00 [kthreadd]
root          3      2  0 Feb13 ?        00:00:00   [ksoftirqd/0]
root          5      2  0 Feb13 ?        00:00:00   [kworker/0:0H]
root          7      2  0 Feb13 ?        00:00:02   [migration/0]
root          8      2  0 Feb13 ?        00:00:00   [rcu_bh]
root          9      2  0 Feb13 ?        00:00:31   [rcu_sched]
root         10      2  0 Feb13 ?        00:00:00   [watchdog/0]
root         11      2  0 Feb13 ?        00:00:00   [watchdog/1]
root         12      2  0 Feb13 ?        00:00:03   [migration/1]
root         13      2  0 Feb13 ?        00:00:03   [ksoftirqd/1]
.....(中间省略).....
root        840      1  0 Feb13 ?        00:00:02   /usr/sbin/rsyslogd -n
dbus        841      1  0 Feb13 ?        00:00:22   /bin/dbus-daemon --system --address=sys
temd: --nofork --nopidfile --s
root        854      1  0 Feb13 ?        00:00:00   /usr/sbin/sshd
root      13600    854  0 19:42 ?        00:00:01     sshd: root@pts/0
root      13604  13600  0 19:42 pts/0    00:00:00       -bash
root      13993  13604  0 21:15 pts/0    00:00:00         ps -efH
root        861      1  0 Feb13 ?        00:00:06   /usr/lib/systemd/systemd-logind
root        868      1  0 Feb13 ?        00:00:00   /usr/sbin/atd -f
root        870      1  0 Feb13 ?        00:00:01   /usr/sbin/crond -n
root        884      1  0 Feb13 ?        00:00:00   login -- root
root       2571    884  0 Feb13 tty1     00:00:02     -bash
.....(以下省略).....


#CMD字段缩进级别相同的进程表示为同级子进程;


④常用组合之四:-eo, axo


o选项:

o field1,field2,...:自定义要显示的字段列表,各字段以逗号分隔;
    常见的field有:pid, ppid, ni, pri, rtpri, pcpu, psr, stat, comm(cmd), tty, ...
        pid:进程号;
        ppid:父进程号;
        ni:nice值;
        priority:优先级;
        rtpri:实时优先级;
        psr:运行于哪颗CPU之上;
        stat:进程状态;
        cmd:启动该进程的命令程序;
        tty:与进程相关的终端设备;


显示PID及其对应的命令程序:

[root@localhost ~]# ps axo pid,cmd
  PID  CMD
    1  /usr/lib/systemd/systemd --switched-root --system --deserialize 21
    2  [kthreadd]
    3  [ksoftirqd/0]
    5  [kworker/0:0H]
    7  [migration/0]
   .....(以下省略).....


在CentOS 7上显示初始化程序systemd相关进程的PID,优先级和Nice值:

[root@loaclhost ~]# ps axo cmd,pid,priority,ni | grep systemd
/usr/lib/systemd/systemd --      1  20   0
/usr/lib/systemd/systemd-jo    601  20   0
/usr/lib/systemd/systemd-ud    640  20   0
/usr/lib/systemd/systemd-lo    846  20   0


pgrep, pkill命令:

look up or signal processes based on name and other attributes

根据名字或其他属性查看进程或向进程发送信号。


命令格式:

pgrep [options] pattern
pkill [options] pattern


常用选项:

    -u uid:effective user,显示指定用户运行的进程(运行过程中可切换身份);

    -U uid:real user,显示指定用户启动了哪些进程;

    -t TERMINAL:显示与终端相关的进程;

    -l:显示进程名;

    -a:显示完整格式的进程名;

    -P pid:显示指定进程的子进程;


用法示例:

显示进程名中包含字符串'ssh'的进程:

[root@localhost ~]# pgrep httpd
1982
1983
1984
1985
1986
1987
1988


显示用户postfix启动了哪些进程:

[root@localhost ~]# pgrep -U postfix
977
14002

#检验:
[root@localhost ~]# ps aux | egrep '^USER|977|14002'
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postfix     977  0.0  0.3  91236  3988 ?        S    Feb13   0:00 qmgr -l -t unix -u
postfix   14002  0.0  0.3  91168  3972 ?        S    21:21   0:00 pickup -l -t unix -u
root      14184  0.0  0.0 112652   968 pts/0    S+   22:06   0:00 grep -E --color=auto ^USER|977|14002


显示用户postfix启动的进程的PID和进程名:

[root@localhost ~]# pgrep -U postfix -l
977 qmgr
14002 pickup


显示用户postfix启动的进程的PID和进程名(完整格式):

[root@localhost ~]# pgrep -U postfix -a
977 qmgr -l -t unix -u
14002 pickup -l -t unix -u


pidof命令:

find the process ID of a running program.

根据进程名,找出相应的PID。


用法示例:

显示httpd对应的PID:

[root@localhost ~]# pidof httpd
1988 1987 1986 1985 1984 1983 1982


top命令:

display Linux processes

以动态方式查看当前系统上的进程信息;类似于Windows上的任务管理器;以排序方式显示,占用某种资源最多的进程显示在最前。


常用命令:

排序:
    P命令:以占据CPU百分比排序;(默认)
    M命令:以占据内存百分比显示;
    T命令:以累积占用CPU时间排序;


控制首部字段的开启或关闭:
    (1)uptime信息:l命令;
    (2)tasks及cpu信息:t命令;
    (3)内存信息:m命令;
    
    
修改刷新时间间隔:s命令;
终止指定的进程:k命令;
退出top进程:q命令;


常用选项:

    -d #:Delay-time interval,指定刷新时间间隔;默认为3秒;

    -b:Batch-mode,以批次方式显示;

    -n #:Number-of-iterations,指定显示多少批次后退出top进程;


用法示例:

动态查看Linux系统上的进程信息:

[root@localhost ~]# top

top - 22:40:29 up 1 day,  9:33,  2 users,  load average: 0.00, 0.01, 0.05
      
Tasks: 203 total,   2 running, 200 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   999964 total,   485220 free,   185104 used,   329640 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   598852 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                            
 14293 root      20   0  157708   2284   1556 R   0.3  0.2   0:00.05 top                                                
     1 root      20   0  193628   6732   3968 S   0.0  0.7   0:29.74 systemd                                            
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.15 kthreadd                                           
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.88 ksoftirqd/0                                        
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                       
     7 root      rt   0       0      0      0 S   0.0  0.0   0:02.20 migration/0                                        
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                             
     9 root      20   0       0      0      0 S   0.0  0.0   0:33.04 rcu_sched                                          
    10 root      rt   0       0      0      0 S   0.0  0.0   0:00.79 watchdog/0                                         
    11 root      rt   0       0      0      0 S   0.0  0.0   0:00.84 watchdog/1                                         
    12 root      rt   0       0      0      0 S   0.0  0.0   0:03.81 migration/1                                        
    13 root      20   0       0      0      0 S   0.0  0.0   0:03.32 ksoftirqd/1                                        
    15 root       0 -20       0      0      0 S   0.0  0.0   0:00.18 kworker/1:0H                                       
    16 root      rt   0       0      0      0 S   0.0  0.0   0:00.87 watchdog/2                                         
    17 root      rt   0       0      0      0 S   0.0  0.0   0:02.76 migration/2


top命令前五行信息是系统的整体统计信息:


①第一行是系统时间、运行时长及平均负载(任务队列)信息,该信息同命令uptime执行结果一致:

[root@localhost ~]# uptime 
 22:54:29 up 1 day,  9:47,  2 users,  load average: 0.00, 0.01, 0.05

其内容如下:

22:54:29当前时间
up 1 day,  9:47系统运行时长
2 users当前登录系统的用户数
load average: 0.00, 0.01, 0.05过去1分钟、5分钟和15分钟的平均负载;这里的平均负载指的是等待CPU运行的进程队列长度;长度越大,则CPU负载越大;如果这3个值长时间超过CPU核数时,说明CPU处于高负载状态


②第二、三行为进程和CPU信息:

Tasks: 202 total,   1 running, 200 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st

当有多个CPU时,这些内容可能会超过两行。


第二行内容如下:

Tasks: 203 total进程总数
2 running处于运行态的进程数
200 sleeping处于睡眠态的进程数
1 stopped处于停止态的进程数

0 zombie

处于僵死态的进程数


第三行内容如下:

%Cpu(s):

0.1 us用户空间的进程所占用的CPU时间的百分比
0.1 sy内核空间的进程所占用的CPU时间的百分比
0.0 ni被nice命令改变优先级的任务所占的百分比
99.8 ididle,空闲时间百分比
0.0 wa等待IO过程消耗的时间百分比
0.0 hihardware interrupt,处理硬件中断所占用的CPU时间百分比
0.0 sisofeware interrupt,处理软中断所占用的CPU时间百分比
0.0 ststolen,被虚拟化程序所偷走的CPU时间百分比,即虚拟CPU等待实际CPU的时间的百分比


③第四、五行为内存信息(单位:k):

KiB Mem :   999964 total,   485512 free,   184832 used,   329620 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   599148 avail Mem


第四行内容如下:

KiB Mem : 

999964 total内存总量
485512 free空闲的内存总量
184832 used已使用的内存总量
329620 buff/cache用于缓冲/缓存的内存空间,可回收利用
#buff和cache的区别:
buff(缓冲区)用于平衡CPU和IO之间的处理速率,它的引入主要是为了减小短期内突发IO的影响,起
到流量整型的作用。
cache(缓存区)用于弥补CPU和Memory之间处理速度的差异,可将常用的数据存放于CPU中的cache以
提高计算机处理速率。


第五行内容如下:

KiB Swap:

2097148 totalswap分区总量
2097148 free空闲的swap分区总量
0 used已使用的swap分区总量
599148 avail Mem可利用的空间,大致由'free'和'buff/cache'相加而得


进程信息:

PID进程号
USER运行进程的用户名

PR

进程优先级
NINice值
VIRT虚拟内存集
RES常驻内存集
SHS共享内存空间
S进程状态
%CPU进程占用CPU时间的百分比
%MEM进程占用内存空间的百分比
TIME+进程累积占用的CPU时间
COMMAND启动进程的命令程序名


使用命令'1',可在首部字段中显示所有CPU的状态信息:

wKioL1ikaLSgNl0AAADv5FcVn1s742.png


注意:在CentOS 6和CentOS 7上的top首部字段略有不同:

在CentOS 6上:

wKioL1ijK0jgeClcAABkPg9ZIYg635.png



在CentOS 7上:

wKiom1ijK0nQZON2AAB04DLbCOU835.png


uptime命令:

Tell how long the system has been running.

显示系统时间、系统运行时长及平均负载;平均负载指的是过去1分钟、5分钟和15分钟的平均负载,这里表示等待CPU运行的进程队列的长度;显示的字段为top命令首部字段中第一行的内容,又称uptime信息。


示例:

显示当前系统的平均负载:

[root@localhost ~]# uptime 
 00:25:36 up 1 day, 11:19,  2 users,  load average: 0.01, 0.03, 0.05



htop命令:

interactive process viewer

交互式进程查看器;是top的增强版,相比top而言,htop增加了对各进程进行搜索、过滤、绑定CPU、

追踪系统调用和标记等功能,也可显示指定进程打开的文件列表或以层级关系显示进程等等;

支持鼠标控制;可借助于可信任的第三方组织epel源下载。


命令格式:

htop [-dChusv]


常用选项:

    -d #:指定延迟时间间隔;

    -u UserName:只显示指定用户相关的进程;

    -s COLUME: 以指定的字段COLUME对进程进行排序;


常用子命令:

    l:显示指定的进程打开的文件列表;

    s:追踪指定的进程的系统调用;

    t:以层级关系显示各进程状态信息;

    a:将指定的进程绑定至指定的CPU核心;

    u:指定用户相关的进程;

    H:隐藏或显示用户线程;

    K:隐藏或显示内核线程;

    Space:标记指定的单个进程;

    c:标记指定的进程,并且连同其子进程也自动标记;

    U:取消对所有进程的标记;

    >:设置排序的字段;

    ]:通过调整nice值调高优先级;

    [:通过调整nice至调低优先级;

    i:设定IO优先级;



用法示例:

[root@localhost ~]# htop

打开界面如下:

wKiom1ikI5XgGeguAAEo--TDEqY993.png


点击F1键可查看帮助:

wKiom1ikIkfAZOjIAADZxQLiNOU220.png


键入t命令,以层级关系显示出各进程关系:

wKioL1ikIkfQMtCOAAFA-gpvVlw327.png


仅显示用户apache的相关进程:

方式一:

[root@localhost ~]# htop -u apache

显示如图:

wKioL1ikJijyrTzrAADgUEndRZ4022.png


方式二:

在交互式界面使用'u'命令:

wKioL1ikJy_SdVscAADmlPsxyGs934.png


将系统上的所有ping进程kill掉:

方法有很多中,可以通过F3键进程搜索或者通过F4键进行过滤匹配到并删除之,这里介绍用标记的方式kill掉ping进程:

wKiom1ikKYriVlKLAAEhiwv60Lk383.png

再通过F9键传递一个终止信号(如SIGTERM)即可。


vmstat命令:

Report virtual memory statistics

显示虚拟内存的统计数据信息;vmstat是通过查看/proc目录下的文件来获取相关数据并显示出来的。


命令格式:

vmstat [options] [delay [count]]


常用选项:

    -s:显示内存统计数据;


用法示例:

用vmstat查看当前系统的统计数据信息:

[root@localhost ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 443196   1456 357820    0    0     0     0   11   15  0  0 100  0  0

各字段意义如下:

proc(process)

r

等待运行的进程个数,即等待CPU运行的任务队列长度;

实时显示,而uptime信息中平均负载显示的是一段时间的统计平均结果

b处于不可中断睡眠态的进程个数,即被阻塞的任务队列长度

注意:如果r值超过CPU的个数,则说明可能需要添加CPU的个数;


memoryswpd已使用的交换内存总量
free空闲的物理内存总量
buff用于缓冲区(buffer)的内存总量
cache用于缓存区(cache)的内存总量

注意:如果swpd不为0,而so长期为0,这种情况不会影响系统性能;如果free很小,而si、so也很小,那么系统性能这时也不会受到影响;


swapsi数据进入swap中的传输速率(kb/s)
so数据离开swap的传输速率(kb/s)

注意:如果si、so这2个值长期都大于0,那么系统性能会受到影响;


iobi从块设备加载数据至系统的速率(kb/s)
bo保存数据至块设备的速率(kb/s)

注意:在进程随机磁盘读写时,如果bi、bo这2个值越大(如超过1024),则说明系统等待IO过程消耗的时间很多,这时会影响系统性能;


systemininterrupts,中断速率
cscontext switch,上下文切换速率

注意:如果in、cs这2个值越大,则内核消耗CPU的时间越多;


cpuususer space,用户空间进程占用CPU时间的百分比
sysystem,内核进程占用CPU时间的百分比
ididle,空闲时间百分比
wawait,等待IO过程占用CPU时间的百分比
st

stolen,被虚拟化技术拿走的时间百分

注意:如果us值比较高,说明用户进程消耗的CPU资源比较多,如果长期大于50%,则应考虑优化程序算法或进行加速;如果sy比较高,则说明内核消耗CPU资源比较多,这时需要我们对系统进行检查;正常来讲,当CPU处于高负载时,us:sy的值应该大约为7:3左右才算正常,因为只有用户空间进程代码才能带来生产力;而如果wa比较高时,则说明等待IO过程消耗了大量时间,可能是大量随机磁盘访问造成的,此时磁盘IO成为系统性能瓶颈;



vmstat之后一般加上两个参数,第一个参数是延迟时间间隔,第二个参数是显示多少次,例如:每隔两秒显示一次系统状态统计信息,一共显示5次:

[root@localhost ~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 443604   1456 357776    0    0     0     0   11   15  0  0 100  0  0
 0  0      0 443616   1456 357776    0    0     0     0   45   54  0  0 100  0  0
 0  0      0 443616   1456 357776    0    0     0     0   37   47  0  0 100  0  0
 0  0      0 443492   1456 357776    0    0     0     0   52   65  0  0 100  0  0
 0  0      0 443492   1456 357776    0    0     0     0   54   56  0  0 100  0  0


显示内存统计数据:

[root@localhost ~]# vmstat -s
       999964 K total memory
       197468 K used memory
       246536 K active memory
       108244 K inactive memory
       440880 K free memory
         1456 K buffer memory
       360160 K swap cache
      2097148 K total swap
            0 K used swap
      2097148 K free swap
        11707 non-nice user cpu ticks
           81 nice user cpu ticks
        43501 system cpu ticks
     64073593 idle cpu ticks
        17947 IO-wait cpu ticks
            0 IRQ cpu ticks
         2041 softirq cpu ticks
            0 stolen cpu ticks
       230067 pages paged in
       203679 pages paged out
            0 pages swapped in
            0 pages swapped out
      7040596 interrupts
      9682496 CPU context switches
   1487005067 boot time
        19172 forks


pmap命令:

report memory map of a process

用于显示进程的内存映射表;虽然任何一个进程在线性地址空间中看到的是连续的内存空间,但这些分配给内存的内存页都有可能存放于不连续的物理内存空间中。


命令格式:

pmap [options] pid [...]


常用选项:

    -x:显示详细信息;


用法示例:

显示init进程的内存映射表:

[root@loaclhost ~]# pmap 1
1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 21
00007fd8fc000000    164K rw---   [ anon ]
#内存起始地址      #内存片段大小 
00007fd8fc029000  65372K -----   [ anon ]
00007fd904000000    164K rw---   [ anon ]
00007fd904029000  65372K -----   [ anon ]
00007fd909422000      4K -----   [ anon ]
00007fd909423000   8192K rw---   [ anon ]
00007fd909c23000      4K -----   [ anon ]
00007fd909c24000   8192K rw---   [ anon ]
00007fd90a424000     16K r-x-- libuuid.so.1.3.0    #在内存中离散存储;
00007fd90a428000   2044K ----- libuuid.so.1.3.0
00007fd90a627000      4K r---- libuuid.so.1.3.0
00007fd90a628000      4K rw--- libuuid.so.1.3.0
.....(中间省略).....
00007fd90cde9000   1296K r-x-- systemd
00007fd90cf2e000    124K r---- systemd
00007fd90cf4d000      4K rw--- systemd
00007fd90d547000   2412K rw---   [ anon ]
00007ffdbccaa000    132K rw---   [ stack ]
00007ffdbcd28000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           193628K


显示更为详细的信息:

[root@loaclhost ~]# pmap -x 1
1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 21
Address           Kbytes     RSS   Dirty Mode  Mapping
00007fd8fc000000     164      12      12 rw---   [ anon ]
00007fd8fc029000   65372       0       0 -----   [ anon ]
00007fd904000000     164      12      12 rw---   [ anon ]
00007fd904029000   65372       0       0 -----   [ anon ]
00007fd909422000       4       0       0 -----   [ anon ]
00007fd909423000    8192       8       8 rw---   [ anon ]
00007fd909c23000       4       0       0 -----   [ anon ]
00007fd909c24000    8192       8       8 rw---   [ anon ]
00007fd90a424000      16       8       0 r-x-- libuuid.so.1.3.0
00007fd90a428000    2044       0       0 ----- libuuid.so.1.3.0
00007fd90a627000       4       4       4 r---- libuuid.so.1.3.0
00007fd90a628000       4       4       4 rw--- libuuid.so.1.3.0
.....(中间省略).....
00007fd90cde9000    1296    1116       0 r-x-- systemd
00007fd90cf2e000     124     124     124 r---- systemd
00007fd90cf4d000       4       4       4 rw--- systemd
00007fd90d547000    2412    2284    2284 rw---   [ anon ]
00007ffdbccaa000     132      52      52 rw---   [ stack ]
00007ffdbcd28000       8       4       0 r-x--   [ anon ]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- ------- 
total kB          193628    6732    2764

注意:也可通过另一种方式查看:cat /proc/PID/maps


glances命令:

A cross-platform curses-based monitoring tool

是基于图形函数库curses所研发的跨平台的监控工具,同样可用于监控cpu、memory、io等统计数据信息,用法与top和htop这两个工具类似,可实现远程监控;同时glance支持C/S模式,需要使用epel源下载;


常用选项:

    -b:以Byte/s为单位显示网卡数据速率;

    -d:关闭磁盘I/O模块;

    -m:关闭mount模块;

    -n:关闭network模块; 

    -1:每颗CPU的统计信息都单独显示;

    -t #:指定刷新时间间隔;

    -o {HTML|CSV}:当需要保存glances显示的统计信息为文件时,可设置其输出格式(HTML或CSV);

    -f /PATH/TO/SOMEDIR:设置输出文件的保存目录;

    

用法示例:

直接使用glances命令实时查看当前系统的统计信息:

[root@loaclhost ~]# glances

打开界面如下:

wKiom1ilE-DhtYWgAAEN2xwSOt8117.png

每颗CPU的统计数据信息都单独显示:

[root@loaclhost ~]# glances -1

各颗CPU显示如下:

wKioL1ilFFjTIdViAAAqDAl4QMA842.png


将glances显示的统计数据保存至/tmp目录下,并以HTML格式输出,并打开网页查看统计数据:

[root@loaclhost ~]# glances -o HTML -f /tmp

在CentOS 6上登录CentOS 7:

[root@osyunwei ~]# ssh -X root@10.10.10.140
#为了能够使用CentOS 6浏览器打开CentOS 7上的html文件,可加选项-X;

登录CentOS7后,在CentOS 6上使用firefox浏览器打开/tmp/glances.html文件;

[root@osyunwei ~]# ssh -X root@10.10.10.140
root@10.10.10.140's password: 
Last login: Thu Feb 16 18:13:47 2017 from 10.10.10.139

            Hello,Tab!
        Long time no see.
    I'm so happy to see you!!! ^_^ 
        Enjoy youself,Tab~
	     

[root@loaclhost ~]# 
[root@loaclhost ~]# firefox /tmp/glances.html

打开后可见如下界面:

wKioL1ilfELTpCwxAALhdVIESDQ875.png注意:只要原来CentOS 7上的glances进程没有终止,则在CentOS 6上会不断刷新统计数据。



此外,可使用glances作为远程监控工具,不过现在很多企业都是直接部署一个远程监控系统,而不使用glances工具来单个监控。而如果没有部署一个远程监控系统,但又需要在远程收集一些数据时,可使用glances这个工具:

C/S模式下运行glances命令:
(1)服务端模式:
        glances -s -B IPADDR
        
        其中IPADDR为本机用于监听的某地址;
    
(2)客户端模式:
        glances -c IPADDR
        
        其中IPADDR是远程服务器的地址;



dstat命令:

versatile tool for generating system resource statistics

dstat是一个非常精巧的工具,它能获取系统资源使用的统计数据信息,几乎融合了其他进程监控命令的功能;使用dstat可以列表方式显示出cpu、memory、interface、io统计信息,并以不同颜色显示使各种统计信息不易混淆,显示效果非常直观;dstat是新晋命令,已被RedHat收购,因此只需base源即可安装。


命令格式:

dstat [-afv] [options..] [delay [count]]


常用选项:

    -c:显示CPU使用率,包括us,sy,id,wa,hi,si;

    -C #,#,...,total:显示指定CPU的使用率;

    -d:显示磁盘的相关统计数据,包括磁盘读写状态;

    -D sda[#],hda[#],...,total:显示指定的磁盘或磁盘分区的读写状态;

    -g:显示page相关的数据交换速率,即从page写入磁盘的速率以及从磁盘读取数据至page中的速率,是         以内存为中心显示的;

    -m:统计Memory已使用量、剩余量以及用为缓存、缓冲的空间;

    -n:显示Interface的相关统计数据,包括接收和发送数据量;

    -N eth1,eth2...,total:显示指定网卡的相关统计数据;

    -p:显示process的相关统计数据,包括runnable、uninterruptible、new

    -r:显示I/O请求的相关统计数据,包括读、写请求;

    -s:统计显示swap的已使用量和剩余量;

    -y:显示系统内核中断速率和上下文切换速率;

    --aio:显示异步I/O(asynchronous I/O)的相关统计数据;

    --fs:统计文件打开数和inodes数;

    --ipc:显示进程间通信的相关信息;

    --raw:显示raw socket的数量;

    --socket:显示socket的相关统计信息;

    --tcp:显示tcp连接各状态的个数;

    --udp:显示udp监听和活跃的个数;


dstat还支持一些插件,用于实现更为高级的功能:


    --top-cpu:显示最消耗CPU的进程;

    --top-mem:显示最消耗Memory的进程;

    --top-io:显示最占用I/O的进程;

    --top-latency:显示延迟最大的进程;

    


用法示例:

直接执行dstat命令,如图:

wKiom1ilMo7TPQ0dAABo3a0tGlI575.png注意:如果不加任何选项,则默认自带-cdngy这几个选项,即显示CPU、磁盘读/写、网卡、内存页和内核 的相关统计信息;


这是默认输出的信息:


CPU使用率:这一栏可显示出用户进程(us)、内核进程(sys)、空闲时间(idl)、等待IO(wai)、硬中断(hiq)和软中断(siq)分别占用CPU时间的百分比,可以方便地分析CPU目前的状态。例如,当wai值比较大时,说明此时CPU大量时间在等待IO过程,有可能是CPU正在等待I/O设备(磁盘、网卡等)的响应,或者等待磁盘加载数据至内存中。


磁盘统计:这一栏显示的是磁盘或磁盘分区的读、写数据量。


网络统计:这一栏显示的是网卡接收和发送的数据报文的数据量。


内存页统计:这一栏显示的内存页的活动。如果page in(换入)和page out(换出)这两个值比较大,则说明物理内存不够用,并正在使用大量的交换内存。正常情况下,我们希望这两个值为0。


系统内核统计:这一栏显示的是内核处理中断的速率(int)以及上下文切换的速率(csw)。如果这两个值过大,则说明有等待CPU运行的任务队列比较长,有大量的进程造成阻塞,此时CPU负载比较大,可考虑添加CPU的核心数。



显示磁盘分区/dev/sda1的读写速率:

[root@loaclhost ~]# dstat -D sda1


查看CPU的状态:

[root@loaclhost ~]# dstat -c


dstat通常可传递两个参数,分别用于指定刷新时间间隔和显示的次数。例如,查看内存的统计信息,每隔两秒显示1次,一共显示5次:

[root@loaclhost ~]# dstat -m 2 5


分别查看最消耗CPU和最消耗内存的进程名:

[root@loaclhost ~]# dstat --top-cpu --top-mem


查看tcp连接各状态的个数(listen, established, syn, time_wait, close):

[root@loaclhost ~]# dstat --tcp


查看所有socket的统计数据,每隔一秒显示1次,一共显示5次:

[root@loaclhost ~]# dstat --socket 1 5


显示memory (used, buffers, cache, free)和swap (used, free)的统计数据信息,每隔两秒显示1次,一共显示3次:

[root@loaclhost ~]# dstat -m -s 2 3


查看io请求(read,write)、CPU状态(us,sy,id,wa,hi,si)、内核(int,csw)相关统计数据:

[root@loaclhost ~]# dstat -rcy


显示进程间通信相关信息:

[root@loaclhost ~]# dstat --ipc


显示各socket数量以及tcp socket各状态的数量:

[root@loaclhost ~]# dstat --socket --tcp


kill命令:

    terminate a process

    通过向进程发送信号,以实现对进程的管理。


命令格式:

    kill -l [SIGNAL]    #显示当前系统的可用信号;

    kill [-s SIGNAL | -SIGNAL] pid...    #向进程发送信号;


常用信号SIGNAL:

    1) SIGHUP:无须关闭进程而让其重读配置文件;常用于在不重启服务的情况下重读配置;

    2) SIGINT:终止(打断)正在运行中的进程,相当于Ctrl+c;

    9) SIGKILL:强制(暴力地)杀死运行中的进程;

    15) SIGTERM:默认信号,(温柔地)杀死运行中的进程;

    18) SIGCONT:让后台停止的进程继续在后台执行;适合于非交互式的程序;

    19) SIGSTOP:终止正在运行的进程并将其置于后台,相当于Ctrl+z;


信号SIGNAL的标识方法:

    (1) 信号的数字标识,例如:1

    (2) 信号的完整名称,例如:SIGHUP;

    (3) 信号的简写名称,例如:HUP;


总结一下,kill命令向进程发送信号有四种方式:

kill -1 PID    #数字格式
kill -HUP PID    #简写名称
kill -SIGHUP PID    #完整名称
kill -s SIGHUP PID




用法示例:

得到指定信号的数值:

[root@loaclhost ~]# kill -l SIGHUP
1
[root@loaclhost ~]# kill -l HUP
1
[root@loaclhost ~]# kill -l SIGKILL
9
[root@loaclhost ~]# kill -l SIGCONT
18


在不重启服务的情况下重读httpd配置文件:

[root@loaclhost ~]# pidof httpd    #查看httpd的几个进程号;
1934 1933 1932 1931 1930 1929 1928
[root@loaclhost ~]# kill -1 1934    #向进程号1934发送SIGHUP信号;


先用ps查找进程,再用kill杀掉:

[root@loaclhost ~]# ps aux | grep ping | grep -v grep
root       2032  0.1  0.1 147344  1940 pts/1    S+   17:25   0:00 ping www.baidu.com
[root@loaclhost ~]# kill 2032
[root@loaclhost ~]# kill 2032
-bash: kill: (2032) - No such process   #显示错误,因为没有找到该进程,说明该进程已被杀死;
[root@loaclhost ~]#


终止指定用户的所有进程:

[root@loaclhost ~]# ps aux | grep ^Tab    #首先查看用户Tab的相关进程;
Tab        2235  0.0  0.2 116036  2712 pts/2    Ss   17:43   0:00 -bash
Tab        2288  0.0  0.4 151188  4856 pts/2    T    17:43   0:00 vim hello
Tab        2343  0.0  0.1 147344  1944 pts/2    T    17:45   0:00 ping www.baidu.com
Tab        2350  2.0  0.2 116028  2644 pts/2    S+   17:46   0:00 bash
[root@loaclhost ~]# 
[root@loaclhost ~]# kill -9 $(ps -ef | grep ^Tab | awk '{print $2}')
[root@loaclhost ~]#
[root@loaclhost ~]# ps aux | grep ^Tab    #再查看该用户的所有进程;
[root@loaclhost ~]#                       #没有任何显示,说明进程已被杀死;此时终端用户Tab
[root@loaclhost ~]#                        被迫退出bash;


killall命令:

kill processes by name

通过进程名向进程发送信号。


命令格式:

    killall [-SIGNAL] program


用法示例:

杀死主机上所有ping进程:

[root@loaclhost ~]# ps aux | grep ping | grep -v grep    #查看所有ping进程;
root       2592  0.0  0.1 147344  1940 pts/1    S+   17:59   0:00 ping www.baidu.com
root       2593  0.0  0.1 132108  1472 pts/3    S+   17:59   0:00 ping www.google.com
Tab        2594  0.0  0.1 127912  1228 pts/2    S+   17:59   0:00 ping 114.114.114.114
root       2648  0.0  0.1 127912  1224 pts/4    S+   18:00   0:00 ping 223.5.5.5
root       2696  0.1  0.1 147344  1936 pts/5    S+   18:00   0:00 ping mirrors.163.com
[root@loaclhost ~]# killall -9 ping    #杀死所有ping进程;
[root@loaclhost ~]# ps aux | grep ping | grep -v grep    #再次查看是否还有ping进程;
[root@loaclhost ~]#                                      #没有任何显示,说明已杀死;


就先写到这儿吧,其他命令下次补充!j_0063.gif