+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
张贺,多年互联网行业工作经验,担任过网络工程师、系统集成工程师、LINUX系统运维工程师
个人网站:www.zhanghehe.cn
笔者微信:zhanghe15069028807,现居济南历下区
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
优先级专题
概述
linux是一个比较有意思的系统,里面有很多地方体现了贴进人性的一面,比如在centos6当中,在free -m
的时候,系统给用户提供了两种视角:系统视角和应用视角的方式来观察系统当前的内存用量;再比如在优先级这里面,也是提供了两套,一套我称做是理性,理性就是固定死的,进程本身的优先级是多少就是多少,轮到谁登场(登上cpu)就是谁,进程本身不能更改,不能拒绝;还有一套我称做是感性优先级,就是进程可以选项明明到自己登场(登上cpu)时放弃登场的权利,而谦让给其它进程,注意进程可以选项降低自己的优先级暂时放弃登场的权利,但是不能提高自己的优先级去争抢。
linux的优先级分为两套:
-
理性:priority
-
感性:nice
Priority
linux当中进程的优先级范围是:0-139
1--99:实时优先级,越大优先级越高,一般不用我们调整。
100--139:静态优先级,数字越小优先级越高,我们一般调整的是这个,一共有40到priority值。
内核把cpu等待运行的进程放到140个队列当中,每一个队列即对应一个优先级,当cpu上当前进程运行完成之后,就直接根据队列的排序去队列里面取进程,这样无论是多少个进程,内核实际在扫描时只会扫描140个队列。
将要运行的队列是140队,那你有没有想过?那些已经运行完成的进程放到何处?其实还一套队列,同时也是140个队列,用于存放已经运行完成的进程状态,当第一套队列里面的进程用运行完成之后,就把第二套队列里面的进程当做第一套队列,这样周而复始。
Nice
nice的范围是-20---19,一共39个nice值,你会发现nice值范围与priority的范围是一样的都是40个,而且它们是对应关系,如下:
-
priority:100---139
-
nice :-20---19
在用户空间运行的进程默认的priority是20,对应的nice值也就是0,举个例子:
[root@zabbix ~]# top -p `pgrep mysqld`
top - 20:41:16 up 2:08, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3324936 total, 2365040 free, 368300 used, 591596 buff/cache
KiB Swap: 3538940 total, 3538940 free, 0 used. 2654428 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11045 mysql 20 0 1384160 199104 6748 S 0.0 6.0 0:22.17 mysqld
假如我们这个当前系统只有mysql在运行,没有其它进程,我们是可以考虑把mysql的优先调小一些,也就是调高一些。
下面演示一个调整优先级的案例:
//通过top命令我们看到mysql的优先级默认是0,所有进程的优先级默认都是0
[root@zabbix ~]# top -p `pgrep mysqld`
top - 20:41:16 up 2:08, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3324936 total, 2365040 free, 368300 used, 591596 buff/cache
KiB Swap: 3538940 total, 3538940 free, 0 used. 2654428 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11045 mysql 20 0 1384160 199104 6748 S 0.0 6.0 0:22.17 mysqld // 按r键,效果如下:
PID to renice [default pid = 11045] 11045 #输入要调整进程的PID号,回车之后再输入10
11045 mysql 20 0 1384160 199104 6748 S 0.0 6.0 0:22.52 mysqld
//效果如下图,优先级就变成10了
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11045 mysql 30 10 1384160 199104 6748 S 0.3 6.0 0:22.89 mysqld