马哥学习----李洋个人笔记----进程管理

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能

什么是进程? 进程是运行中的程序的一个副本,是被载入内存的一个指令集合,进程的特点

1 进程ID(Process ID,PID)号码被用来标记各个进程
2 UID、GID、和SELinux语境决定对文件系统的存取和访问权限,
3 通常从执行进程的用户来继承
4 存在生命周期

任务结构:Linux内核存储进程信息的数据结构格式
任务列表:多个任务的的task struct组成的链表

进程的创建:
init是第一个进程,其余所有进程都是基于它来创建的,即父子关系。
进程下面可以有多个线程,也可以没有。
进程:都由其父进程创建,CoW fork(), clone()

进程内存:进程是由内存来处理的,当处理的进程大小超过了内存总量时候,可以通过如下方式来完成处理:
1 LRU(最少使用) 通过减少近期最少使用的算法,来释放内存 物理地址空间和线性地址空间

2 MMU(内存管理单元)大体上是将进程拆分为小块,暂时放在物理硬盘的效果。这样MMU
就 负责转换线性(进程地址)和物理地址(硬盘上的)

3 TLB(转移后背缓冲器) 相当于MMU的翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存。

LRU的算法:假设进程块数之后三个,存在多个进程任务时候,取舍关系如下:
假设进程的序列为 4 3 4 2 3 1 4 2,每次调入一个进程。而物理块只有3个,则
第1轮4调入内存 这时内存空间为 4
第2轮3调入内存 这时内存空间为 3 4
第3轮4调入内存 这时内存空间为 4 3
第4轮2调入内存 这时内存空间为 2 4 3
第5轮3调入内存 这时内存空间为 3 2 4
第6轮1调入内存 这时内存空间为 1 3 2
第7轮4调入内存 这时内存空间为 4 1 3
第8轮2调入内存 这时内存空间为 2 4 1

依次循环~
进程可以在同一进程和不同主机之间调用,
同一主机的进程: signal:信号 不同主机:rpc: remote procedure call 远程过程调用

shm: shared memory 共享内存 socket: IP和端口号

semaphore:信号量,一种计数器 远程调用进程需要RPC服务来支持。

各个服务器都有自己的默认端口号,比如:
web 的默认端口号 80
ftp 的默认端口号 21
ssh 的默认端口号 22
telnet 的默认端口号 23
pop 的默认端口号 110

进程的种类:
守护进程: 可以理解为服务,通常在后台一直在运行着。在系统引导过程中启动的进程,它们和终端无关。
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化

进程状态:
运行态:running
就绪态:ready
睡眠态分为两种:
可中断:interruptable 比如 sleep命令。
不可中断:uninterruptable 属于暂时停止的。
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭

进程的分类: CPU-Bound:CPU密集型,非交互的 以及 IO-Bound:IO密集型,交互的 两种

Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap,vmstat, dstat, kill,
pkill, job, bg, fg, nohup等等。

pstree命令: pstree - display a tree of processes 显示进程树
pstree -p 显示进程树的同时显示进程号
ps: process state 进程状态
ps - report a snapshot of the current processes 报告当前进程的快照
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

适用ps来查看进程信息 ps [OPTION]... 支持三种选项:一般经典用法 ps axu
1 UNIX选项如-A-e
2 BSD选项如a
3 GNU选项如--help
选项:默认显示当前终端中的进程
a 选项包括所有终端中的进程
x 选项包括不链接终端的进程
u 选项显示进程所有者的信息
f 选项显示进程的父进程 用符号将父子关系的连接起来
k|--sort 属性 对属性排序
o 属性… 选项显示定制的信息pid(进程号)、comm(所执行的指令)、%cpu(cpu占用率)、%mem(内存占用率)、
state(进程状态)、tty(图形终端编号)、euser(内核用户)、ruser(root用户)
使用 ps axo 之后,所列出的进程信息格式为:USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ,
VSZ: 占用的虚拟内存大小
RSS: 占用的实际内存大小
STAT: 该进程的状态:
START: 进程开始时间
TIME: 进程执行的时间
进程的状态STAT有如下几种状态:
R:运行状态
S: 睡眠状态
D: 不可终端的睡眠状态
T: 跟踪/停止状态
Z: 僵尸进程
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程

