在操作系统系统中,进程是一个非常重要的概念。
一、Linux中进程的相关知识
1、什么是进程呢?
通俗的来说进程是运行起来的程序。唯一标示进程的是进程描述符(PID),在linux内核中是通过task_struck和task_list来定义和管理进程的。
2、进程的分类
1)根据在linux不同模式下运行分为:
核心态:这类进程运行在内核模式下,执行一些内核指令(Ring 0)。
用户态:这类进程工作在用户模式下,执行用户指令(Ring 3)。
如果用户态的进程要执行一些核心态的指令,此时就会产生系统调用,系统调用会请求内核指令完成相关的请求,就执行的结果返回给用户态进程。
2)按照进程的状态可分为:
运行态:running 正在运行的进程
可中断睡眠态:进程处于睡眠状态,但是可以被中断
不可中断的睡眠态:进程处于睡眠状态,但是不可以被中断
停止态:stoped 不会被内核调度
僵死态:zombie产生的原因是进程结束后,它的父进程没有wait它,所导致的。
3)按照操作的密集程度
CPU密集型:进程在运行时,占用CPU时间较多的进程。
I/O密集型:进程在运行时,占用I/O时间较多的进程。
通常情况下,I/O密集型的优先级要高于CPU密集型。
4)按照进程的处理方式
批处理进程:
交互式进程:
实时进程:
3、进程的优先级
进程的有优先级,是用0-139数字来表示的,数字优先级从小到大依次是:0-99,139-100。
优先级分为2类:
实时优先级:0-99,是由内核维护的
静态优先级:100-139,可以使用nice来调整,nice值的取值范围是[-20,19),分别对应100到139。nice默认值是0。
动态优先级:由内核动态维护,动态调整。
二、进程的管理工具
1、pstree命令 查看进程数。 常用用法如下:
#p#
2、ps 命令 查看进程的相关状态。支持SysV和BSD两种风格的选项。
常用选型:
a 与终端相关的进程
x 与终端无关的进程
u 显示运行进程的用户
常用组合选项:ps aux
- # 下面分别来说明上图的各个字段的含义
- # USER 进程以什么用户身份运行
- # PID 进程描述符 具有唯一性
- # %CPU 进程运行时所占的cpu百分比
- # %MEM 进程运行时内存所占的百分比
- # VSZ Virtual memory SiZe 虚拟内存使用大小
- # RSS 常驻内存集,所有不能被置换出去的内存集
- # STAT 表示内存状态
- # 常用的状态有:
- # S:可中段睡眠状态
- # R:运行态
- # D:不可中断睡眠态
- # T:停止态
- # Z:僵尸态
- # s:session leader 所谓进程的领导者
- # +:表示是前台进程
- # l:多线程进程
- # N:低优先级进程
- # <:高优先级进程
- # TTY 用来表示终端 显示为“?”的说明是与终端无关的进程
- # START 进程开始时间
- # TIME 进程运行时间
- # COMMAND 执行进程的命令 如果命令被 "[]"包围,说明是内核线程
-e 显示所有进程
-f 显示完成格式信息
常组合在一起使用:ps -ef
但是有些这种情况下,我们的命令有时候显示不完整
此时想要显示完成就要 ps -efww
-F:显示额外信息
-H:显示进程的层次结构
常用组合方式:ps -eFH
可能以后我们用到最多的选项:
-o 我们可以自定义显示字段
- # 常用的有:
- # pid command psr pri ni %cpu %mem rsz vsz等
#p#
3、pgrep,pidof
pgrep 常用选型:
-U 查看指定用户的进程号
-G 查看指定用户组的进程号
-l 显示进程名和进程号
pidof:只显示已启动进程的PID
4、top命令
- [root@server ~]# pidof httpd # 没启动的进程不显示
- [root@server ~]# pidof man
- 5283
实时监控系统资源
- # 执行top命令后,进入交互式模式
- # top中的一些交互式命令:
- # l:控制是否显示第一行,负载均衡信息
- # t:控制是否显示进程信息由和cpu信息
- # m:控制是否显示内存,交换信息
- # I 或者 1(数字):是否分别显示cpu每个信息
- # M: 按%mem排序显示,从大到小
- # k: kill 杀掉进程
- # s:修改默认刷新时间 默认是3秒
- # 下面解释抬头信息:
- top - 21:35:17 up 10:03, 4 users, load average: 0.00, 0.00, 0.00
- # 系统时间 启动时间 登录用户数 负载均衡:1min 5min 15min
- # 何为系统负载?在这里指的是等待在进程队列里的平均进程数
- # 此出显示的信息 等价于 uptime 命令
- Tasks: 165 total, 1 running, 164 sleeping, 0 stopped, 0 zombie
- # 进程总数 运行数 睡眠态数 停止态数 僵尸进程数
- Cpu(s): 0.0%us,0.0%sy, 0.0%ni, 100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
- # 0.0%us:user space:用于运行用户空间的程序所占的cpu百分比
- # 0.0%sy:system space:用于运行内核空间的程序所占的cpu百分比
- # 0.0%ni:nice值调用时间所占cpu百分百比
- # 100.0%id:系统cpu空闲所占百分比
- # 0.0%wa:用于等待I/O所占的cpu百分比
- # 0.0%hi:硬中断所占cpu百分比
- # 0.0%si:软中断所占cpu百分比
- # 0.0%st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu
- Mem: 1012548k total, 396328k used, 616220k free, 99444k buffers
- # 总内存大小 使用的内存大小 剩余内存大小 缓存的大小
- Swap: 2097144k total, 0k used, 2097144k free, 144156k cached
- # 交换分区总大小 使用的 剩余的 缓冲大小
- # 此处显示的信息等价于 free 命令
常用选项:
-d #: 指定刷新时间间隔
-b: 以批次的方式显示top的刷新
-n #: 显示的批次
例如:top -d 4 -b 2 -n 3
#p#
4、htop
htop命令是top命令的升级版,无论是在功能上还是在界面显示上,都比top命令更胜一筹。
u: 交互式选择显示指定用户的进程
l: 显示光标所在进程所打开的文件列表
s: 显示光标所在进程执行的系统调用
a: 绑定进程到指定的CPU
#:快速定位光标至PID为#的进程上
下图是htop的界面。这个工具比较强大,用法功能比较多,在这里先做简单介绍。以后笔者会专门写htop的博客。
5、vmstat
wmstat 查看虚拟使用情况
- # 常用用法:
- # vmstat 显示信息会默认1秒刷新一次,一直显示
- # vmstart -n 2 显示信息会2秒刷新一次,一直显示
- # vmstat -n 1 4 显示信息会1秒刷新一次,刷新4次
- [root@server ~]# vmstat -n 1 1
- 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 614392 100468 144776 0 0 2 1 6 5 0 0 100 0 0
- # 我们解释一下每个字段的含义:
- # procs字段 关于进程的
- # r 指运行队列的进程数,如果过长,可能是cpu性能较低
- # b 阻塞队列的长度,通常是用于等待I/O的完成。如果太大,说明I/O性能较低
- # memory字段 关于内存使用的
- # swap 使用的交换内存大小
- # free 空余内存大小 它的值=总大小-buff-cache-used
- # buff 缓冲大小,目的是为了加速I/O的写操作(一般是磁盘)
- # cache 缓存大小,摸底是为了加速I/O的读操作(一般是磁盘)
- # swap字段 说明交换内存
- # si swapin 指的是数据进入交换内存的速率 单位:KB/s
- # so swapout 指的是数据出交换内存的速率 单位:KB/s
- # 如果这2个值比较大的时候,会出现抖动现象。建议增加内存
- # io字段 I/O的说明
- # bi:Block in 从块设备读入内存的速率 KB/s
- # bo: block out 保存到块设备的速率 KB/s
- # 这就是我们通常说的磁盘的读写性能,可以通过RAID提高。
- # system字段 关于系统的
- # in: interruppt 中断发生的速率
- # cs: 上下文切换的速率(进程调度)
- # cpu字段 说明cpu的使用情况
- # us:user space:用于运行用户空间的程序所占的cpu百分比
- # sy:system space:用于运行内核空间的程序所占的cpu百分比
- # id:系统cpu空闲所占百分比
- # wa:用于等待I/O所占的cpu百分比,这是由于cpu和i/o速度相差太多所造成的
- # st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu的时间百分比
6、nice,renice
调整进程的优先级。
nice 在进程启动的时候设置优先级。
- # 常用参数:
- # -n NICE 例如:nice -n 3 httpd
- # 一般情况下,nice值是负值的设定一般有管理员来设定。普通用户只能设置nice为正值。
- # 如果不指定 -n 参数,默认的nice值是10
renice 重新设置已启动进程的优先级。
- # 常用选项是:
- # -n NICE 重新设定nice的值
- # -p PID 设定进程的PID
7、kill,killall
对于有Linux C编程经验的人来说,我们知道IPC通信方式之一就是通过信号量(signal),那么对于kill和killall命令来说,它们与信号量有着很大的关系,或者说kill,killall命令通过信号量让我们可以手动的向进程传递信号来控制进程。
常见的信号量如下:
- [root@server ~]# kill -l
- 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
- 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
- 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
- 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
- 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
- 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
- 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
- 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
- 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
- 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
- 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
- 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
- 63) SIGRTMAX-1 64) SIGRTMAX
- # 我们常用到的信号是:
- # 1 SIGHUP 在不关闭进程的情况下,重读配置文件。ngnix在这方面做得相当的好,甚至可以实现在线升级。
- # 2 SIGINT 中断信号 相当于 ctrl + C
- # 9 SIGKILL 暴力杀死
- # 15 SIFTERM 优雅的关闭 默认是这种情况
- # kill用法如下:
- # kill [-SIGNAL] PID
- # 对于SIGNAL有三种表示:例如:1) -9 -15 -1 -2 2)-SIGKILL -SIGHUP -SIGTERM 3) -HUP -KILL -TERM -INT 等。
- #
- # killall是杀掉一类进程
- # 例如:killall httpd 等价于 kill `pidof httpd`
#p#
8、jobs,bg,fg
什么是作业呢?作业就是许多进程一起协同完成一项具体的工作。作业有前台作业和后台作业2种。
使用 & 或者 ctrl + Z可以把一个进程打入后台。
- # ping 192.168.0.1 &
- # 这样打入后台的运行的作业,退出终端的时候,作业就会终止。
- # 使用 nohup 命令可避免这个问题
- # nohup ping 192.168.0.1 &
- # 可以使用jobs命令查看后台的作业
- # 每个作业都有一个作业号来标识作业
- # 作业控制命令
- # bg [[%]JOB_NUM]: 让送往后台的作业继续在后台运行
- # fg [[%]JOB_NUM]: 将后台作业调回前台
- # kill %JOB_NUM: 终止指定的作业
9、dstat命令,查看各种状态信息
用法:dstat [-afv] [options..] [delay [count]]
常用参数 | 具体意义 |
-c | 显示cpu统计数据,如有多个CPU汇总统计 |
-d | 显示disk统计数据,如有多块磁盘则汇总统计 |
-D DEVICE | 显示特定磁盘的信息 |
-g | 显示page信息(具体什么是page以及他的作用,会在以后内存调优博客中具体说明) |
-i | 显示中断的统计数据 |
-m | 显示内存的统计信息 |
-l | 显示系统的负载信息 |
-n | 显示网络接口的相关属性 |
-s | 显示系统属性 |
-N INTER_FACE_NAME | 显示特定接口的属性 |
-s | 显示交换内存的属性 |
-p | 显示进程队列 |
--ipc | 显示ipc消息队列、信号量和共享内存的使用状况 |
-a | 等价于 -cdngy 显示CPU,磁盘,网卡,page,系统属性 |
-f | 以完整格式显示所有信息, |
--tcp,--udp | 显示tcp,udp状态信息 |
更多参数查看 man 手册。
示例:
10、查看内存映射
pmap PID 查看对应进程的内存映射,常用的用法是:pman `pidof PROCESS_NAME`。当然这些信息也可以查看 /proc/PID/pmap 文件查看。
11、glances命令
一款强大的系统监控工具:能实时监控像cpu,meomory,load,swap,Network,mount,disk等信息。
其他功能的使用,请使用 h 来获取帮助。由于此工具比较强大,因此这里者简单的介绍,后期会于 htop 工具做专门的介绍。
原文链接:http://guoting.blog.51cto.com/8886857/1440640