进程管理

Posted 雾里屿伦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程管理相关的知识,希望对你有一定的参考价值。

进程的优先级

什么是优先级

优先级高的进程,可以优先享用系统资源

优先级的定义和配置

在启动进程时,为不同的进程使用不同的调度策略
nice值越高:表示优先级越低,例如19,该进程容易将CPU使用量让给其他进程
nice值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU

1)使用top或ps命令查看进程的优先级

## 查看优先级的方法
- 使用top查看优先级
[root@cyr <sub>]# top
- 使用ps查看优先级
[root@cyr </sub>]# ps axo pid,user,nice,command|grep ssh

2)使用nice命令指定进程优先级

## 指定优先级执行命令
[root@cyr <sub>]# nice -n 19 vim 5.txt
## 另一个终端查看优先级
[root@cyr </sub>]# ps axo pid,user,nice,command|grep [v]im
6702 root 19 vim 5.txt

3)使用renice重置已经在运行程序的优先级

## 重置,已经在运行的程序,优先级
# 查看sshd服务的优先级
[root@cyr <sub>]# ps axo pid,user,nice,command|grep ssh
1124 root 0 /usr/sbin/sshd -D

# 重新设置sshd服务的优先级为-20
[root@cyr </sub>]# renice -n -20 1124
1124 (process ID) old priority 0, new priority -20
(老的优先级是0) (新的优先级是-20)

# 再次查看
[root@cyr ~]# ps axo pid,user,nice,command|grep ssh
1124 root -20 /usr/sbin/sshd -D

后台进程管理

使用&,将进程放到后台运行,然后再使用jobs、bg、fg等方式查看进程状态,太麻烦了,所以我们推荐使用screen和nohup

# 在执行的命令后面加 & 会直接将命令放在后台执行
[root@cyr <sub>]# ping baidu.com &

# 先把进程放在后台暂停,配合bg将暂停的进程在后台恢复运行
Ctrl + z
joba bg fg

[root@cyr </sub>]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=32.2 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=32.3 ms
^Z
[2]+ Stopped ping baidu.com

[root@cyr <sub>]# jobs
[1]+ Stopped ping baidu.com

[root@cyr </sub>]# bg 1

nohup是将执行的命令放入后台执行,并且将输出结果保存到nohup.out文件中

## 使用nohup命令最后要加&
[root@cyr <sub>]# nohup ping baidu.com &
[1] 7239
[root@cyr </sub>]# nohup: ignoring input and appending output to ‘nohup.out’ (忽略输入并且把输出追加到nohup.out文件中)

[root@cyr <sub>]# ll
-rw-------. 1 root root 2525 May 6 22:14 nohup.out
[root@cyr </sub>]# ll
-rw-------. 1 root root 5405 May 6 22:14 nohup.out

[root@cyr ~]# tail -f nohup.out (可用tail -f 查看最新结果)
结束kill + 7239

screen将进程放入后台

screen :将程序放入后台(开启一个子shell)
## 安装screen命令
[root@cyr <sub>]# yum install -y screen
-ls:查看所有screen的后台进程
-r:指定后台进程号,进入该后台进程
-S:指定后台进程的名字
Ctrl + a + b:放在后台执行


[root@cyr </sub>]# screen -S ping_baidu
[detached from 8612.ping_baidu]

#(查看所有screen的后台进程)
[root@cyr <sub>]# screen -ls
There is a screen on:
8612.ping_baidu (Detached)
1 Socket in /var/run/screen/S-root.

#(指定后台进程号,进入该进程)
[root@cyr </sub>]# screen -r 8612
[detached from 8612.ping_baidu]
(使用kill + 进程号杀掉)
[root@cyr ~]# kill 8612

# 使用screen查看ping网站的丢包率
先使用screen 命令进入子shell,然后Ctrl + c暂停
--- baidu.com ping statistics ---
26 packets transmitted, 26 received, 0% packet loss, time 25046ms
rtt min/avg/max/mdev = 31.794/51.012/168.274/40.277 ms
(发送26个包,接收26个包,0%丢包率,时间25046ms)

平均负载

[root@cyr ~]# uptime
23:44:03 up 7:28, 2 users, load average: 0.00, 0.01, 0.05
# 后三个数分别是:过去一分钟、五分钟、十五分钟的平均负载

什么是平均负载

平均负载是指单位时间内,系统处于可运行状态(R)和不可中断状态(D)的平均进程数,也就是平均活跃进程数
平均负载与CPU使用率并没有直接关系

平均负载多少合理

最理想的状态是每个CPU上都刚还运行着一个进程,这样每个CPU都得到了充分利用
所以在评判负载时,首先你要知道系统有几个CPU
# 如何查看cpu的个数
1.top 按 1
2.cat /proc/cpuinfo
3.lscpu


假设现在在4,2,1核的CPU上,如果平均负载为2时,意味着什么呢?
1.在4个CPU的系统上,意味着CPU有50%空闲。
2.在2个CPU的系统上,以为这所有的CPU都刚好完全被占用。
3.在1个CPU的系统上,则意味着有一半的进程竞争不到CPU。
那么...平均负载有三个数值,我们应该关注哪个呢?(答:三个需要关注)