实验,利用 ps axo %cpu,%mem,pid,comm来显示,CPU占用率最高的前十个进程

ps axo %cpu,%mem,pid,comm |sort -nr |grep -v COMMAND |head

sort –n 按数字排序,-r待倒序。grep –v 过滤掉指定的关键字。

进程的优先级:
系统优先级:数字越小,优先级越高,centos4和5中 0--139 各有140个运行队列和过期队列
实时优先级: 99-0 值最大优先级最高 centos6中,0-98 有99个,并且nice值:-20到19,对应系统优先级100-139或99

进程的优先级:通过pri的值来决定的,值越小,优先级越高。但是pri的值是写在内核中的,无法修改,只能通过修改nice的值来实现。默认pri的值为80,nice的值为0.每个进程都有一个pri值和nice值,如果人为的给nice的值设为负数,那么与之配对的pri值必然比默认值小,这样对应进程的优先级就会提高了。举例: 最终pri=默认pri+修改后的nice.

nice值:进程优先级调整命令
nice 的格式 : 选项,命令,加变量.
静态优先级:100-139 进程默认启动时的nice值为0,优先级为120

普通用户不能将nice值设置为负值,(也就是只能比默认值大)
只有root用户才能降低nice值(提高优先性).

nice和renice的区别:
1 nice是进程将要运行时设置的值 2 nice是运行完后修改的值

nice -n -20 ping 172.18.0.1 # renice -n -20 $(pidof ping)

平时工作,如果想找到具体的某个进程,最灵活的方式为:

ps 选项 | 其它命令

而我们要查看具体的信息:比如那些进程跟那个用户有关.那些进程与终端有关等等时,就需要用到搜索命令了.
之前学到了文本搜索工具 grep(基本正则) egrep(扩展正则) fgrep(不用正则)
这些,接下来是搜索进程的pgrep,格式如下:

按预定义的模式:pgrep 格式:
pgrep [options] pattern(模式)

–u uid: effective user生效者,指的是那些进程与这个用户相关

pgerp –u username/uid 查看指定用户所运行的所有进程的进程号

pgerp -lu username/uid 查看指定用户所运行的所有进程的进程号及进程名

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

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

pgrep -t 终端名 查看指定终端所运行的所有进程的进程号

pgrep –lt终端名 查看指定终端所运行的所有进程的进程号及进程名

-l: 显示进程名 辅助选项,一般跟其他选项 u t 结合使用,单独使用无效果

-a: 显示完整格式的进程名
跟其他选项配合使用,只有centos7里面有,centos6上没有

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

grep –p N

所有跟进程号为N的子进程都会被列出来.

按确切的程序名称:pidof 格式:
pidof 进程名 显示指定进程的进程号

pidof /bin/bash

3309 793 列出与/bin/bash有关的进程号.

系统工具uptime
uptime 显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、 10分钟的平均负载,一般不会超过1)
系统平均负载: 指在特定时间间隔内运行队列中的平均进程数
通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用

进程管理工具 top:有许多内置命令:
比如,排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:

直接top命令后,显示的内容解析

第一行:
top - 21:15:47 up 7:15(截止到21:15:47共计登录了7小时15分)
2 users(共两个用户) load average: 0.00, 0.01, 0.05(平均负载在1,5,15分钟内分别为 0.00,0.01,0.05)

第二行:
Tasks: 171 total(共计171个进程数) 1 running(1个正在运行的)170 sleeping(170个睡眠状态的) 0 stopped(0个停止的进程),0 zombie(0个僵尸进程.)

