linux进程管理
系统调用:
- 指运行在用户空间的程序向操作系统内核空间获取更高的权限运行的服务
- 系统调用提供用户程序和操作系统之间的接口
-
内核的功能:
进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
程序
进程与线程
进程
- 正在运行的程序
- 进程的创建:
- int0 根进程
- 父子继承,所有的进程都是由父进程创建的
- 系统资源调度的最小单位
进程的优先级
- 0-99:实时优先级,数字越小,优先级越低- 100-139:静态优先级,数字越小,优先级越高- Nice指:-20 ,19
进程类型
- 守护进程:在系统引导过程中启动的进程,跟终端无关的进程
- 前台进程:跟终端相关的,需要通过终端进行启动
- ps:可以把前台启动的进程送往后台,以守护模式进行
进程状态:
- 运行态: running
- 就绪态:ready
- 睡眠态:
- 可中断:interruptable
- 不可中断:uninterruptable
- 停止态:暂停在内存中,但不会被调度,除非手动启动:stopped
- 僵死态:zombie
进程的分类
- cpu密集型:高计算,cpu资源比较高的
- IO密集型:IO高的进程,磁盘的IO 等
进程管理工具
- pstree ps pidof pgrep top htop pmap vmstat kill pkill job
- [https://time.geekbang.org/column/intro/140](https://time.geekbang.org/column/intro/140) and 计算机操作系统
pstree 命令
- 显示进程树
ps命令:
- 显示当前的进程状态
- Linux操作系统各进程的相关信息均保存在/proc/PID目录之中下的各个文件中
- To see every process on the system using standard syntax:
ps -e<br /> ps -ef<br /> ps -eF<br /> ps -ely<br /> To see every process on the system using BSD syntax:<br /> ps ax 查看不与terminal有关的所有进程<br /> ps axu 查看系统所有的进程数据<br /> To print a process tree:<br /> ps -ejH<br /> ps axjf<br /> To get info about threads:<br /> ps -eLf<br /> ps axms<br /> ps -lA:查看系统所有的进程数据<br /> ps axjf:查看连同一部分的进程树状态
[root@localhost ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 128012 6640 ? Ss 20:55 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 20:55 0:00 [kthreadd]
用户 进程id cpu利用率 内存利用率
USER:用户
PID :进程id
%CPU :cpu利用率
%MEM:内存利用率
VSZ:虚拟内存集
RSS:常驻内存级
TTY:虚拟终端
STAT :状态
R:running
S:interruptable sleeping
D:unterruptable sleeping
T:stopped
Z:zombie
+:前台进程
I:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader
START :启动时间
TIME:运行占用cpu的累计时间
COMMAND:由哪个命令来启动相关的进程
- 常用选项
- -a:显示所有进程
- -A:纵向显示命令结果
- -e:显示所有进程
- -f:显示完整格式程序信息
- -F:显示完整格式程序信息,显示的信息更加详细
- -H:以进程等级层次格式显示进程信息
- -u:显示有效用户相关的进程
- -x:Lift the BSD -style "must have a tty"restriction 一般和a参数使用,可列出完整的信息
- -o:用户自定义格式:
- -l:较长且详细地将PID信息列出。
- nice值,可以表示静态优先
[root@lhuan ~]# ps -A
PID TTY TIME CMD
1 ? 00:01:57 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
6 ? 00:01:08 ksoftirqd/0
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:02:43 rcu_sched
10 ? 00:00:00 lru-add-
[root@lhuan ~]# ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1423 0.0 0.0 110108 860 ttyS0 Ss+ Nov01 0:00 /sbin/agetty --keep-baud 115200,38400
root 1424 0.0 0.0 110108 852 tty1 Ss+ Nov01 0:00 /sbin/agetty --noclear tty1 linux
root 13482 0.0 0.1 116636 3292 pts/0 Ss 09:11 0:00 -bash
root 13801 0.0 0.0 155372 1868 pts/0 R+ 09:13 0:00 ps -u
[root@lhuan ~]# ps -x
PID TTY STAT TIME COMMAND
1 ? Ss 1:57 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
2 ? S 0:00 [kthreadd]
4 ? S< 0:00 [kworker/0:0H]
6 ? S 1:08 [ksoftirqd/0]
7 ? S 0:00 [migration/0]
[root@lhuan ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 13482 13418 0 80 0 - 29159 do_wai pts/0 00:00:00 bash
0 R 0 14535 13482 0 80 0 - 38312 - pts/0 00:00:00 ps
[root@lhuan ~]# ps -axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 4 0 0 ? -1 S< 0 0:00 \_ [kworker/0:0H]
2 6 0 0 ? -1 S 0 1:08 \_ [ksoftirqd/0]
2 7 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 8 0 0 ? -1 S 0 0:00 \_ [rcu_bh]
2 9 0 0 ? -1 R 0 2:43 \_ [rcu_sched]
2 10 0 0 ? -1 S< 0 0:00 \_ [lru-add-drain]
top 命令
[root@localhost ~]# top
top - 01:29:48 up 4:34, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 124 total, 1 running, 123 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si,
KiB Mem : 3861520 total, 3200264 free, 160388 used, 500868 buff/cac
KiB Swap: 2097148 total, 2097148 free, 0 used. 3419884 avail Me
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
20143 root 20 0 162000 2228 1556 R 0.7 0.1 0:00.03
42 root 20 0 0 0 0 S 0.3 0.0 0:13.12
1 root 20 0 128012 6640 4136 S 0.0 0.2 0:03.38
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04
- 显示信息:
- 系统启动时间
- 系统运行时间
- 登录的用户
- load average: 平均负载 -->当前系统的压力情况,通常情况下可以是cpu
x x x 一分钟内的平均负载值,5分钟内的平均负载值,15分钟内的平均负载值
平均负载:cpu利用率,平均负载值符合cpu个数
单位时间下,cpu资源的使用
由一些进程如果处理interruptable sleep(IO等待)
IO等待进程,等用户输入,然后用户输入写到磁盘当中,保证数据的一致性
- 内置命令:
- P:以cpu百分比进行排序
- M:以内存占用比进行排序
- T:根据占用cpu时长排序
htop命令
- htop 是 Linux 系统中的一个互动的进程查看器,与 Linux传统的 top 相比,htop 更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。
- 安装:
- [root@localhost ~]# yum -y install epel-release
- [root@localhost ~]# yum -y install htop
- 
- 可以看到总共分四个区域:
- 第一区域:CPU、内存、Swap的使用情况;
- 第二区域:任务、线程、平均负载及系统运行时间的信息。平均负载部分提供了三个数字,这仅仅表示的是过去的5分钟、10分钟和15分钟系统的平均负载而已,在单核的系统中平均负载为1表示的是百分之百的 CPU 利用率。最后,运行时间 (uptime)标示的数字是从系统启动起到当前的运行总时间。
- 第三区域:当前系统中的所有进程。各列说明:<br /> PID:进程标志号,是非零正整数<br /> USER:进程所有者的用户名<br /> PR:进程的优先级别<br /> NI:进程的优先级别数值<br /> VIRT:进程占用的虚拟内存值<br /> RES:进程占用的物理内存值<br /> SHR:进程使用的共享内存值<br /> S:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数<br /> %CPU:该进程占用的CPU使用率<br /> %MEM:该进程占用的物理内存和总内存的百分比<br /> TIME+:该进程启动后占用的总的CPU时间<br /> COMMAND:进程启动的启动命令名称
- 第四区域:当前界面中F1-F10功能键中定义的快捷功能。即 底部菜单栏。
- F1 : 查看htop使用说明
- F2 : 设置
- F3 : 搜索进程
- F4 : 过滤器,按关键字搜索
- F5 : 显示树形结构
- F6 : 选择排序方式
- F7 : 减少nice值,这样就可以提高对应进程的优先级
- F8 : 增加nice值,这样可以降低对应进程的优先级
- F9 : 杀掉选中的进程
- F10 : 退出htop
- / : 搜索字符
- h : 显示帮助
- l :显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
- u :显示所有用户,并可以选择某一特定用户的进程
- s : 将调用strace追踪进程的系统调用
- t : 显示树形结构
- H :显示/隐藏用户线程
- I :倒转排序顺序
- K :显示/隐藏内核线程
- M :按内存占用排序
- P :按CPU排序
- T :按运行时间排序
- 上下键或PgUP, PgDn : 移动选中进程
- 左右键或Home, End : 移动列表
- Space(空格) : 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程
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
1 0 0 3199500 2108 498940 0 0 3 3 9 11 0 0 100 0 0
-
procs进程信息字段 :
- r:等待运行的进程数,数量越大,系统越繁忙 - b:不可被唤醒的进程数量,数量越大,系统越繁忙memory内存信息字段 :
- swpd:虚拟内存的使用情况,单位为KB - free:空闲的内存容量,单位为KB - buffer:缓冲的内存容量,单位为KB - cache:缓存的内容容量,单位为kbswap 交换分区的信息字段 :
- si:从磁盘中交换到内存中数据的数量,单位为KB - so:从内存中交换到磁盘中数据的数量,单位为KB
这两个数越大,说明数据需要经常在磁盘和内存之间交换,系统性能越差
io 磁盘读写信息字段:
- bi:从块设备读入数据的总量,单位是块
- bo:写入到块设备的数据的总量,单位是块
system:
- in:每秒被中断的进程次数
- cs:每秒钟进行的时间切换次数
cpu cpu信息字段 :
- us:非内核进程消耗CPU运算时间的百分比
- sy:内核进程消耗CPU运算时间的百分比
- id:空闲CPU的百分比
- wa:等待I/O所消耗的CPU百分比
- st:被虚拟机所盗用的CPU占比
- ‐s:显示内存的统计数据
kill命令:
- 向进程发送控制信号,以实现对进程的管理
- kill -l 或者 man 7 signal:显示当前系统可用的信号
- 常用信号:
- 1.无须关闭进程而让其重新读取配置文件 SIGHUP
- 2 终止正在运行的进程 SIGINT
- 9 杀死正在运行的进程 SIGKILL
- 15 终止正在运行的进程 SIGTERM
- 常用方法:
- kill [-signal] 进程ID
- signal:
- 信号的数字标识
- 信号完整名称
- 信号的简写名称
- killall命令:终止“名称下”的所有进程
- killall [‐signal] Program
- 进程优先级调整:
- 静态优先级:100-139
- Nice :-20 19
- nice命令
- <br />
[root@localhost ~]# nice --help
Usage: nice [OPTION] [COMMAND [ARG]...]
[root@localhost ~]# renice --help
Usage:
renice [-n] <priority> [-p|--pid] <pid>...
renice [-n] <priority> -g|--pgrp <pgid>...
renice [-n] <priority> -u|--user <user>...
线程
- 进程所创建的
- cpu分配和调度的最小单位<br />
协程
- 一种用户态的轻量级线程,调度完全由用户控制