假设我们在有2个CPU系统上看到平均负载为2.73,6.90,12.98那么说明在过去1分钟内,系统有136%的超载(2.73/2*100%=136%)
5分钟:(6.90/2*100%=345%)
15分钟:(12.98/2*100%=649%)
但整体趋势来看,系统负载是在逐步降低。

## 平均负载多高需要关注呢?
当平均负载高于CPU数量70%的时候,你就应该分析排查负载高的问题了,一旦负载过高,就可能导致进程相应变慢,进而影响服务的正常功能。
但70%这个数字并不是绝对的,最推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势,当发现负载有明显升高的趋势时,比如说负载翻倍了,你再去做分析和调查。

cpu类型

平均负载指的是每单位时间内,处于可运行状态和不可中断状态的进程数,所以,它不仅包括了正在使用CPU的进程数,还包括等待CPU和等待IO的进程数。

而CPU的使用率是单位时间内,CPU繁忙情况的统计,跟平均浮现在并不一定完全对应。
比如:
CPU密集型进程,使用大量的CPU会导致平均负载升高,此时这两者是一致的。
IO密集型进程,等待IO也会导致平均负载升高,但CPU使用率不一定很高。

大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也会比较高。

## CPU的种类也分为两种
CPU密集型:计算相关
IO密集型:数据库相关服务

例如mysql服务器,就需要尽量选择使用IO密集型CPU

企业级负载分析实战

某一台服务器很卡,怎么办?

卡的原因:服务器负载太高

如何定位,什么程序导致负载高?
如何定位,负载高是哪个硬件引起的?


IO:磁盘IO导致负载升高
CPU:CPU使用率会导致负载升高
启动大量进程:导致负载升高


## 总结分析流程
1.使用uptime或者top命令,查看系统负载
2.看1分钟,5分钟,15分钟的负载趋势
3.是什么情况导致负载上升
mpstat -P ALL 5 是用户态,还是内核态导致负载上升
用户态:cpu使用率,大量进程
内核态:磁盘IO,压缩文件,网络存储挂载,下载文件,数据库查询语句
4.查看到底是那个程序,引起用户态或者内核态的负载上升?
pidstat -u 5 2
5.查到了是某个进程后
- 运维
执行了某条命令?
启动了某个服务?
- 开发
查看开发写好的程序日志,导出日志,交给开发

测试

## 完全是因为目前没有用户量(我们的虚拟机没有用户量,只是用来模拟负载升高)
stress是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景
[root@localhost <sub>]# yum install -y stress

## 分析负载
mpstat是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。
pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。

## 启动4个cpu密集型的进程,4个占用cpu的进程,600秒之后超时断开
[root@localhost </sub>]# stress --cpu 4 --timeout 600

## top看平均负载有没有升高

## 查看所有的cpu,5s显示一次数据
[root@localhost <sub>]# mpstat -P ALL 5
下面可以看出,是用户态的进程导致CPU过高
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 99.89 0.00 0.09 0.00 0.00 0.02 0.00 0.00 0.00 0.00
Average: 0 99.89 0.00 0.09 0.00 0.00 0.02 0.00 0.00 0.00 0.00

## %usr占用率高,是用户态进程,与cpu相关
## %sys占用率高,是内核态进程,与IO相关
## -u指定5s输出一次数据 2是共输出2组数据
[root@localhost </sub>]# pidstat -u 5 2

IO:磁盘IO导致负载升高命令
[root@localhost <sub>]# stress --io 100 --timeout 600
CPU:CPU会用率会导致负载升高命令
[root@localhost </sub>]# stress --cpu 100 --timeout 600
启动大量进程:导致负载升高命令
[root@localhost ~]# stress -c 100 --timeout 600


## 总结分析流程
1.使用uptime或者top命令,查看系统负载
2.看1分钟,5分钟,15分钟的负载趋势
3.是什么情况导致负载上升
mpstat -P ALL 5 是用户态,还是内核态导致负载上升
用户态:cpu使用率,大量进程
内核态:磁盘IO,压缩文件,网络存储挂载,下载文件,数据库查询语句
4.查看到底是那个程序,引起用户态或者内核态的负载上升?
pidstat -u 5 2
5.查到了是某个进程后
- 运维
执行了某条命令?
启动了某个服务?
- 开发
查看开发写好的程序日志,导出日志,交给开发

Linux假死怎么回事

什么是假死

所谓假死,就是能ping通,但是ssh连不上去,任何其他操作都没反应

系统假死为什么还能ping通无法连接

此时的机器可以ping通,但是无法ssh连上去。这是由于ping是在系统底层处理的,没有参与进程调度,ssh要参与进程调度,但是优先级没oom killer高,总得不到调度,所以无法连接

出现假死怎么办

假死的情况很少发生,只有当代码写出bug很多的情况下会出现
建议使用nice将sshd的进程优先级调高,这样当系统没存吃紧,还能勉强登录sshd,进入调试,然后分析故障


以上是关于进程管理的主要内容,如果未能解决你的问题,请参考以下文章

简单聊聊进程和线程

linux内核---嵌入式linux内核的五个子系统

httpd简介

使用swoole管理进程

supervisor管理子进程

python模块--subprocess