内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等特权操作
模式切换(理想状态):70%CPU时间用户模式+30%CPU时间内核模式
进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的存在生命周期的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体,运行中的程序的一个副本;被载入到内存的一个指令集合
进程ID:PID号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承
Linux内核存储进程信息的固定数据结构格式:task struct
多个任务的task struck组件的链表:task list
进程创建:1.引起创建进程的事件
在多道程序环境中,只有(作为)进程(时)才能在系统中运行。因此,为使程序能运行,就必须为它创建进程。导致一个进程去创建另一个进程的典型事件,可以有以下四类:
1) 用户登录
在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入到就绪队列中。
2)作业调度
在批处理系统中,当作业调度程序按照一定的算法调度到某作业时,便将该作业装入到内存,为它分配必要的资源,并立即为它创建进程,再插入到就绪队列中。
3) 提供服务
当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务,例如,用户程序要求进行文件打印,操作系统将为它创建一个打印进程,这样,不仅可以使打印进程与该用户进程并发执行,而且还便于计算出为完成打印任务所花费的时间。
4) 应用请求
在上述三种情况中,都是由系统内核为它创建一个新进程,而这一类事件则是基于应用进程的需求,由它创建一个新的进程,以便使新进程以并发的运行方式完成特定任务。
2.进程的创建过程
一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语create()按下述步骤创建一个新进程。
1) 申请空白PCB。为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
2) 为新进程分配资源。为新进程的程序和数据以及用户栈分配必要的内存空间。显然,此时操作系统必须知道新进程所需要的内存大小。
3) 初始化进程控制块。PCB的初始化包括:
①初始化标识信息,将系统分配的标识符和父进程标识符,填入新的PCB中。
②初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶。
③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常是将它设置为最低优先级,除非用户以显式的方式提出高优先级要求。
4) 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入到就绪队列中。
进程终止
1.引起进程终止的事件
1)正常结束
在任何计算机系统中,都应该有一个表示进程已经运行完成的指示。例如,在批处理系统中,通常在程序的最后安排一条Hold指令或终止的系统调用。当程序运行到Hold指令时,将产生一个中断,去通知OS本进程已经完成。
2)异常结束
在进程运行期间,由于出现某些错误和故障而迫使进程终止。这类异常事件很多,常见的有:越界错误,保护错,非法指令,特权指令错,运行超时,等待超时,算术运算错,I/O故障。
3)外界干预
外界干预并非指在本进程运行中出现了异常事件,而是指进程应外界的请求而终止运行。这些干预有:操作员或操作系统干预,父进程请求,父进程终止。
init:系统的第一个进程
进程:进程之间为父子关系都有其父进程创建(CoW写时复制)
1、系统父进程以fork()方式产生一个一模一样的子进程,这个进程与父进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别码PID
2、然后复制clone()出来的子进程再来运行实际要执行的程序
进程优先级:系统优先级: 数字越小,优先级越高
0-139( CentOS4,5)
各有140个运行队列和过期队列
0-98, 99( CentOS6)
实时优先级: 99-0:值最大优先级最高
静态优先级:100-139
nice值: -20到19,对应系统优先级100-139或99
Image may be NSFW.
Clik here to view.

Image may be NSFW.
Clik here to view.