第三行:
Cpu(s)表示 0.0%us(用户空间占用CPU百分比) ,0.2%sy(内核空间占用CPU百分比) 0.0%ni( 用户进程空间内改变过优先级的进程占用CPU百分比), 99.8%id(空闲CPU百分比,假设电脑是4核CPU,一个进程只能占据一个核心当其中给一个完全占满后,这里会显示75%,即还有三个核可以使用), 0.0%wa(等待输入输出的CPU时间百分比), 0.0%hi( CPU服务于硬件中断所耗费的时间总额), 0.0%si(CPU服务软中断所耗费的时间总额), 0.0%st(虚拟机被管理程序偷去的CPU时间[如果当前处于一个管理程序下的vm,实际上管理程序也是要消耗一部分CPU处理时间的]

第四行:
Mem: 2038352k total(物理内存总量), 748372k used(使用的物理内存总量), 1289980k free(空闲内存总量), 62696k buffers(用作内核缓存的内存量)

第五行:
Swap:2097148k total(虚拟内存交换区总量),0k used(使用的交换区总量), 2097148k free(空闲交换区总量), 337380k cached(缓冲的交换区总量)

红线上方可以根据需求输入命令,例如:
q 退出命令
s 修改刷新时间间隔:
k 终止指定进程: # kill pid 17174
W 保存文件:
-d #: 指定刷新时间间隔,默认为 3 秒 # top -d 1 隔1秒刷新一次。
-b: 全部显示所有进程
-n #: 刷新多少次后退出

htop命令:选项:相当于top的升级版。输出上面多了颜色显示。
内存工具
vmstat命令:虚拟内存信息。格式:
vmstat [options] [delay [count]] (延迟,数)
选项: -s: 显示内存的统计数据

运行vmstat后显示:按列查看

procs: 下方的
r:可运行(正运行或等待运行)进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)

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

swap:下方的
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s)

io:下方的
bi:从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率

system:下方的
in: 中断速率,包括时钟
cs: 进程切换速率

cpu:下方的
us: 运行非内核代码的时间Time spent running non-kernel code
us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

sy: 运行内核代码的时间Time spent running kernel code
sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
空闲时间百分比
wa: Time spent waiting for IO. 2.5.41前,包括in idle.
IO等待时间百分比
st: Time stolen from a virtual machine. 2.6.11前, unknown.
从虚拟机中偷来的时间

iostat 显示cpu和硬盘的io信息。
-C 显示CPU使用情况

-d 显示磁盘使用情况

-k 以 KB 为单位显示

-m 以 M 为单位显示

-N 显示磁盘阵列(LVM) 信息

-n 显示NFS 使用情况

-p[磁盘] 显示磁盘和分区的情况

-t 显示终端和CPU的信息

-x 显示详细信息

-V 显示版本信息

显示详细信息: iostat –x

第一行..忽略
第二行
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。此项值比较高代表:硬盘存在I/O瓶颈.
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。

硬盘信息行:
rrqm/s:每秒进行 merge 的读操作数目。
r/s: 每秒完成的读 I/O 设备次数。
w/s: 每秒完成的写 I/O 设备次数。
rsec/s: 每秒读扇区数。
wsec/s:每秒写扇区数。
rkB/s: 每秒读 K 字节数。取一半,因为扇区大小为512节
wkB/s:每秒写 K 字节数。同取一半。
avgrq-sz:平均每次设备 I/O 操作的数据大小(扇区)
avgqu-sz: 平均 I/O队列长度。
await:平均每次设备 I/O 操作的等待时间(毫秒)
svctm: 平均每次设备 I/O 操作的服务时间(毫秒)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。

pmap命令:进程对应的内存映射
一般只起查看作用个,通常使用

pmap –x 来查看进程及子进程占用的内存地址及空间大小。

RSS: 占用的记忆体大小(内存)
Mode:映像权限
Mapping:映像支持文件。值为[anon]时表达为已分配内存。
值为[stack]时表达为程序堆栈

