进程的优先级
进程的优先级指的是优先享受资源,就好比如我们生活排队买车票或者去银行办理业务,会有军人优先、老人优先或者vip客户窗口。
比如一些比较重要的进程拥有了优先级,就可以优先享用资源,避免在资源使用过载的情况下导致请求处理特别慢。
nice
在启动进程时,为不同的进程使用不同的调度策略。
nice命令用于以指定的进程调度优先级启动其他的程序。
nice 值越高: 表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低: 表示优先级越高,例如-20,该进程更不倾向于让出CPU。
正常情况下一般nice值都为0。
选项:
-n -n选项后面跟具体的niceness值。niceness值的范围-20~19,小于-20或大于19的值分别记为-20和19。
nice -n -20 //设置优先级为 -20
nice -n 19 //设置优先级为19
renice
renice命令可以修改正在运行的进程的调度优先级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
可用选项:
-g:指定进程组id;
-p<程序识别码>:改变该程序的优先权等级,此参数为预设值。
-u:指定开启进程的用户名。
将行程id为987及32的进程与进程拥有者为daemon及root的优先序号码加1:
renice 1 987 -u daemon root -p 32
注意:每一个进程都有一个唯一的id。
系统平均负载
当我们的系统运行变慢时,第一反应就是查看系统负载情况吧。在Linux系统中,uptime、w、top等命令都会有系统平均负载load average的输出
那么系统的平均负载是什么?
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,平均负载与 CPU 使用率并没有直接关系。
Load Average是CPU的Load,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用’wait’)
- 没有被停止(例如:等待终止)
例如:
命令输出的最后内容(0.15、0.05、0.06)表示在过去的1、5、15分钟内运行队列中的平均进程数量。[root@localhost ~]# uptime 20:03:01 up 12:00, 3 users, load average: 0.15, 0.05, 0.06
一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。对于上面的例子来说,假设系统有两个CPU,那么其每个CPU的当前任务数为:8.13/2=4.065。这表示该系统的性能是可以接受的。
可运行状态进程
可运行状态进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们ps 命令看到处于 R 状态的进程。
不可中断状态进程
系统中最常见的是等待硬件设备的 I/O 响应,也就是我们 ps 命令中看到的 D 状态(也称为 Disk Sleep)的进程。
当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的,这个时候的进程就处于不可中断状态。如果此时的进程被打断了,就容易出现磁盘数据与进程数据不一致的问题。所以,不可中断状态实际上是系统对进程和硬件设备的一种保护机制。
合理的平均负载值
最理想的状态是每个 CPU 上都刚好运行着一个进程,这样每个 CPU 都得到了充分利用。所以在评判平均负载时,首先你要知道系统有几个 CPU,这可以通过 top 命令获取,或grep 'model name' /proc/cpuinfo
在 4、2、1核的CPU上,如果平均负载为 2 时,不同的负载程度:
- 在4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。
- 在2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
- 而1 个 CPU 的系统上,则意味着有一半的进程竞争不到 CPU。
平均负载数值的变化:
- 如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
- 但如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内却有很大的负载。
- 反过来,如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续上升,所以就需要持续观察。
一般情况下,当平均负载高于 CPU 数量 70% 的时候,你就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。但 70% 这个数字并不是绝对的,最推荐的方法,还是把系统的平均负载监控起来,使用不同时间段的负载变化趋势来分析调查。
平均负载与 CPU 使用率有什么关系
CPU 使用率是单位时间内 CPU 繁忙程度的统计。而平均负载不仅包括正在使用 CPU 的进程,还包括等待 CPU 或 I/O 的进程。因此,两者不能等同,有两种常见的场景如下所述:
-
CPU 密集型应用:大量进程在等待或使用 CPU,此时 CPU 使用率与平均负载呈正相关状态。
-
I/O 密集型应用:大量进程在等待 I/O,此时平均负载会升高,但 CPU 使用率不一定很高。
平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。所以,在理解平均负载时,也要注意:
平均负载高有可能是 CPU 密集型进程导致的;
平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;
当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源