文章目录
进程状态
Linux内核:抢占式多任务
进程类型:
- 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
- 前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
进程状态:
- 运行态:running
- 就绪态:ready
- 睡眠态: 可中断:interruptable 不可中断: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(以数的形式表示进程)
ps: process state
ps-report a snapshot of the current processes
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps -aux查看现在的进程
[root@centos ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.3 193760 6812 ? Ss 02:52 0:02 /usr/lib/systemd/syst
root 2 0.0 0.0 0 0 ? S 02:52 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 02:52 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 02:52 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 02:52 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 02:52 0:00 [rcu_bh]
root 9 0.1 0.0 0 0 ? S 02:52 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 02:52 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 02:52 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 02:52 0:00 [watchdog/1]
字段 | 含义 |
---|---|
USER | 进程发起者 |
PID | 进程号 |
%CPU | 对CPU的占比 |
%MEM | 对内存的占比 |
VSZ | Virtual memory SiZe,虚拟内存集,线性内存 |
RSS | ReSidentSize, 常驻内存集 |
TTY | 终端 |
STAT | 进程状态 |
START TIME | 进程开始的时间 |
COMMAND | 该进程执行的命令 |
STAT进程状态字段 | 含义 |
---|---|
R | running |
S | interruptablesleeping |
D | uninterruptable sleeping |
T | stopped |
Z | zombie |
+ | 前台进程 |
l | 多线程进程 |
L | 内存分页并带锁 |
N | 低优先级进程 |
< | 高优先级进程 |
s | session leader,会话(子进程)发起者 |
VSZ虚拟内存和RSS常驻内存解释
RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小。
RSS 不包括进入交换分区的内存。
RSS 包括共享库占用的内存(只要共享库在内存中)
RSS 包括所有分配的栈内存和堆内存。
VSZ 表示进程分配的虚拟内存。
VSZ 包括进程可以访问的所有内存,包括进入交换分区的内容,以及共享库占用的内存。
简单来说,RSS常驻内存没有VSZ那么大的原因是因为进程可能并没有用到那么多的功能,而在虚拟内存中功能比进程用到的功能多,所以常驻内存就好比是只取了部分的功能也就相当于只取了部分的内存,所以常驻内存小于虚拟内存
通过一个例子来理解一下:
如果一个进程,程序的大小有 500K,链接的共享库大小有 2500K,堆栈内存共有 200K,其中 100K 进入了交换分区。进程实际加载了共享库中的 1000K 的内容,以及自己程序的中的 400K 的内容。请问 RSS 和 VSZ 应是多少?
RSS: 400K + 1000K = 1400K
VSZ: 500K + 2500K + 200K = 3200K
RSS 中有一部分来自共享库,而共享库可能被许多进程使用,所以如果把所有进程的 RSS 加起来,可能比系统内存还要大。
ps命令
常用组合:-aux / -ef / -eFH
选项 | 含义 |
---|---|
-e | 显示所有进程 |
-f | 显示完整格式程序信息 |
-F | 显示更完整格式的进程信息 |
-H | 以进程层级格式显示进程相关信息 |
uptime
显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)
系统平均负载:指在特定时间间隔内运行队列中的平均进程数
- 通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
举例说明:
如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用
[root@centos ~]# uptime
04:57:00 up 2:04, 2 users, load average: 0.00, 0.01, 0.05
top
排序:
按键 | 含义 |
---|---|
P | 以占据的CPU百分比,%CPU |
M | 占据内存百分比,%MEM |
T | 累积占据CPU时长,TIME+ |
首部信息显示:
- uptime信息:l命令
- tasks及cpu信息:t命令
- cpu分别显示:1 (数字)
- memory信息:m命令
- 退出命令:q
- 修改刷新时间间隔:s
- 终止指定进程:k
- 保存文件:W
[root@centos ~]# top
top - 05:00:12 up 2:08, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 126 total, 1 running, 125 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863088 total, 1431720 free, 170148 used, 261220 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 1478616 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 193760 6816 4152 S 0.0 0.4 0:02.37 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.05 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:01.59 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:00.04 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/1
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
18 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kdevtmpfs
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
26 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
27 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
28 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 edac-poller
29 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 watchdogd
30 root 20 0 0 0 0 S 0.0 0.0 0:01.74 kworker/1:1
36 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
栏位信息简介
字段 | 含义 |
---|---|
us | 用户空间 |
sy | 内核空间 |
ni | 调整nice时间 |
id | 空闲 |
wa | 等待IO时间 |
hi | 硬中断 |
si | 软中断(模式切换) |
st | 虚拟机偷走的时间 |
iostat:统计CPU和IO设备信息
[root@centos ~]# iostat
Linux 3.10.0-1062.12.1.el7.x86_64 (centos) 04/13/2020 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.07 0.00 0.22 0.01 0.00 99.71
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
scd0 0.00 0.00 0.00 44 0
sda 1.45 20.05 1.88 193010 18091
dm-0 0.98 17.24 1.66 166003 16031
dm-1 0.01 0.11 0.00 1068 0
vmstat查看虚拟内存信息
[root@centos ~]# 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 1430704 1004 261504 0 0 10 1 25 34 0 0 100 0 0
字段信息:
procs字段 | 含义 |
---|---|
r | 可运行(正运行或等待运行)进程的个数,和核心数有关 |
b | 处于不可中断睡眠态的进程个数(被阻塞的队列的长度) |
memory字段 | 含义 |
---|---|
swpd | 交换内存的使用总量 |
free | 空闲物理内存总量 |
buff | 用于buff的内存总量 |
cache | 用于cache的内存总量 |
swap字段 | 含义 |
---|---|
si | 从磁盘交换进内存的数据速率(kb/s) |
so | 从内存交换至磁盘的数据速率(kb/s) |
io字段 | 含义 |
---|---|
bi | 从块设备读入数据到系统的速率(kb/s) |
bo | 保存数据至块设备的速率 |
system字段 | 含义 |
---|---|
in | interrupts 中断速率,包括时钟 |
cs | context switch 进程切换速率 |
cpu字段 | 含义 |
---|---|
us | Timespent running non-kernel code |
sy | Time spent running kernel code |
id | Time spent idle. |
wa | Time spent waiting for IO. |
st | Time stolen from a virtual machine. |
-s: 显示内存的统计数据
[root@centos ~]# vmstat -s
1863088 K total memory
169812 K used memory
114068 K active memory
119600 K inactive memory
1430728 K free memory
1004 K buffer memory
261544 K swap cache
4063228 K total swap
0 K used swap
4063228 K free swap
1303 non-nice user cpu ticks
16 nice user cpu ticks
4204 system cpu ticks
2066758 idle cpu ticks
139 IO-wait cpu ticks
0 IRQ cpu ticks
107 softirq cpu ticks
0 stolen cpu ticks
193086 pages paged in
18219 pages paged out
0 pages swapped in
0 pages swapped out
508645 interrupts
691743 CPU context switches
1586760729 boot time
3582 forks
pmap命令
格式:pmap[options] pid [...]
-x: 显示详细格式的信息
示例:pmap (-x)进程号
dstat工具
dstat命令:系统资源统计,代替vmstat,iostat
选项 | 含义 |
---|---|
-c | 显示cpu相关信息 |
-C | #,#,…,total |
-d | 显示disk相关信息 |
-D | total,sda,sdb,… |
-g | 显示page相关统计数据 |
-m | 显示memory相关统计数据 |
-n | 显示network相关统计数据 |
-p | 显示process相关统计数据 |
-r | 显示io请求相关的统计数据 |
-s | 显示swapped相关的统计数据 |
–top-cpu | 显示最占用CPU的进程 |
–top-io | 显示最占用io的进程 |
–top-mem | 显示最占用内存的进程 |
–top-latency | 显示延迟最大的进程 |
[root@centos ~]# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 100 0 0 0| 32k 2258B| 0 0 | 0 0 | 50 67
0 0 100 0 0 0| 0 0 | 180B 842B| 0 0 | 47 54
0 0 100 0 0 0| 0 0 | 337B 362B| 0 0 | 34 45
0 1 100 0 0 0| 0 0 | 180B 362B| 0 0 | 53 62
1 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 58 67
0 0 100 0 0 0| 0 0 | 226B 422B| 0 0 | 40 48
0 1 100 0 0 0| 0 0 | 120B 362B| 0 0 | 28 39
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 38 51
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 29 43
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 37 48
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 27 35
kill命令:杀死进程
按PID:kill [-SIGNAL] pid…
kill –n SIGNAL pid
kill –s SIGNAL pid
按名称:killall [-SIGNAL] comm…
按模式:pkill [options] pattern
作业管理
Linux的作业控制
- 前台作业:通过终端启动,且启动后一直占据终端;
- 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台
- 运行中的作业:Ctrl+z
- 尚未启动的作业:COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系
nohup COMMAND &>/dev/null &
screen;COMMAND
查看当前终端所有作业:jobs
作业控制:
- fg[[%]JOB_NUM]:把指定的后台作业调回前台
- bg[[%]JOB_NUM]:让送往后台的作业在后台继续运行
- kill [%JOB_NUM]:终止指定的作业
示例:
这里的示例以dstat命令来展示
1.组合键Ctrl+z
可以将运行中的作业送往后台运行
2.使用命令fg +后台运行的作业号
可以将后台运行作业转为前台运行
3.使用命令bg +后台运行的作业号
可以将后台运行的作业在前台显示出来但是实际上还是在后台运行,在前台上输入其他命令完全不受影响
4.使用命令Ctrl+c
组合键可以杀死正在前台中运行的作业
[root@centos ~]# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 100 0 0 0| 17k 1340B| 0 0 | 0 0 | 42 59
0 0 100 0 0 0| 0 0 | 120B 902B| 0 0 | 55 89
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 54 87
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 50 85 ^Z
[1]+ Stopped dstat
[root@centos ~]# fg 1
dstat
0 0 100 0 0 0| 0 0 |1116B 1200B| 0 0 | 391 596 missed 6 ticks
0 1 99 0 0 0| 0 0 | 120B 394B| 0 0 | 57 89
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 48 81
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 53 83 ^Z
[1]+ Stopped dstat
[root@centos ~]# bg 1
[1]+ dstat &
[root@centos ~]#
0 0 99 0 0 0| 0 0 |1056B 1248B| 0 0 | 293 409 missed 3 ticks
0 0 100 0 0 0| 0 0 | 217B 394B| 0 0 | 55 68
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 46 79
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 57 89 ls
1 nohup.out vglv
[root@centos ~]#
0 1 100 0 0 0| 0 0 | 618B 988B| 0 0 | 102 131 ls
1 nohup.out vglv
[root@centos ~]#
0 1 100 0 0 0| 0 20k| 558B 988B| 0 0 | 107 143
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 44 75
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 58 91 l
0 0 99 0 0 0| 0 0 | 226B 468B| 0 0 | 54 83 s
1 nohup.out vglv
[root@centos ~]#
0 1 99 0 0 0| 0 0 | 452B 882B| 0 0 | 124 142
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 45 77
0 0 100 0 0 0| 0 0 | 120B 422B| 0 0 | 73 101
0 0 100 0 0 0| 0 3072B| 120B 362B| 0 0 | 50 86
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 58 90
0 0 100 0 0 0| 0 0 | 120B 362B| 0 0 | 62 91 fg
0 0 100 0 0 0| 0 0 | 452B 574B| 0 0 | 73 110
0 0 100 0 0 0| 0 0 | 226B 468B| 0 0 | 52 85 1
dstat
0 0 100 0 0 0| 0 0 | 878B 590B| 0 0 | 87 118
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 100 0 0 0| 0 0 | 60B 362B| 0 0 | 45 78
0 0 100 0 0 0| 0 0 | 120B 842B| 0 0 | 61 97 ^C
周期性运行某任务
相关的程序包:
cronie: 主程序包,提供crond守护进程及相关辅助工具
cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
crontabs:包含CentOS提供系统维护任务
确保crond守护处于运行状态:
CentOS 7:
systemctl status crond
状态为active表示crond处于运行状态
[root@centos ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-04-13 02:52:22 EDT; 6h ago
Main PID: 1239 (crond)
CGroup: /system.slice/crond.service
└─1239 /usr/sbin/crond -n
Apr 13 02:52:22 centos systemd[1]: Started Command Scheduler.
Apr 13 02:52:22 centos crond[1239]: (CRON) INFO (RANDOM_DELAY will be scaled with f...d.)
Apr 13 02:52:24 centos crond[1239]: (CRON) INFO (running with inotify support)
Hint: Some lines were ellipsized, use -l to show in full.
计划周期性执行的任务提交给crond,到指定时间会自动运行
系统cron任务:系统维护作业
相关配置文件:/etc/crontab
用户cron任务:crontab命令
日志存放位置:/var/log/cron
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
例如:晚上9点10分运行echo命令
10 21 * * * centos /bin/echo "Hello World!"
时间表示法:
- (1) 特定值
给定时间点有效取值范围内的值 - (2) *
给定时间点上有效取值范围内的所有值
表示“每个…” - (3) 离散取值
#,#,# - (4) 连续取值
#-# - (5) 在指定时间范围上,定义步长
*/#: #即为步长,每多少…
示例:每3小时echo和wall命令
0 */3 * * * centos /bin/echo “howdy”,/usr/bin/wall “welcome to JJS!”
crontab -e
:为当前用户创建定时任务
示例:每分钟echo
一个 “good!”
使用crontab -l
命令查看当前用户的定时任务
cat /var/log/cron
该命令是查看定时任务的日志
[root@centos ~]# crontab -e
*/1 * * * * echo "good!"
[root@centos ~]# crontab -l
*/1 * * * * echo "good!"
[root@centos ~]# cat /var/log/cron
Apr 13 09:24:01 centos CROND[5768]: (root) CMD (echo "good!")
Apr 13 09:25:01 centos CROND[5787]: (root) CMD (echo "good!")
Apr 13 09:25:56 centos crontab[5807]: (root) BEGIN EDIT (root)
Apr 13 09:26:02 centos CROND[5811]: (root) CMD (echo "good!")