CentOS之进程管理
一、什么是进程
一般来讲,进程定义为正在运行的程序的实例,简单地说,进程就是一个正在运行的程序。
- ==程序== (program):通常为二进制,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
- ==进程== (process):程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。
进程不仅仅包含了正在运行的代码,还包括了运行代码所需要的各种资源。内核中使用进程控制块PCB(process control block)管理一个进程的数据结构,每个进程都有一个PCB。
进程是资源所有资源分配的基本单位,线程则是CPU调度的基本单位。
二、多进程调度原理
在一个cpu上,可以存在多个进程,但是同一个时间段内,只能有一个进程工作。操作系统使用一定的算法管理所有进程,使得看起开像是并发执行,称之为“伪并发”;多核CPU可以实现真正意义上的并发。
三、进程的生命周期
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构,每个新进程分配一个,唯一的进程ID(PID),满足跟踪安全性之需。
- 任何进程都可以创建子进程
- 所有的进程都是第一个系统进程的后代
- CentOS 5/6 系统进程 init
- CentOS 7 系统进程 systemd
进程管理
静态查看进程
ps [options] 支持的命令格式 unix格式: -h -e BSD格式: a,x,u GNU长格式: --help a //显示现行终端下的所有程序 x //包括不连接终端的终端 u //显示进程详细信息 f //显示进程树 k //指定排序方式,默认是递增,则需要在选择排序的字段上加上减 ps aux k%cpu o //指定显示的属性 ps opid,cmd,%cpu ...... 不能跟u同时使用 l //详细显示PID的信息 e //相当于 ax f //显示详细信息,相当于u F //显示更详细信息 H //显示树状结构 p pid //根据pid查信息 U username //获取指定的用户信息
[root@CatdeXin-PC ~]# ps aux | head -3 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 194060 6836 ? Ss 09:37 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0.0 0.0 0 0 ? S 09:37 0:00 [kthreadd] - USER 运行进程的用户 - PID 进程ID - %CPU CPU占用率 - %MEM 内存占用率 - VSZ 占用虚拟内存 (硬盘) - RSS 占用实际内存 - TTY 程序运行的终端 - STAT 进程状态 - TIME 占用CPU时间 - COMMAND 文件路径(文件名字) 进程的状态 + T Stopped 停止 + R Running 运行 + S Sleeping 睡眠 + Z Zombie 僵尸进程
对进程进行排序
语法 - ps 指令 --sort 排序字段 - 排序字段有 - 为倒叙 #CPU正序排列前五条 [root@CatdeXin-PC ~]# ps aux --sort -%cpu | head -5 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND catdexin 3030 0.1 0.7 640920 14608 ? Sl 04:41 1:02 /usr/bin/vmtoolsd -n vmusr root 16567 0.1 0.3 161012 5780 ? Ss 20:48 0:00 sshd: root@pts/1 root 16666 0.1 0.2 227552 4028 ? Ssl 20:51 0:00 /usr/libexec/nm-dispatcher root 1 0.0 0.2 194024 5308 ? Ss 04:15 0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
进程的父子关系
语法 - ps -ef 示例 [root@CatdeXin-PC ~]# ps -ef |head -5 UID PID PPID C STIME TTY TIME CMD root 1 0 0 04:15 ? 00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0 0 04:15 ? 00:00:00 [kthreadd] root 4 2 0 04:15 ? 00:00:00 [kworker/0:0H] root 6 2 0 04:15 ? 00:00:00 [ksoftirqd/0] - UID - PPID 父进程ID - STIME 运行时间
自定义字段显示
# 语法 - ps axo 字段名称 # 示例 [root@CatdeXin-PC ~]# ps -axo user,pid,ppid,%mem | head -3 USER PID PPID %MEM root 1 0 0.2 root 2 0 0.0
动态查看进程
- 静态查看进程缺点 不实时
- 使用top动态查看
top - 21:26:40 up 17:10, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 238 total, 1 running, 236 sleeping, 1 stopped, 0 zombie %Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1863040 total, 116688 free, 864068 used, 882284 buff/cache KiB Swap: 2097148 total, 2087668 free, 9480 used. 821784 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 12 root rt 0 0 0 0 S 0.3 0.0 0:00.42 watchdog/1 17091 root 20 0 162236 2384 1584 R 0.3 0.1 0:00.02 top 1 root 20 0 194024 5308 3184 S 0.0 0.3 0:04.69 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd 4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 按Q退出 top信息框有两部分组成 - head 头部 性能信息 - 下半部分 进程查看部分 # 头部信息说明 - 第一行 top - 21:26:40 up 17:10, 3 users, load average: 0.00, 0.01, 0.05 程序名-系统时间 运行时间 登录用户数 CPU负载 1分钟内占用率 5分钟 15分钟 - 第二行 Tasks: 238 total, 1 running, 236 sleeping, 1 stopped, 0 zombie 总进程数 运行数 1 睡眠数 236 停止数 0 僵死数 0 - 第三行 %Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st CPU占用比 us:用户 sy:系统 ni:优先级 id:空闲 wa:等待 hi:硬件 si:软件 st:虚拟机 - 第四行 KiB Mem : 1863040 total, 116688 free, 864068 used, 882284 buff/cache 物理内存K total 总大小 free 空闲 userd使用 cache 缓存硬盘内容 - 第五行 KiB Swap: 2097148 total, 2087668 free, 9480 used. 821784 avail Mem 虚拟内存K # 下半部分说明 - PID 进程ID - USER 启动用户 - PR 系统优先级 - NI 用户优先级 - VIRT 申请内存 - RES 实际占有内存 - SHR 共用内存(几个程序共用一块) - S 状态 - %CPU CPU占比 - %MEM 内存 - TIME+ 占时 - COMMAND 程序路径和名称
- top的基本用法
- h | ? 帮助
- k 杀死进程
- shift+M - 按内存的使用排序
- shift+P - 按CPU使用排序
- shift+N - 以PIC的大小排序
- shift+< - 向前
- shift+> - 向后
- Z 设置菜色 使用数字调整
top技巧
- top占用资源比较大 不建议使用
[root@CatdeXin-PC ~]#top //回车 立即刷新 [root@CatdeXin-PC ~]#top -d 1 //每一秒刷新一次 [root@CatdeXin-PC ~]#top -d 1 -p 10126 //查看指定进程的动态信息 [root@CatdeXin-PC ~]#top -d 1 -p 10126,4154,545 //同事查看三个进程的状态
进程控制Kill
向进程发送信号,实现对进程的管理,每个信号,对应不同的值,对应不同的含义
kill -l 列出所有支持的信号
- 信号种类
- 1) SIGHUP 重新加载配置
- 2) SIGINT 键盘终端 Ctrl+C
- 3) SIGQUIT 键盘退出 Ctrl+,类似SIGINT
- 9) SIGKILL 强制终止,无条件
- 15) SIGTERM 终止(正常结束),缺省信号
- 18) SIGCONT 继续
- 19) SIGSTOP 暂停
- 20) SIGTSTP 键盘暂停 Ctrl+Z
- 2 3 20 信号 由键盘操作
- 9 直接杀死 (建议杀僵尸进程)
- 15 正常流程退出 建议平常使用
kill -信号序号 进程ID
killall -信号序号 进程名称#没有装图形化界面,可能没有这个命令,可以使用pkill
pkill -信号序号 进程名称
练习:
1. 通过两个终端 分别打来两个vim 2. 通过第三个终端,查询两个进程 3. 发送信号9和信号15,观察两个终端程序的状态
进程的优先级 nice
首先用top或者ps -l查看进程会发现有PR(PRI) NI两个字段:
- NI 是优先值,是用户层面的概念, PR是进程的实际优先级, 是给内核(kernel)看(用)的。
- 一般情况下,PR=NI+20, 如果一个进程的优先级PR是20, 那么它的NI(nice)值就是20-20=0。
进程调度优先级是从-20到19,一共40个级别,数字越大,表示进程的优先级越低。默认时候,进程的优先级是0。查看进程优先级有两个办法:ps和top。top命令显示的NI列的值。或者可以使用ps -efl来查看,也是在ni列表示了进程的优先级。
进程的优先级可以在程序运行的时候设置,也可以在程序运行过程中动态的修改。
[root@CatdeXin-PC ~]# ps axo pid,command,nice --sort=-nice | head -5 PID COMMAND NI 48 [khugepaged] 19 769 /usr/sbin/alsactl -s -n 19 19 3089 /usr/libexec/tracker-extrac 19 3093 /usr/libexec/tracker-miner- -
调整优先级
- 启动具有不同nice级别的进程
# nice -n 优先级 命令 示例 [root@CatdeXin-PC ~]# nice -n 5 sleep 70000 & [3] 22331 [root@CatdeXin-PC ~]# ps axo pid,command,nice | grep sleep 22309 sleep 60000 0 22318 sleep 80000 0 22330 sleep 60 0 22331 sleep 70000 5 22333 grep --color=auto sleep 0
- 更改先有进程的nice级别
# renice 优先级 PID 示例 [root@CatdeXin-PC ~]# renice -16 22318 22318 (进程 ID) 旧优先级为 0,新优先级为 -16 [root@CatdeXin-PC ~]# ps axo pid,command,nice | grep sleep 22309 sleep 60000 0 22318 sleep 80000 -16 22331 sleep 70000 5 22375 sleep 60 0 22378 grep --color=auto sleep 0
来查看一下系统实际优先级
[root@CatdeXin-PC ~]# top -p 22309,22318,22331 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 22309 root 20 0 108052 356 280 S 0.0 0.0 0:00.00 sleep 22318 root 4 -16 108052 356 280 S 0.0 0.0 0:00.00 sleep 22331 root 25 5 108052 356 280 S 0.0 0.0 0:00.00 sleep
后台程序操作
// 查看后台进程 # 命令: jobs [root@CatdeXin-PC ~]# jobs [2] 运行中 sleep 35000 & [3]- 运行中 sleep 6000 & [4]+ 运行中 sleep 8000 & - 次一级 + 最新的 // 将后台进程调到前台执行 # 命令: fg 后台序号 [root@CatdeXin-PC ~]# fg 3 sleep 6000 ^Z //Ctrl+Z(键盘停止)将前台程序放到后台 但是是停止状态 [3]+ 已停止 sleep 6000 [root@CatdeXin-PC ~]# jobs [2] 运行中 sleep 35000 & [3]+ 已停止 sleep 6000 // 停止了 [4]- 运行中 sleep 8000 & // 通过指令让后台暂停的进程继续运行 # 命令: bg 后台序号 [root@CatdeXin-PC ~]# bg 3 [3]+ sleep 6000 & [root@CatdeXin-PC ~]# jobs [2] 运行中 sleep 35000 & [3]- 运行中 sleep 6000 & [4]+ 运行中 sleep 8000 & [root@CatdeXin-PC ~]# // 因为后台序号不是PID 所以kill杀死的时候 带上百分号 # 命令: kill 信号 %指令 [root@CatdeXin-PC ~]# kill %2 [root@CatdeXin-PC ~]# kill -15 %3 [root@CatdeXin-PC ~]# jobs [2] 已终止 sleep 35000 & [3]- 已终止 sleep 6000 [4]+ 运行中 sleep 8000 &
注意
“++kill 1” 和 “kill %1” 不同
前者是杀死PID为1的进程
后者杀死作业序号1的后台程序
扩展内容 提前了解
查看内存信息
指令: free - free 默认是以字节单位显示的 可以加上参数 使观察更便捷 -b # 字节 -k # kb -m # mb -g # gb -h # 人类易读的方式 -c # 刷新次数 [root@CatdeXin-PC ~]# free -h total used free shared buff/cache available Mem: 1.8G 1.2G 77M 26M 512M 408M Swap: 2.0G 80M 1.9G
查看硬盘信息
指令: df [root@CatdeXin-PC ~]# df -hT 文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs 894M 0 894M 0% /dev tmpfs tmpfs 910M 0 910M 0% /dev/shm tmpfs tmpfs 910M 11M 900M 2% /run tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 50G 4.9G 46G 10% / /dev/mapper/centos-home xfs 27G 133M 27G 1% /home /dev/sda1 xfs 1014M 185M 830M 19% /boot tmpfs tmpfs 182M 48K 182M 1% /run/user/1000 /dev/sr0 iso9660 4.5G 4.5G 0 100% /run/media/catdexin/CentOS 7 x86_64 tmpfs tmpfs 182M 0 182M 0% /run/user/0
虚拟内存统计Vmstat
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。
vmstat [options] [delay [count]] [root@s22 ~]#vmstat 1 3 每秒刷新一次,刷新3次 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 282028 74012 0 320876 2 11 257 64 104 105 1 1 98 0 0 0 0 282028 73988 0 320876 0 0 0 0 81 86 0 1 99 0 0 0 0 282028 73988 0 320876 0 0 0 0 68 62 0 0 100 0 0 procs procs r 运行队列中进程数量 b 等待IO的进程数量 memory: swap 使用虚拟内存大小 free 可用内存大小 buff 用作缓冲的内存大小 cache 用作缓存的内存大小 swap: si 从磁盘交换到内存的数据速率(kb/s) so 从内存交换到次哦按的数据速率(kb/s) io: bi 从磁盘读取到系统的速率(kb/s) bo 从系统写入到磁盘的速率(kb/s) system: in 中断频率 cs 进程之间切换的频率 cpu: us 用户进程执行时间(user time) sy 系统进程执行时间(system time) id 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。 wa 等待IO时间 st
如果r经常大于4,id经常少于40,表示cpu的负荷很重。
如果bi,bo长期不等于0,表示内存不足。
如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。
Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
显示活跃和非活跃内存
vmstat -a 2 5 【-a 显示活跃和非活跃内存,所显示的内容除增加inact和active】
[root@CatdeXin-PC ~]# vmstat -a 2 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 1 0 81408 106412 703472 693716 0 1 31 3 22 34 0 0 100 0 0 1 0 81408 106420 703472 693868 0 0 0 4 83 131 0 0 100 0 0 0 0 81408 106420 703472 693868 0 0 0 0 74 114 0 0 100 0 0 0 0 81408 106420 703472 693868 0 0 0 0 68 108 0 0 100 0 0 0 0 81408 106420 703472 693868 0 0 0 37 125 169 1 0 99 0 0
显示从系统启动至今的fork数量
vmstat -f 【 linux下创建进程的系统调用是fork】
[root@CatdeXin-PC ~]# vmstat -f 13255 forks
说明: 信息是从/proc/stat中的processes字段里取得的
查看内存使用的详细信息
vmstat -s 【显示内存相关统计信息及多种系统活动数量】
[root@CatdeXin-PC ~]# vmstat -s 1863032 K total memory 1274088 K used memory 693632 K active memory
说明:这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat
查看磁盘的读/写
vmstat -d 【查看磁盘的读写】
[root@CatdeXin-PC ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sr0 29 0 2100 39 0 0 0 0 0 0 sda 58166 813 7953445 105404 10328 22007 776259 14866 0 29 dm-0 55932 0 7880178 105017 11865 0 608442 17945 0 28 dm-1 1107 0 12560 1152 20441 0 163528 64605 0 1
说明:这些信息主要来自于/proc/diskstats.
查看/dev/sda1磁盘的读/写
vmstat -p /dev/sda1 【显示指定磁盘分区统计信息】
[root@CatdeXin-PC ~]# vmstat -p /dev/sda1 sda1 reads read sectors writes requested writes 2012 53363 28 4289
说明:这些信息主要来自于/proc/diskstats.
- reads: 来自于这个分区的读的次数。
- read sectors: 来自于这个分区的读扇区的次数。
- writes: 来自于这个分区的写的次数。
- requested writes: 来自于这个分区的写请求次数。
查看系统的slab信息
vmstat -m
说明:这些信息主要来自于/proc/slabinfo
slab: 由于内核会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry,这些对象如果每次构建的时候就向内存要一个页(4kb),这样就会非常浪费,为了解决这个问题,就引入了一种新的机制来处理在同一个页框中如何分配小存储区,而slab可以对小对象进行分配,这样就不用为每一个对象分配页框,从而节省了空间,内核对一些小对象创建析构很频繁,slab对这些小对象进行缓冲,可以重复利用,减少内存分配次数
proc(了解)
虚拟文件系统: 采集服务器自身 内核,进程运行的状态信息
- CPU:
/proc/cpuinfo// 记录CPU一些信息 [root@CatdeXin-PC ~]# cat /proc/cpuinfo
- 内存:
/proc/meminfo[root@CatdeXin-PC ~]# cat /proc/meminfo - 内核:
/proc/cmdline[root@CatdeXin-PC ~]# cat /proc/cmdline BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8 [root@CatdeXin-PC ~]# ls /boot ···略··· vmlinuz-3.10.0-1127.el7.x86_64

浙公网安备 33010602011771号