远程监控工具:glances

一般用到的是:
glances 服务器 / 客户端工作方式
glances 支持服务器/客户端工作方式,可以实现远程监控。首先假设
服务器 IP 地址:10.0.2.14
客户端 IP 地址:10.0.2.15
确保二者都已经安装好 glances 软件包。
首先在服务器端启动;

glances -s -B 10.0.2.15

glances server is running on 10.0.2.15:61209

可以看到 glances 使用的端口号是 61209,所以用户需要确保防火墙打开这个端口。或者
关闭防火墙 # Iptables stop
下面在客户端使用如下命令连接服务器,首先

glances – c 10.0.2.15

注意左下角显示“Connected to 10.0.2.15”>表示客户端已经连接服务器成功。
通过 glances 输出颜色了解系统性能

绿色表示性能良好,无需做任何额外工作;(此时 CPU 使用率、磁盘空间使用率和内存使用率低于 50%,系统负载低于 0.7)。
蓝色表示系统性能有一些小问题,用户应当开始关注系统性能;(此时 CPU 使用率、磁盘空间使用率和内存使用率在 50%-70% 之间,系统负载在 0.7-1 之间)。
品红表示性能报警,应当采取措施比如备份数据;(此时 CPU 使用率、磁盘空间使用率和内存使用率在 70%-90% 之间,,系统负载在 1-5 之间)。
红色表示性能问题严重,可能宕机;(此时 CPU 使用率、磁盘空间使用率和内存使用率在大于 90%,系统负载大于 5)。、

kill命令: 向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写
显示当前系统可用信号: kill –l,trap -l
常用信号:man 7 signal
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 中止正在运行的进程; 相当于Ctrl+c
3) SIGQUIT: 相当于ctrl+\
9) SIGKILL: 强制杀死正在运行的进程
15) SIGTERM:终止正在运行的进程
18) SIGCONT:将休眠的进程放入后台运行 与SIGSTOP相反,和fg/bg命令一样
19) SIGSTOP:后台休眠 相当于 ctrl+Z
指定信号的方法: (1) 信号的数字标识:1, 2, 9 (2) 信号完整名称:SIGHUP (3) 信号的简写名称:HUP. 一般只写数字编号。
要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。

lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

语法

lsof(选项)
选项

-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;

-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )

lsof -i :21

显示出是那么进程在占用着21号端口

-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。

lsof输出各列信息的意义如下:

COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。
文件描述符列表:

cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX); 库引用
er:FD information error (see NAME column); 信息错误,见NAME列
jld:jail directory (FreeBSD); 监听目录,FreeBSD
ltx:shared library text (code and data); 共享图书馆文本(代码和数据)
mxx :hex memory-mapped type number xx. hex内存映射类型xx
m86:DOS Merge mapped file; DOS Merge映射文件;
mem:memory-mapped file; 内存映射文件
mmap:memory-mapped device; 射设备
pd:parent directory; 父目录
rtd:root directory; 根目录
tr:kernel trace file (OpenBSD 内核跟踪文件
v86 VP/ix mapped file;
0:表示标准输出
1:表示标准输入
2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。
同时在文件状态模式后面,还跟着相关的锁:

N:for a Solaris NFS lock of unknown type; 对于操作系统 NFS锁未知类型
r:for read lock on part of the file; (文件的部分读锁)
R:for a read lock on the entire file;(整个文件的读锁)
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length; 对于任何长度的读和写锁;
U:for a lock of unknown type; 对于一个未知类型的锁
x:for an SCO OpenServer Xenix lock on part of the file;
对于一个操作系统锁,在文件的一部分
X:for an SCO OpenServer Xenix lock on the entire file;
对于操作系统Xenix锁定整个文件
space:if there is no lock. 如果没有锁。

猜你喜欢

转载自blog.51cto.com/13477118/2132255
今日推荐