Big O:时间复杂度,用时和规模的关系
O(1):规模变化但是,耗费时间恒定
O(logn):
O(n)线性:
O(n^2)抛物线:
O(2^n):耗费时间随着规模变大急剧变大
进程相关概念进程内存:
Page Frame(页框):用存储页面数据,存储Page 4k
物理地址空间和线性地址空间
物理地址空间:真实内存空间
线性地址空间:进程虚拟占据全部真实内存空间,而实际是用多少内核给分配多少LRU:Least Recently Used 近期最少使用算法,释放内存
MMU:Memory Management Unit(内存管理单元)负责转换线性和物理地址
常驻内存集:不可被交换的内存空间
虚拟内存集:可以被交换的内存空间
进程间通信机制
IPC: Inter Process Communication
同一主机上
signal(信号)
shm: shared memory(分享内存)
semophore:信号量,一种计数器
不同主机上
rpc: remote procedure call(远程过程调用)
socket(套接字): IP和端口号
进程状态Linux内核:抢占式多任务工作模式
进程类型:
1)守护进程(服务): daemon,由内核在系统引导过程中启动的进程, 和终端无关进程
2)前台进程:跟终端相关,通过终端启动的进程(用户进程)
注意:两者可相互转化
进程状态:
运行态: running
就绪态: ready(可以运行但是没运行)
睡眠态:
1)可中断: interruptable
2)不可中断: uninterruptable
数据从磁盘――>内核内存――>进程内存――>进程处理数据
第一阶段为数据装入
第二阶段为数据I/O
停止态: stopped,暂停于内存中,但不会被调度,除非手动启动
僵死态: zombie,结束进程,父进程结束前,子进程不关闭
系统管理工具
根据进程占用资源的多少可以讲进程分为(进程的分类):
CPU-Bound: CPU密集型(对CPU密集型是对cpu占用率高的进程),非交互
IO-Bound: IO密集型(等待I/O时间长的进程),交互
推荐书籍:《Linux内核设计于实现》、《深入理解Linux内核》
Linux系统状态的查看及管理工具: pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup
init分类
CentOS5:SysV init
CentOS6:upstart
CentOS7:Systemd
/sbin/init
进程信息获取工具 pstree命令pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序识别码或用户名称,则会把系统启动时的第一个程序视为基层,并显示之后的所有程序。若指定用户名称,便会以隶属该用户的第一个程序当作基层,然后显示该用户的所有程序。
使用ps命令得到的数据精确,但数据庞大,这一点对掌握系统整体概况来说是不容易的。pstree命令正好可以弥补这个缺憾。它能将当前的执行程序以树状结构显示。pstree命令支持指定特定程序(PID)或使用者(USER)作为显示的起始。
使用格式:
pstree [-a, arguments] [-c, compact] [-h, highlight-all, -Hpid, highlight-pid pid] [-g] show-pgids] [-l, long] [-n, numeric-sort] [-N, ns-sortns [-p, show-pids] [-s, show-parents] [-S, ns-changes] [-u, uid-changes] [-Z, security-context] [-A, ascii, -G, vt100, -U, unicode] [pid, user]选项:
-a 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c 不使用精简标示法。
-G 使用VT100终端机的列绘图字符。
-h 列出树状图时,特别标明执行的程序。
-H<程序识别码> 此参数的效果和指定"-h"参数类似,但特别标明指定的程序。
-l 采用长列格式显示树状图。
-n 用程序识别码排序。预设是以程序名称来排序。
-p 显示程序识别码。
-u 显示用户名称。
-U 使用UTF-8列绘图字符。
-V 显示版本信息。
[root@localhost ~]# pstreesystemd─┬─ModemManager───2*[{ModemManager}]
├─abrt-dbus───{abrt-dbus}
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─anacron
├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
│ └─3*[{at-spi-bus-laun}]
├─at-spi2-registr───{at-spi2-registr}
├─atd
├─auditd─┬─audispd─┬─sedispatch
││ └─{audispd}
│└─{auditd}
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─caribou───2*[{caribou}]
├─chronyd
├─colord───2*[{colord}]
├─crond
├─cupsd
├─2*[dbus-daemon───{dbus-daemon}]
├─dbus-launch
├─dconf-service───2*[{dconf-service}]
├─2*[dhclient]
├─dnsmasq───dnsmasq
├─evolution-calen───5*[{evolution-calen}]
├─evolution-sourc───2*[{evolution-sourc}]
├─gconfd-2
├─gdm─┬─Xorg
│ ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet}
│ │ │ ├─gnome-settings-───4*[{gnome-settings-}]
│ │ │ ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
│ │ │ │ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}]
│ │ │ │ │ └─2*[{ibus-daemon}]
│ │ │ │ └─6*[{gnome-shell}]
│ │ │ ├─gnome-software───3*[{gnome-software}]
│ │ │ ├─nautilus───3*[{nautilus}]
│ │ │ ├─seapplet
│ │ │ ├─ssh-agent
│ │ │ ├─tracker-extract───13*[{tracker-extract}]
│ │ │ ├─tracker-miner-a───2*[{tracker-miner-a}]
│ │ │ ├─tracker-miner-f───3*[{tracker-miner-f}]
│ │ │ ├─tracker-miner-u───2*[{tracker-miner-u}]
│ │ │ └─3*[{gnome-session}]
│ │ └─2*[{gdm-session-wor}]
│ └─3*[{gdm}]
├─gnome-keyring-d───4*[{gnome-keyring-d}]
├─gnome-shell-cal───4*[{gnome-shell-cal}]
├─gnome-terminal-─┬─bash
│ ├─gnome-pty-helpe
│ └─3*[{gnome-terminal-}]
├─goa-daemon───3*[{goa-daemon}]
├─goa-identity-se───2*[{goa-identity-se}]
├─gsd-printer───{gsd-printer}
├─gssproxy───5*[{gssproxy}]
├─gvfs-afc-volume───2*[{gvfs-afc-volume}]
├─gvfs-goa-volume───{gvfs-goa-volume}
├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}
├─gvfs-mtp-volume───{gvfs-mtp-volume}
├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
├─gvfsd───{gvfsd}
├─gvfsd-fuse───4*[{gvfsd-fuse}]
├─gvfsd-metadata───{gvfsd-metadata}
├─gvfsd-trash───2*[{gvfsd-trash}]
├─ibus-x11───2*[{ibus-x11}]
├─ksmtuned───sleep
├─libvirtd───15*[{libvirtd}]
├─lsmd
├─lvmetad
├─master─┬─pickup
│└─qmgr
├─mission-control───2*[{mission-control}]
├─packagekitd───2*[{packagekitd}]
├─polkitd───5*[{polkitd}]
├─pulseaudio───2*[{pulseaudio}]
├─rsyslogd───2*[{rsyslogd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─smartd
├─sshd───sshd─┬─bash
│ └─bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tracker-store───7*[{tracker-store}]
├─tuned───4*[{tuned}]
├─udisksd───4*[{udisksd}]
├─upowerd───2*[{upowerd}]
├─vmtoolsd───{vmtoolsd}
├─vmtoolsd
└─wpa_supplicant ps命令
ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
注意:
内核中的状态信息
内核参数可设置其值从而调整内核运行特性的参数;多数存储在/proc/sys/
状态变量:其用于输出内核中统计信息或状态信息,仅用于查看;
参数:模拟成文件系统类型;
Linux系统各进程的相关信息均保存在 /proc/PID 目录下的各文件中
ps
选项风格:
1 UNIX选项,这可能是分组之前,必须用一个破折号(-)。
2 BSD选项,这可能是分组,不得使用破折号。
3 GNU长选项,之前两个破折号( )。
示例:
[root@localhost ~]# ps aPID TTY STAT TIME COMMAND
1480 tty1 Ss+0:02 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gd
4313 pts/0Ss+0:00 /bin/bash
4367 pts/1Ss 0:00 -bash
4456 pts/2Ss 0:00 -bash
4774 pts/2S+ 0:00 man ps
4785 pts/2S+ 0:00 less -s
4820 pts/1R+ 0:00 ps a
[root@localhost ~]# ps -a
PID TTY TIME CMD
4774 pts/200:00:00 man
4785 pts/200:00:00 less
4821 pts/100:00:00 ps
启动进程的方式:
系统启动过程中自动启动:与终端无关的进程;
用户通过终端启动:与终端相关的进程;
参数说明:
-a 显示所有终端机下执行的进程,除了阶段作业领导者之外。
a 显示现行终端机下的所有进程,包括其他用户的进程。
-A 显示所有进程。
-c 显示CLS和PRI栏位。
c 列出进程时,显示每个进程真正的指令名称,而不包含路径,参数或常驻服务的标示。
-C<指令名称> 指定执行指令的名称,并列出该指令的进程的状况。
-d 显示所有进程,但不包括阶段作业领导者的进程。
-e 此参数的效果和指定"A"参数相同。
e 列出进程时,显示每个进程所使用的环境变量。
-f 显示UID,PPIP,C与STIME栏位。
f 用ASCII字符显示树状结构,表达进程间的相互关系。
o field1,field2… 自定义要显示的字段列表,以逗号分隔
-g<群组名称> 此参数的效果和指定"-G"参数相同,当亦能使用阶段作业领导者的名称来指定。
g 显示现行终端机下的所有进程,包括群组领导者的进程。
-G<群组识别码> 列出属于该群组的进程的状况,也可使用群组名称来指定。
h 不显示标题列。
-H 显示树状结构,表示进程间的相互关系。
-j或j 采用工作控制的格式显示进程状况。
-l或l 采用详细的格式来显示进程状况。
L 列出栏位的相关信息。
-m或m 显示所有的执行绪。
n 以数字来表示USER和WCHAN栏位。
-N 显示所有的进程,除了执行ps指令终端机下的进程之外。
-p<进程识别码> 指定进程识别码,并列出该进程的状况。
p<进程识别码> 此参数的效果和指定"-p"参数相同,只在列表格式方面稍有差异。
r 只列出现行终端机正在执行中的进程。
-s<阶段作业> 指定阶段作业的进程识别码,并列出隶属该阶段作业的进程的状况。
s 采用进程信号的格式显示进程状况。
S 列出进程时,包括已中断的子进程资料。
-t<终端机编号> 指定终端机编号,并列出属于该终端机的进程的状况。
t<终端机编号> 此参数的效果和指定"-t"参数相同,只在列表格式方面稍有差异。
-T 显示现行终端机下的所有进程。
-u<用户识别码> 此参数的效果和指定"-U"参数相同。
u 以用户为主的格式来显示进程状况。
-U<用户识别码> 列出属于该用户的进程的状况,也可使用用户名称来指定。
U<用户名称> 列出属于该用户的进程的状况。
v 采用虚拟内存的格式显示进程状况。
-V或V 显示版本信息。
-w或w 采用宽阔的格式来显示进程状况。
x 显示所有进程,不以终端机来区分。
X 采用旧式的Linux i386登陆格式显示进程状况。
-y 配合参数"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位
-<进程识别码> 此参数的效果和指定"p"参数相同。
cols<每列字符数> 设置每列的最大字符数。
columns<每列字符数> 此参数的效果和指定" cols"参数相同。
cumulative 此参数的效果和指定"S"参数相同。
deselect 此参数的效果和指定"-N"参数相同。
forest 此参数的效果和指定"f"参数相同。
headers 重复显示标题列。
help 在线帮助。
info 显示排错信息。
lines<显示列数> 设置显示画面的列数。
no-headers 此参数的效果和指定"h"参数相同,只在列表格式方面稍有差异。
group<群组名称> 此参数的效果和指定"-G"参数相同。
Group<群组识别码> 此参数的效果和指定"-G"参数相同。
pid<进程识别码> 此参数的效果和指定"-p"参数相同。
rows<显示列数> 此参数的效果和指定" lines"参数相同。
sid<阶段作业> 此参数的效果和指定"-s"参数相同。
tty<终端机编号> 此参数的效果和指定"-t"参数相同。
user<用户名称> 此参数的效果和指定"-U"参数相同。
User<用户识别码> 此参数的效果和指定"-U"参数相同。
version 此参数的效果和指定"-V"参数相同。
widty<每列字符数> 此参数的效果和指定"-cols"参数相同。
ps命令能够看到进程的线程
例如带有[]的即为内核的线程常用命令组合之一
#ps axu
[root@localhost ~]# ps axuUSERPID %CPU %MEMVSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 125948 6720 ?Ss 13:10 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ?S13:10 0:00 [kthreadd]
...
USER:发起进程用户
PID:进程编号
%CPU:使用CPU积累时间
%MEM:内存空间占用比率
VSZ(Virtual memory SiZe):虚拟内存集(即真正占用内存;线性内存)(占用虚拟内存大小)注意:不是swap!
RSS(ReSident Size):常驻内存集(不可以存放在交换内存中的)
TTY:终端
STAT:状态
R: running(运行态)
S: interruptable sleeping(可中断睡眠态)
D: uninterruptable sleeping(不可中断睡眠态)
T: stopped(停止态)
Z: zombie(僵死态)
+: 前台进程
l: 多线程进程
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
常用组合之二
#ps -ef
[root@localhost ~]# ps -efUID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:10 ?00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 2
root 2 0 0 13:10 ?00:00:00 [kthreadd]
...
UID:进程发起用户
PID:进程号
PPID:父进程的进程号
注意:进程号存在0号,init的父进程,过渡进程,系统启动完终止
C:cpu占用百分比
STIME:启动时间
TTY:与何终端相关
TIME:累计运行时间
CMD:启动进程命令
常用组合之三
#ps -eFH
[root@localhost ~]# ps -eFHUID PID PPID CSZ RSS PSR STIME TTY TIME CMD
root 2 0 0 0 0 0 13:10 ?00:00:00 [kthreadd]
root 3 2 0 0 0 0 13:10 ?00:00:00 [ksoftirqd/0]
root 6 2 0 0 0 0 13:10 ?00:00:00 [kworker/u256:0]
CMD列:缩进级别相同的,同一个级别
PSR:运行在那颗cpu上
常用组合之四
#ps -eo
#ps axo
常用field:pid,ni(nice值),prl(prlority优先级),psr(运行在那颗cpu上),pcpu(cpu利用率),stat(状态),comm(进程发起命令),tty(与何终端相关),ppid(父进程号)
示例:
# ps axo pid,comm,pcpu //查看进程的PID、名称以及CPU 占用率
# ps axo pid,comm,pcpu sort=pcpu // sort 参数以pcpu 为对象对
[root@localhost ~]# ps axo pid,commandPID COMMAND
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 [kthreadd]
3 [ksoftirqd/0]
6 [kworker/u256:0]
7 [migration/0]
...
[root@localhost ~]# ps -eo pid,command
PID COMMAND
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 [kthreadd] 进程搜索工具 pgrep与pkill命令
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。即通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。
使用格式:
pgrep [options] pattern pkill [options] pattern选项:
-u uid:显示生效用户的进程
-U uid:显示用户启动的进程
-t TERMINAL:与指定的终端相关的进程;
-l:显示进程名;
-a:显示完整格式的进程名
-p pid:显示进程对应的子进程
pidof命令pidof命令用于查找指定名称的进程的进程号id号。
按确切的程序名称: /sbin/pidof
使用格式:pidof <进程名>
选项:
-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。
[root@localhost ~]# pidof bash4456 4367 4313 896 进程管理工具 top命令
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。
使用格式:
top -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols] [root@localhost ~]# toptop - 17:27:00 up 4:16, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 422 total, 2 running, 420 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1868664 total, 674092 free, 544128 used, 650444 buff/cache
KiB Swap: 4194300 total, 4194300 free,0 used. 1106604 avail Mem
PID USER PR NIVIRTRESSHR S %CPU %MEM TIME+ COMMAND
3242 root 20 0 377552 18184 14528 S 0.7 1.0 0:19.19 vmtoolsd
6283 root 20 0 146404 2316 1428 R 0.7 0.1 0:02.88 top
3132 root 20 0 1473280 165536 47824 S 0.3 8.9 0:11.92 gnome-shell
3705 root 20 0 0 0 0 S 0.3 0.0 0:13.26 kworker/0:0
1 root 20 0 125948 6720 3920 S 0.0 0.4 0:04.13 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
每一行代表的含义:
第一行:
当前的系统时间;即:top 17Image may be NSFW.
Clik here to view.

00
系统启动到现在所经过的时间;即:up 4:16
当前已经登录系统的用户数;即4 users
系统在1,5,15分钟的平均负载,值越小表示系统越空闲,如果高于cpu数量,就需要注意当前系统负载过高;即:load average: 0.00, 0.01, 0.05
此行显示的信息等同于uptime命令显示信息
uptime命令:显示系统时间、运行时长、当前上线人数及平均负载
过去1分钟、5分钟和15分钟的各自平均负载,一般不会超过1
平均负载:指在特定时间间隔内运行队列中的平均进程数。即等待运行的进程队列的长度;
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。 如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
如果linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
[root@localhost ~]# uptime18:29:46 up 5:19, 4 users, load average: 0.00, 0.01, 0.05
第二行
显示的是目前进程的总量与个别程序在什么状态(running、sleeping、stopped、zombie)
注意:最后的zombie数值不为0,需要具体查看那个进程处于僵死状态
例如:
Tasks: 422 total(进程总量),
2 running(运行态进程量),
420 sleeping(睡眠态进程量),
0 stopped(停止态进程量),
0 zombie(僵死态进程量)
第三行
显示的是CPU的整体负载,如果是多核心的cpu,可以按下数字键1来切换成不同的CPU的负载均衡;
us:用户空间(用户进程占据的cpu百分比)
sy:内核空间(用于运行内核占据的cpu百分比)
ni:调整nice时间用户进程空间所改变过优先级的进程占用CPU的百分比
id:空闲cpu的百分比
wa:等待IO花费时间
hi:硬件中断占用cpu的百分比
si:软件中断(模式切换)占用cpu的百分比
st:虚拟机偷走的时间百分比
cs:处理上下文(进程)切换占用的cpu的百分比
第四行
表示物理内存的使用情况
第五行
表示交换分区的使用情况
Mem: 4147888k total[物理内存总量] 2493092k used[使用的物理内存总量] 1654796k free[空闲内存总量] 158188k buffers[用作内核缓存的内存量] Swap: 5144568k total[交换区总量] 56k used[使用的交换区总量] 5144512k free[空闲交换区总量] 2013180k cached[缓冲的交换区总量]第六行:这里默认显示空白行,当在top程序当中输入命令时,显示状态的地方,这里可以输入的命令有:
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息: l命令
tasks及cpu信息: t命令
cpu分别显示: 1 (数字)
memory信息: m命令
退出命令: q
修改刷新时间间隔: s 输入数字
终止指定进程: k
保存文件: W
第七行
PID (Process Id):任务的进程ID
USER (User Name):进程所有者名称
PR (Priority):优先级,越小优先级越高
NI:Nice的简写,与Priority有关,也是越小越早被运行;
VIRT:进程需要的虚拟内存大小,而非使用的虚拟内存大小
RES:进程当前使用的内存大小,不包括swap
SHR:进程与其他进程共享的内存大小,可以通过RES-SHR来计算进程所占用的物理内存大小
S (Process Status):进程状态
%CPU (CPU usage):CPU使用率
%MEM (Memory usage (RES)):内存使用率
TIME+ (CPU Time, hundredths):CPU使用时间的累加,精确到秒
PPID (Parent Process Pid):父任务的进程ID
RUSER (Real User Name):任务的所有者真实名称
UID (User Id):任务所有者ID
GROUP (Group Name):任务所有者群组名
TTY (Controlling Tty):终端
选项:
-d #: 指定刷新时间间隔,默认为3秒
-b: batch,以批次(屏幕)方式显示
-n #: 显示多少批次
htop命令htop是一款运行于Linux系统监控与进程管理软件,用于取代Unix下传统的top。与top只提供最消耗资源的进程列表不同,htop提供所有进程的列表,并且使用彩色标识出处理器、swap和内存状态。
用户一般可以在top无法提供详尽系统信息的情况下选择安装并使用htop。比如,在查找应用程序的内存泄漏问题时。与top相比,htop提供更方便、光标控制的界面来杀死进程。
htop命令与top使用上没区别
需从Fedora-EPEL源安装
命令行选项:
-d # delay=DELAY 设置延迟更新时间,单位秒
-u user=USERNAME 只显示一个给定的用户的进程
-s sort-key COLUME: 以指定字段进行排序;
-C no-color 使用一个单色的配色方案
-p pid=PID,PID… 只显示给定的PIDs
下面是 F1~F10 的功能和对应的字母快捷键。
Image may be NSFW.
Clik here to view.

htop界面子命令:
交互式命令(INTERACTIVE COMMANDS)
上下键或PgUP, PgDn 选定想要的进程,左右键或Home, End 移动字段,当然也可以直接用鼠标选定进程;
Space 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程
U 取消标记所有进程
s 选择某一进程,按s:用strace追踪进程的系统调用
l 显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
I 倒转排序顺序,如果排序是正序的,则反转成倒序的,反之亦然
a (在有多处理器的机器上)设置 CPU affinity: 标记一个进程允许使用哪些CPU
u 显示特定用户进程
M 按Memory 使用排序
P 按CPU 使用排序
T 按Time+ 使用排序
F 跟踪进程: 如果排序顺序引起选定的进程在列表上到处移动,让选定条跟随该进程。这对监视一个进程非常有用:通过这种方式,你可以让一个进程在屏幕上一直可见。使用方向键会停止该功能。
K 显示/隐藏内核线程
H 显示/隐藏用户线程
Ctrl-L 刷新
Numbers PID 查找: 输入PID,光标将移动到相应的进程上
内存工具 vmstat命令vmstat命令的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。
vmstat [options] [delay [count]]选项:
-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态;
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。
参数
delay(事件间隔):状态信息刷新的时间间隔;
count(次数):显示报告的次数。
vmstat 2 5
Image may be NSFW.
Clik here to view.

字段说明:
Procs(进程)
r: 等待运行的进程的个数,和核心数有关,CPU上等待运行的任务的队列长度;这个值也可以判断是否需要增加CPU。(长期大于1)
b: 处于不可中断睡眠态的进程个数(被阻塞的队列的长度)(等待IO的进程数量)。
Memory(内存)
swpd: 使用虚拟内存总量,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存总量。
buff: 用作缓冲的内存总量。
cache: 用作缓存的内存总量,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。
Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存。数据速率(kb/s)
so: 每秒写入交换区的内存大小,由内存调入磁盘。数据速率(kb/s)
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
IO(现在的Linux版本块的大小为1kb)
bi: 从块设备读入数据到系统的速率(kb/s),每秒读取的块数
bo: 保存数据至块设备的速率,每秒写入的块数 (kb/s)
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
system(系统)
in: interrupts, 中断速率,每秒中断数,包括时钟中断。
cs: context switch, 进程切换速率,每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
注意:系统调用是基于软中断,与硬件相关则是硬中断。
CPU(以百分比表示)
us: 用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
wa: IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比
st(stolen):被虚拟机偷走的时间
pmap命令pmap命令用于报告进程的内存映射关系
pmap [options] pid […]-x: 显示详细格式的信息;
-d:显示设备格式;
-q:不显示头尾行;
pid:进程号:指定需要显示内存映射关系的进程号,可以是多个进程号。
示例:
Image may be NSFW.
Clik here to view.

另外一种实现:
cat /proc/PID/maps
系统监控工具 glances命令一个跨平台curses-based监控工具
需要依赖EPEL源安装
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [ password] [-t refresh] [-f file] [-o output]内建命令:
a 自动排序
c 根据CPU使用率排序
m 根据内存占用比排序
p 根据进程名字排序
i 显示进程通过I/O比率
d 显示/隐藏硬盘I/O状态
f 显示/隐藏文件系统状态
n 显示/隐藏network状态
s 显示/隐藏sensors状态
y 显示/隐藏hddtemp状态
l 显示/隐藏日志
b 网络I/O的字节或位
w 删除警告日志
x 删除警告和严重级别的日
1 全局CPU或者每个CPU的状态
h 显示/隐藏帮助会话
t 组合网络I/O视图
u 累计网络I/O视图
z 显示/隐藏进程列表
q 退出(Esc和ctrl c也可以)
常用选项:
-b: 以Byte为单位显示网卡数据速率
-d: 关闭磁盘I/O模块
-f /path/to/somedir: 设定输入文件位置
-o {HTML|CSV}:输出格式
-m: 禁用mount模块
-n: 禁用网络模块
-t #: 延迟时间间隔
-1:每个CPU的相关数据单独显示
C/S模式下运行glances命令
服务模式:
glances -s -B IPADDR
IPADDR: 指明监听的本机某地址
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
示例
#glances -f /dir -o HTML
可以将glances导出的信息已HTML形式保存,并且用浏览器查看,只要不删除,刷新即可查看最新信息
dstat命令dstat命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具。与sysstat相比,dstat拥有一个彩色的界面,在手动观察性能状况时,数据比较显眼容易观察;而且dstat支持即时刷新,譬如输入dstat 3即每三秒收集一次,但最新的数据都会每秒刷新显示。和sysstat相同的是,dstat也可以收集指定的性能资源,譬如dstat -c即显示CPU的使用情况。
标准使用格式:
dstat [-afv] [options..] [delay [count]]直接使用dstat,默认使用的是-cdngy参数,分别显示cpu、disk、net、page、system信息,默认是1s显示一条信息。可以在最后指定显示一条信息的时间间隔,如dstat 5是没5s显示一条,dstat 5 10表示没5s显示一条,一共显示10条。
选项:
-c:显示CPU系统占用,用户占用,空闲,等待,中断,软件中断等信息。
-C 0,3,total:当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0和cpu1的信息。
-d, disk:显示磁盘读写数据大小。
-D total,hda:统计指定磁盘或汇总信息
-g:显示页面使用情况。
-i, int 显示中断统计
-I 5,10 统计系统负载情况,包括1分钟、5分钟、15分钟平均值
-l, load 显示系统负载情况。
-m mem:显示内存使用情况。