09 Understand CPU Scheduling了解CPU调度
两个方面:拓扑结构
cpu调度
==================================================================================
架构NUMA
无numa 0-3 4-7 共享内存区域 一致性内存访问
numa0-3自己有内存控制器 访问自己区域的内存 本地内存访问无法访问再访问远程内存
CPU Scheduling
在一个时间内,一个CPU仅能执行一个进程
多个进程通过共享CPU时间片time slices
调度策略有两个主要分类:
1. 实时策略 占用cpu时间多 快速响应的进程 所有实时线程调度完后会调度一般线程
实时策略用于必须无间断完成的关键字时间任务
SCHED_FIFO 1-99 先进先出 进程优先级高先做 静态优先调度
SCHED_RR 1-99 轮询
2. 一般策略
SCHED_OTHER 默认,使用完全公平调度程序CFS(完全公平调度程序)进行调度。
SCHED_BATCH 以下两个用于低优先权调度
SCHED_IDLE
[root@uplook ~]# ps axo pid,command,cls
PID COMMAND CLS
1 /sbin/init TS //SCHED_OTHER
2 [kthreadd] TS
3 [ksoftirqd/0] TS
5 [kworker/0:0H] TS
7 [migration/0] FF //SCHED_FIFO
8 [rcu_bh] TS
9 [rcu_sched] TS
10 [watchdog/0] FF
11 [watchdog/1] FF
12 [migration/1] FF
13 [ksoftirqd/1] TS
14 [kworker/1:0] TS
15 [kworker/1:0H] TS
实时调度策略:
- SCHED_FIFO FIFO
- SCHED_RR RR
[root@uplook ~]# chrt -h
Scheduling policies:
-b | --batch set policy to SCHED_BATCH 批处理
-f | --fifo set policy to SCHED_FIFO
-i | --idle set policy to SCHED_IDLE
-o | --other set policy to SCHED_OTHER
-r | --rr set policy to SCHED_RR (default)
[root@uplook ~]# chrt -m 查看每种调度策略最大最小优先级
SCHED_OTHER min/max priority : 0/0 //nice值,-20 ------ 19
SCHED_FIFO min/max priority : 1/99
SCHED_RR min/max priority : 1/99
SCHED_BATCH min/max priority : 0/0 非实时都为0
SCHED_IDLE min/max priority : 0/0
pgrep sshd
[root@uplook ~]# chrt -p 2247 查询当前进程的策略和优先级
pid 2247's current scheduling policy: SCHED_OTHER
pid 2247's current scheduling priority: 0
[root@uplook ~]# chrt -p 7 可以通过axo查看实时
pid 7's current scheduling policy: SCHED_FIFO
pid 7's current scheduling priority: 99
[root@web1 ~]# chrt -p `which sshd`
pid 3177's current scheduling policy: SCHED_OTHER
pid 3177's current scheduling priority: 0
[root@uplook ~]# chrt -i 0 dd if=/dev/zero of=/dev/null & 设置某个进程的调度策略为idel 有人使用就会停止等其它优先级高的先运行
[root@uplook ~]# chrt -p 3451
pid 3451's current scheduling policy: SCHED_IDLE
pid 3451's current scheduling priority: 0
运行mdsum /dev/zero
实验环境:虚拟机 1cpu
LAB1:
终端一: chrt -f 10 md5sum /dev/zero
终端二: chrt -f 10 sha1sum /dev/zero
先入先出 相同级别 也要遵循先入先出 第1个退出才会上第二个
LAB2:
终端一: chrt -r 10 md5sum /dev/zero
终端二: chrt -r 10 sha1sum /dev/zero
和平共处
实时调度策略 静态优先级 设置好固定
一般调度策略 动态优先级 可以灵活调整
一般调度策略的优先级没有实时调度策略的优先级高
一般调度策略:
- SCHED_OTHER, NORMAL 该策略使用完全公平调度程序(CFS) <默认>
- SCHED_BATCH 主要用于低优先权任务
- SCHED_IDLE 主要用于低优先权任务
由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多
数进程所使用的调度策略为 SCHED_OTHER (也称为SCHED_NORMAL),但还有其它一些调度策略用于不同的目的。
SCHED_OTHER 调度策略运行的进程的相对优先级称为进程的 nice 值,可以有40种不同级别的nice值。
nice 值越高: 表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低: 表示优先级越高,例如-20,该进程更不倾向于让出CPU。
查看进程的nice级别
1. 使用top查看nice级别
NI: 实际nice级别
PR: 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
3. 使用ps查看nice级别
[root@uplook ~]# ps axo pid,command,nice --sort=-nice -nice升序 nice降序
[root@uplook ~]# ps axo pid,command,nice,cls --sort=-nice 调度策略
TS 表示该进程使用的调度策略为SCHED_OTHER
启动具有不同nice级别的进程
启动进程时,通常会继承父进程的 nice级别,默认为0。
父进程bash nice值为0 继承
[root@uplook ~]# nice -n -5 sleep 6000 &
[root@uplook ~]# ps axo command,pid,nice |grep sleep
[root@uplook ~]# nice -n -20 service httpd start
[root@uplook ~]# ps axo pid,command,nice,cls |grep httpd
11116 /usr/sbin/httpd -20 TS
11119 /usr/sbin/httpd -20 TS
11120 /usr/sbin/httpd -20 TS
11121 /usr/sbin/httpd -20 TS
11122 /usr/sbin/httpd -20 TS
11123 /usr/sbin/httpd -20 TS
11124 /usr/sbin/httpd -20 TS
11125 /usr/sbin/httpd -20 TS
11126 /usr/sbin/httpd -20 TS
top -d 1 -u apache 基于用户的进程
更改现有进程的nice级别
1. 使用top更改nice级别
r 调整进程的优先级(Nice Level) (-20高) ---0--- (19低)
r pid 数字
2. 使用shell更改nice级别
[root@uplook ~]# sleep 7000 &
[3] 10089
[root@uplook ~]# renice -20 10089
10089: old priority 0, new priority -20
taskset实现CPU亲和力
进程和cpu捆绑
将减少上下文切换的次数
[root@uplook ~]# lscpu |grep 'On-line'
On-line CPU(s) list: 0-3
[root@uplook ~]# taskset -c 2-3 service httpd start httpd运行在2-3号处理器上
[root@uplook ~]# top -d 1 -u apache top --->f ---j (P 显示在那个cpu上) 最后使用cpu的情况 shfit +W保存
cgroup: 利用cgroup实现CPU的亲和力
LAB1:
[root@uplook ~]# vim /etc/cgconfig.conf
group nginx {
cpuset {
cpuset.cpus=0-7;
}
}
group mysql {
cpuset {
cpuset.cpus=8-15;
}
}
LAB2:
[root@uplook ~]# vim /etc/cgconfig.conf
group httpd {
cpuset {
cpuset.cpus=0-1;
}
}
[root@uplook ~]# vim /etc/cgrules.conf
*:/usr/sbin/httpd cpuset httpd/
[root@uplook ~]# service cgred restart
[root@uplook ~]# service cgconfig restart
Nginx配置文件实现CPU亲和力
==================================================================================