进程的基本概念:html
进程能够理解成运行中的程序的一个副本。程序经过内核调度运行起来成为一个进程,并由内核负责调度其运行于CPU之上以执行程序中的一部分或所有代码,所以进程是运行中的动态实体。而程序是放在文件系统上的一个文件,只要不删除将永久存在,而进程是有生命周期的,每一个进程都有建立、运行、结束这一时间段。同一个程序的代码能够被复制多份并由内核调度成多个进程运行,所以可称为运行中的程序的一个副本。node
进程调度:算法
进程管理中最重要的一部分是进程调度,可理解成对各个进程运行时的各类细节的安排和管理。当文件系统上一个可执行程序文件被触发并经过内核调度运行为一个进程时,进程中的指令、数据以及进程相关的属性信息(例如进程的属主、属组、PID等)被内核加载至内存空间中,而指令须要运行在CPU之上,此时CPU中的寄存器可记录正在运行中的指令的状态,例如正在取指令、执行指令、加工数据、取数据...,其中指令指针寄存器IP用于存放下一条要执行的指令的内存地址。shell
可是须要CPU运行的有众多进程而不仅有一个进程,所以内核将CPU切分为多个时间片,并负责将这多个时间片按照优先级分配给各个进程。当一个进程在某一时间片运行与CPU上时,这个时间片就是该进程容许运行的时间,一旦过了这个时间片,该进程将被中断,这时内核把这个进程的中间状态信息按照固定的格式存储于内存中,从新调度另外一个进程运行于CPU之上,接着,CPU中用于存放进程状态相关数据将被下一个进程所覆盖。其中,将进程的相关状态信息存储于内存中这一过程称为保存现场,而Linux内核存储进程状态信息是存储进具备固定格式的结构体的,这个结构体就是task struct,多个任务(进程)的结构体(task struct)组成链表结构(task list),根据组成方式的不一样有单向链表结构、双向链表结构、循环链表结构、双向循环列表结构等。打个比方,咱们盛酒水须要用坛子,而这个固定结构的容器--坛子,就是结构体,总不能用地板装酒水吧?而这些坛子按照必定的组织排列起来的结构可类比为链表结构。apache
须要注意的是,当CPU上的某一时间片结束后,内核会调度另外一个进程运行于CPU之上,而问题是内核该如何从众多等待运行的进程中挑选出一个进程并使其运行于CPU上呢?为了在调度进程时明确哪一个进程优先执行,哪一个进程后执行,须要用进程优先级来作判断。进程优先级范围是0-139,分为实时优先级(1-99)和静态优先级(100-139),其中实时优先级与内核执行的系统管理操做有关,用户不可对实时优先级进行调整;而用户能够调整的是静态优先级(可经过nice值进行调整),普通用户只可调低不可调高,只有系统管理员才可随意调整。所以,内核是将进程优先级来做为调度进程次序的依据的,但由此内核首先必须知道各个进程的属性(优先级),所以在每次调度进程执行时总得遍历内存上全部结构体中的信息,这将会消耗掉大量的时间。
编程
Linux的2.6版本内核经过精巧的设计解决了这一问题:将全部进程排成140个队列,每一个队列对应一个优先级,每一个进程归属至其优先级的队列中。而每次内核调度进程执行时只需扫描这140个队列的首部,并从这些队列中挑选出一个进程出来执行便可。这样一来,不管进程有多少个,内核都是经过扫描140个队列首部来实现快速明确调度哪一个进程执行于CPU上,所以调度时间不会随进程数量而改变。内核的这种工做模式基于的算法符合程序界的Big O中的O(1)理想模型,即意味着随着算法复杂度的增长,算法解决问题(这里是进程调度速度问题)的时间不会变化。
小程序
但这样一来又有一个问题,当一个进程在一个时间片执行完以后应该如何归队呢?在Linux中,进程按照优先级排出队列,而每一个队列内部又分为运行队列和过时队列,实际上内核就是经过扫描各个运行队列首部来作判断的,而进程在CPU执行以后返回过时队列中,而运行队列继续等待内核的调度;一旦运行队列中的进程所有执行完毕(每一个进程都在CPU上轮流执行了一遍),这时运行队列将转变为过时队列,而原来的过时队列则转变为运行队列等待内核再次调度,重复上述逻辑。vim
进程建立:浏览器
主机开机后,首先将内核加载至内存中,在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进程对应的目录:
经过参数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处于高负载状态 |
②第2、三行为进程和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 id | idle,空闲时间百分比 |
0.0 wa | 等待IO过程消耗的时间百分比 |
0.0 hi | hardware interrupt,处理硬件中断所占用的CPU时间百分比 |
0.0 si | sofeware interrupt,处理软中断所占用的CPU时间百分比 |
0.0 st | stolen,被虚拟化程序所偷走的CPU时间百分比,即虚拟CPU等待实际CPU的时间的百分比 |
③第4、五行为内存信息(单位: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 total | swap分区总量 |
2097148 free | 空闲的swap分区总量 |
0 used | 已使用的swap分区总量 |
599148 avail Mem | 可利用的空间,大体由'free'和'buff/cache'相加而得 |
进程信息:
PID | 进程号 |
USER | 运行进程的用户名 |
PR |
进程优先级 |
NI | Nice值 |
VIRT | 虚拟内存集 |
RES | 常驻内存集 |
SHS | 共享内存空间 |
S | 进程状态 |
%CPU | 进程占用CPU时间的百分比 |
%MEM | 进程占用内存空间的百分比 |
TIME+ | 进程累积占用的CPU时间 |
COMMAND | 启动进程的命令程序名 |
使用命令'1',可在首部字段中显示全部CPU的状态信息:
注意:在CentOS 6和CentOS 7上的top首部字段略有不一样:
在CentOS 6上:
在CentOS 7上:
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
打开界面以下:
点击F1键可查看帮助:
键入t命令,以层级关系显示出各进程关系:
仅显示用户apache的相关进程:
方式一:
[root@localhost ~]# htop -u apache
显示如图:
方式二:
在交互式界面使用'u'命令:
将系统上的全部ping进程kill掉:
方法有不少中,能够经过F3键进程搜索或者经过F4键进行过滤匹配到并删除之,这里介绍用标记的方式kill掉ping进程:
再经过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的个数; |
||
memory | swpd | 已使用的交换内存总量 |
free | 空闲的物理内存总量 | |
buff | 用于缓冲区(buffer)的内存总量 | |
cache | 用于缓存区(cache)的内存总量 | |
注意:若是swpd不为0,而so长期为0,这种状况不会影响系统性能;若是free很小,而si、so也很小,那么系统性能这时也不会受到影响; |
||
swap | si | 数据进入swap中的传输速率(kb/s) |
so | 数据离开swap的传输速率(kb/s) | |
注意:若是si、so这2个值长期都大于0,那么系统性能会受到影响; |
||
io | bi | 从块设备加载数据至系统的速率(kb/s) |
bo | 保存数据至块设备的速率(kb/s) |
|
注意:在进程随机磁盘读写时,若是bi、bo这2个值越大(如超过1024),则说明系统等待IO过程消耗的时间不少,这时会影响系统性能; |
||
system | in | interrupts,中断速率 |
cs | context switch,上下文切换速率 | |
注意:若是in、cs这2个值越大,则内核消耗CPU的时间越多; |
||
cpu | us | user space,用户空间进程占用CPU时间的百分比 |
sy | system,内核进程占用CPU时间的百分比 | |
id | idle,空闲时间百分比 | |
wa | wait,等待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
打开界面以下:
每颗CPU的统计数据信息都单独显示:
[root@loaclhost ~]# glances -1
各颗CPU显示以下:
将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
打开后可见以下界面:
注意:只要原来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命令,如图:
注意:若是不加任何选项,则默认自带-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 ~]# #没有任何显示,说明已杀死;