进程管理:
1、程序和进程的关系:
程序是为了完成某种任务而设计的软件,比如LibreOffice是程序
进程就是运行中的程序;运行中的程序是程序的一个副本,存在着生命周期;
一个运行着的程序,可能有多个进程。尤其是作为服务进程,在为了响应多个访问时会创建多个进程来对其进行服务;
Linux内核存储进程信息的固定格式:task struct;
多个任务的task struct组件的链表:task list;
2、进程分为交互进程(用户、前台进程)、批处理进程和守护进程三类:
Linux内核属于抢占式多任务;
守护进程(daemon)总是活跃的在系统启动过程中启动的进程,跟终端无关;
由于守护进程是一直运行着的,所以它所处的状态是等待请求处理任务;
前台进程:跟终端相关,通过终端启动的进程;
注意:也可以吧在前台启动的进程送往后台,以守护模式运行;
进程的分类2:
CPU-Bound:CPU密集型,占用CPU资源较大;多分CPU资源;
IO-Bound:IO密集型,占用IO资源较大;提高优先级;
3、进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断:interruptable
不可中断:uninterruptable
停止态:stopped暂停于内存中,但不会被调度,除非手动启动之;
僵死态:zombie,例如父进程在结束时没有指定其子进程的管理进程则容易导致其子进程成为僵死态。
4、进程的属性:
进程ID(PID):是唯一的数值,用来区分进程;
父进程和父进程的ID(PPID:parent process ID);
启动进程的用户ID(UID)和所归属的组(GID):
进程状态:状态分为运行R、休眠S、僵尸Z;
进程执行的优先级;
进程所连接的终端名;
进程资源占用:比如占用资源大小(内存、CPU占用量)
5、父进程和子进程:
操作系统启动时,启动的第一个进程在CentOS6中是init,CentOS7中是systemd,由他们来创建进程来完成工作;
父进程和子进程是管理和被管理的关系;
当父进程终止时,子进程也随之而终止。
但子进程终止,父进程并不一定终止。
进程都由其父进程创建,使用fork()系统调用创建;
在进程管理中,当我们发现进程占用资源过多,或无法控制的进程时,应该杀死该进程,以保护系统的稳定安全运行;
6、进程创建:
进程创建存在进程树,内核创建第一个进程init,后续的用户空间的管理工作由init处理,若init在管理用户空间的进程的过程中若需要调用内核空间的资源则向内核申请;
7、进程优先级:
linux属于多任务操作系统,需要运行多个进程;为了响应所有进程的操作,linux将CPU资源划分成时间片,通过分配时间片的方式同时响应多个进程的调用;
为了确保重要的进程能够得到 CPU,这种选择是基于调度优先级 进程的。
使用top命令时,NI列即表示进程的优先级,该列展示了调度优先级或者说每个进程的niceness。niceness的范围一般从-20到19,-20表示调度优先级最高,19表示优先级最低;
进程优先级:
0-139:共分140个;
1-99:实时优先级;数字越大,优先级越高;
100-139:静态优先级;数字越小,优先级越高;
Nice值:
-20,19
对应100,139
在任务队列中创建140个队列,对应140个优先级,相同优先级的进程排在对应的队列中;在进程调度时无需遍历所有进程,只需扫描这140个队列中优先级最高的队列中的首部即可。
[root@localhost ~]# top top - 21:01:12 up 27 min, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 152 total, 1 running, 151 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.0%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1906492k total, 194168k used, 1712324k free, 12332k buffers Swap: 2097148k total, 0k used, 2097148k free, 65336k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19356 1536 1224 S 0.0 0.1 0:01.41 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.02 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.37 migration/1 8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1 9 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/1 10 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 11 root 20 0 0 0 0 S 0.0 0.0 0:01.91 events/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.17 events/1 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
[root@localhost ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 2317 2314 0 80 0 - 27085 wait pts/0 00:00:00 bash 4 R 0 2406 2317 0 80 0 - 27033 - pts/0 00:00:00 ps
niceness的默认值:
从top命令的NI列和ps -l的执行结果可以看出,常规用户所启用进程的niceness的默认值是0;可以运行nice命令且不带任何参数,以此验证系统中的nice值;
使用nice设置优先级:
(1)Linux和Unix系统使用有40个优先级的优先级系统,范围从-20(最高优先级)到19(最低优先级);
(2)常规用户启动的进程优先级一般是0;
(3)ps命令可以使用-l选项显示优先级(例如:nice或NI、level)
(4)nice命令显示我们的默认优先级;
nice 命令还可以用来启动具有不同优先级的进程。使用 -n 或 (--adjustment) 选项时带一个负值可以增加优先级值,
带一个正值将减少优先级值。具有最低优先级值的进程运行时有最高调度优先级,
因此可以这样记忆,增加优先级值对于其他进程而言更好(nice)。
注意,您必须是超级用户(根用户)才能调低优先级值。换句话说,常规用户通常只能增加它们的优先级值。
进程元数据:
内核为系统上的每个进程创建用来创建该进程的元数据结构;
Linux内核存储进程信息的固定格式:task struct(任务结构体);
多个任务的task struct组成的链表:task list(任务列表)
8、进程管理:通过进程管理工具实现;
(1)pstree
pstree - display a tree of processes
(2)ps:process state
ps - report a snapshot of the current processes,报告一个当前所有进程的快照;
ps为我们提供了进程的一次性的查看,它所提供的查看结果并不是动态连续的;如果想对进程进行动态连续的监控,可以使用top、htop等工具;
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中。
ps [options]
选项:支持两种风格:
常用组合:aux
u:以用户为中心组织进程状态信息显示;
a:与终端相关的进程;
x;与终端无关的进程;
[root@localhost ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 19356 1536 ? Ss Aug31 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S Aug31 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Aug31 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S Aug31 0:00 [ksoftirqd/0]
显示结果参数说明:
VSZ:Virtual memory Size,虚拟内存集;
RSS:ReSident Size,常驻内存集;
STAT:进程状态:
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前台进程;
1:多线程进程;
N:低优先级进程;
<: 高优先级进程;
s: session leader,会话创建者;
START:启动时间;
TIME:占用CPU的累积时长;
常用组合:-ef
-e:显示所有进程;
-f:显示完整格式程序信息;
[root@kalaguiyin ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 9月04 ? 00:00:06 /usr/lib/systemd/systemd --switched-root --syste root 2 0 0 9月04 ? 00:00:00 [kthreadd] root 3 2 0 9月04 ? 00:00:00 [ksoftirqd/0] root 5 2 0 9月04 ? 00:00:00 [kworker/0:0H] root 7 2 0 9月04 ? 00:00:00 [migration/0] root 8 2 0 9月04 ? 00:00:00 [rcu_bh] root 9 2 0 9月04 ? 00:00:00 [rcuob/0] root 10 2 0 9月04 ? 00:00:00 [rcuob/1] root 11 2 0 9月04 ? 00:00:00 [rcuob/2] root 12 2 0 9月04 ? 00:00:00 [rcuob/3] root 13 2 0 9月04 ? 00:00:00 [rcuob/4]
常用组合:-eFH
-F: 显示完整格式的进程信息;
-H:以进程层级格式显示进程相关信息;
[root@kalaguiyin ~]# ps -eFH | tail root 1487 1 0 31575 1704 1 9月04 ? 00:00:01 /usr/sbin/crond -n root 1488 1 0 6483 956 1 9月04 ? 00:00:00 /usr/sbin/atd -f root 1505 1 0 21146 2248 0 9月04 ? 00:00:00 login -- root root 2805 1505 0 29036 2792 2 9月04 tty1 00:00:00 -bash root 1992 1 0 23289 2224 1 9月04 ? 00:00:00 /usr/libexec/postfix/master -w postfix 2013 1992 0 23332 3916 2 9月04 ? 00:00:00 qmgr -l -t unix -u postfix 9184 1992 0 23352 3952 1 08:00 ? 00:00:00 cleanup -z -t unix -u postfix 9188 1992 0 22820 4528 2 08:00 ? 00:00:00 local -t unix postfix 9405 1992 0 23315 3892 0 08:11 ? 00:00:00 pickup -l -t unix -u postfix 10160 1992 0 23316 3908 3 08:50 ? 00:00:00 trivial-rewrite -n rewrite -t unix -u
常用组合:-eo,axo;
-o选项表示显示指定的字段;
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -eopid,tt,user,fname,tmout,f,wchan
[root@kalaguiyin ~]# ps -eo pid,tid,ni,pri,stat | tail 9405 9405 0 19 S 9754 9754 0 19 S 9978 9978 0 19 S 10104 10104 0 19 S 10160 10160 0 19 S 10207 10207 0 19 S 10253 10253 0 19 S 10310 10310 0 19 S 10318 10318 0 19 R+ 10319 10319 0 19 S+
字段说明;
ni:nice值;
pri:priority,优先级
psr:processor,CPU:运行在那颗CPU上;
rtptrio:实时优先级;
ppid:父进程的id;
(3)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: 显示其父进程为此处指定的进程的进程列表
(4)pidof:根据进程名获取其pid;
[root@kalaguiyin ~]# pidof bash 2848 2805 953
(5)top:实时显示系统中各个进程的资源占用状况。
内置命令:
排序;
P:以占据的CPU百分比排序;
M:以占据内存百分比排序;
T:以累积占据CPU时长排序;
首部信息显示:
uptime信息:l命令;
tasks及cpu信息:t命令;
cpu分别显示:1(数字)
memory信息:m命令;
选项:
-d #;指定刷新时间间隔,默认为3秒;
-b :以批次方式;
-n # :显示多少批次;
(6)htop ===>原top工具的替代者,功能更为强大;
系统安装时,不自带;需要自行安装,可以使用Fedora的EPEL源,具体操作请参考Linux软件包管理;
选项:
-d #: 指定延迟时间;
u UserName: 仅显示指定用户的进程;
-s COLOMN: 以指定字段进行排序;
命令:
s: 跟踪选定进程的系统调用;
l: 显示选定进程打开的文件列表;
a:将选定的进程绑定至某指定CPU核心;
t: 显示进程树
(7)vmstat:报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。
vmstat [options] [delay [count]]
[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 1651316 44720 71880 0 0 2 1 9 17 0 0 100 0 0
字段说明:
procs:
r:等待运行的进程的个数;
b:处于不可中断睡眠态的进程个数;(被阻塞的队列的长度);
memory:
swpd: 交换内存的使用总量;
free:空闲物理内存总量;
buffer:用于buffer的内存总量;
cache:用于cache的内存总量;
swap:
si:数据进入swap中的数据速率(kb/s)
so:数据离开swap中的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率;(kb/s)
bo: 保存数据至块设备的速率;
system:
n: interrupts, 中断速率;
cs: context switch, 进程切换速率;
cpu:
us :用户空间占据比例
sy ;内核空间占据比例;
id :空闲比例
wa :等待IO完成的时间比例;
st :被偷走的时间比例;
选项:
-s: 显示内存的统计数据 ===》相当于查看/proc/meminfo文件的内容;
(8)dstat: 是vmstat的升级版,拥有更多使用的功能,建议使用;
dstat [-afv] [options..] [delay [count]]
-c: 显示cpu相关信息;
-C #,#,...,total
-d: 显示disk相关信息;
-D total,sda,sdb,...
-g:显示page相关统计数据;
-m: 显示memory相关统计数据;
-n: 显示network相关统计数据;
-p: 显示process相关统计数据;
-r: 显示io请求相关的统计数据;
-s: 显示swapped相关的统计数据;
--tcp
--udp
--unix
--raw :enable raw stats (raw sockets)
--socket 用来显示tcp、udp端口状态;
--ipc :显示ipc消息队列、信号等信息;
--top-cpu:显示最占用CPU的进程;
--top-io: 显示最占用io的进程;
--top-mem: 显示最占用内存的进程;
--top-lantency: 显示延迟最大的进程;
(9)pmap:report memory map of a process
pmap [options] pid [...]
-x: 显示详细格式的信息;
另外一种实现:
# cat /proc/PID/maps
(10)glances:由 Python 编写,使用 psutil 库来从系统抓取信息的基于 curses 开发的跨平台命令行系统监视工具。
以监视 CPU,平均负载,内存,网络流量,磁盘 I/O,其他处理器 和 文件系统 空间的利用情况.
usage:
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
内建命令:
a Sort processes automatically l Show/hide logs c Sort processes by CPU% b Bytes or bits for network I/O m Sort processes by MEM% w Delete warning logs p Sort processes by name x Delete warning and critical logs i Sort processes by I/O rate 1 Global CPU or per-CPU stats d Show/hide disk I/O stats h Show/hide this help screen f Show/hide file system stats t View network I/O as combination n Show/hide network stats u View cumulative network I/O s Show/hide sensors stats q Quit (Esc and Ctrl-C also work) y Show/hide hddtemp stats
常用选项:
-b: 以Byte为单位显示网卡数据速率;
-d: 关闭磁盘I/O模块;
-f /path/to/somefile: 设定输入文件位置;
-o {HTML|CSV}:输出格式;
-m: 禁用mount模块
-n: 禁用网络模块
-t #: 延迟时间间隔
-1:每个CPU的相关数据单独显示;
C/S模式下运行glances命令:
服务模式:
glances -s -B IPADDR
IPADDR: 指明监听于本机哪个地址
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
(11)kill命令:向进程发送控制信号,以实现对进程的管理;
显示当前系统可以信号;
# kill -l
# man 7 signal 获得具体每个信号的帮助信息;
常用信号:
1) SIGHUP: 无须关闭进程而让其重读配置文件;
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c;
9) SIGKILL: 杀死正在运行的进程;
15) SIGTERM:终止正在运行的进程;
18) SIGCONT:继续运行停止的进程;
19) SIGSTOP:停止进程;
其实,关于资源管理(Resource Managenent)的命令还有很多,如:iostat、netstat、mpstat、numstat、ss等,此次就不再一一说明;
后期如果有时间再总结。