Linux 깊이 들 어 가 는 프로 세 스 우선 순위

다음으로 이동:http://liwei.life/2016/04/07/linux%E7%9A%84%E8%BF%9B%E7%A8%8B%E4%BC%98%E5%85%88%E7%BA%A7/
왜 프로 세 스 우선 순위 가 있어 야 합 니까?다 중 태 스 크 운영 체제 가 탄생 한 이래 로 프로 세 스 가 cpu 를 차지 하 는 능력 을 수행 하 는 것 은 인위적인 통제 가 필요 한 일 인 것 같 습 니 다.어떤 프로 세 스 는 상대 적 으로 중요 하지만,어떤 프로 세 스 는 그렇게 중요 하지 않 기 때문이다.
프로 세 스 우선 순위 가 작용 하 는 방식 은 발명 이래 거의 변화 가 없다.하나의 cpu 시대 든 다 핵 cpu 시대 든 제어 프로 세 스 가 cpu 시간 을 차지 하 는 길 이 를 통 해 이 루어 진다.같은 스케줄 링 주기 에 우선 순위 가 높 은 프로 세 스 가 차지 하 는 시간 이 길 고 우선 순위 가 낮은 프로 세 스 가 차지 하 는 시간 이 짧다 는 것 이다.
이런 측면 에서 볼 때 프로 세 스 우선 순위 도 cgroup 의 cpu 제한 과 마찬가지 로 cpu 가 차지 하 는 QOS 체제 입 니 다.저 는 항상 곤 혹 스 러 웠 습 니 다.왜 이미 우선 순위 가 있 고 cpu 를 위 한 cgroup 을 다시 설계 해 야 합 니까?얻 은 답 은 아마도 우선 순위 라 는 값 이 자원 분배 의 비율 을 직관 적 으로 피드백 하지 못 하기 때 문 일 것 이다.
그러나 이것 은 중요 하지 않 습 니 다.실제 커 널 의 현재 프로 세 스 스케줄 러 cfs 의 측면 에서 볼 때 cpushare 방식 을 동시에 실현 하 는 cgroup 과 우선 순위 라 는 두 체 제 는 똑 같은 개념 입 니 다.하나의 체 제 를 추가 했다 고 해서 어떤 실현 원 가 를 높이 지 는 않 습 니 다.그렇다면 cgroup 은 또 그렇게 멋 있어 보이 는데,왜 기꺼이 하지 않 겠 는가?
시스템 에서 우리 가 가장 잘 아 는 우선 순위 설정 방식 은 nice 와 renice 명령 입 니 다.그러면 우 리 는 먼저 하나의 개념,무엇이:
NICE 값
nice 값 은 Linux/UNIX 를 잘 아 는 사람들 이 잘 아 는 개념 일 것 입 니 다.우 리 는 모두 프로 세 스 의'우선 순위'상 태 를 반영 하 는 값 이라는 것 을 알 고 있 습 니 다.그 수치 범 위 는-20 에서 19 로 모두 40 개의 등급 입 니 다.이 값 은 작 을 수록 프로 세 스 의 우선 순위 가 높 고,값 이 클 수록'우선 순위'가 낮 음 을 나타 낸다.우 리 는 나 이 스 명령 을 통 해 실행 할 명령 에 나 이 스 값 을 설정 할 수 있 습 니 다.방법 은:
 
  
  1. [root@zorrozou-pc0 zorro]# nice -n 10 bash

这样我就又打开了一个bash,并且其nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。我们可以通过nice命令直接查看到当前shell的nice值

 
  
  1. [root@zorrozou-pc0 zorro]# nice
  2. 10

对比一下正常情况:

 
  
  1. [root@zorrozou-pc0 zorro]# exit

推出当前nice值为10的bash,打开一个正常的bash:

 
  
  1. [root@zorrozou-pc0 zorro]# bash
  2. [root@zorrozou-pc0 zorro]# nice
  3. 0

另外,使用renice命令可以对一个正在运行的进程进行nice值的调整,我们也可以使用比如top、ps等命令查看进程的nice值,具体方法我就不多说了,大家可以参阅相关manpage。

需要大家注意的是,我在这里都在使用nice值这一称谓,而非优先级(priority)这个说法。当然,nice和renice的man手册中,也说的是priority这个概念,但是要强调一下,请大家真的不要混淆了系统中的这两个概念,一个是nice值,一个是priority值,他们有着千丝万缕的关系,但对于当前的Linux系统来说,它们并不是同一个概念。

我们看这个命令:

 
  
  1. [root@zorrozou-pc0 zorro]# ps -l
  2. F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
  3. 4 S 0 6924 5776 0 80 0 - 17952 poll_s pts/5 00:00:00 sudo
  4. 4 S 0 6925 6924 0 80 0 - 4435 wait pts/5 00:00:00 bash
  5. 0 R 0 12971 6925 0 80 0 - 8514 - pts/5 00:00:00 ps

大家是否真的明白其中PRI列和NI列的具体含义有什么区别?同样的,如果是top命令:

 
  
  1. Tasks: 1587 total, 7 running, 1570 sleeping, 0 stopped, 10 zombie
  2. Cpu(s): 13.0%us, 6.9%sy, 0.0%ni, 78.6%id, 0.0%wa, 0.0%hi, 1.5%si, 0.0%st
  3. Mem: 132256952k total, 107483920k used, 24773032k free, 2264772k buffers
  4. Swap: 2101192k total, 508k used, 2100684k free, 88594404k cached
  5. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  6. 3001 root 20 0 232m 21m 4500 S 12.9 0.0 0:15.09 python
  7. 11541 root 20 0 17456 2400 888 R 7.4 0.0 0:00.06 top

PR NI ? , nice 。

nice priority, 。

, nice, 。 ? 、 。 , nice , , ,nice :“ !”, , nice! , nice 。 ? nice , nice 。 nice ,nice , nice, cpu , 。 O1 Linux , nice , nice , nice , renice , 。 priority O1 ,

nice , priority , ps PRI top PR 。 , nice NI , , nice renice ; priority PRI PR , 。 “ ” priority 。

, , MAX_PRIO, 140。 , nice NICE_WIDTH , (realtime) MAX_RT_PRIO 。 ,Linux 140 , 0-139, , 。nice -20 19, 100-139。 :

 
  
  1. #define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2)

nice 0。 , , nice renice , 100-139 , , 0-99 。 , Linux 。

, , 。 , , , 。 , , O1 CFS , , 100 , (nice ), , 。 ,Linux :

。 0-99 , , , 100-139 。 chrt 、 。 chrt :

 
  
  1. [root@zorrozou-pc0 zorro]# chrt
  2. Show or change the real-time scheduling attributes of a process.
  3. Set policy:
  4. chrt [options] <priority> <command> [<arg>...]
  5. chrt [options] -p <priority> <pid>
  6. Get policy:
  7. chrt [options] -p <pid>
  8. Policy options:
  9. -b, --batch set policy to SCHED_OTHER
  10. -f, --fifo set policy to SCHED_FIFO
  11. -i, --idle set policy to SCHED_IDLE
  12. -o, --other set policy to SCHED_OTHER
  13. -r, --rr set policy to SCHED_RR (default)
  14. Scheduling flag:
  15. -R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR
  16. Other options:
  17. -a, --all-tasks operate on all the tasks (threads) for a given pid
  18. -m, --max show min and max valid priorities
  19. -p, --pid operate on existing given pid
  20. -v, --verbose display status information
  21. -h, --help display this help and exit
  22. -V, --version output version information and exit
  23. For more details see chrt(1).

Policy options , 5 。 , , :SCHED_FIFO、SCHED_RR, :SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。

: , 。 CPU , 。 1-99, :

 
  
  1. [root@zorrozou-pc0 zorro]# chrt 10 bash
  2. [root@zorrozou-pc0 zorro]# chrt -p $$
  3. pid 14840's current scheduling policy: SCHED_RR
  4. pid 14840's current scheduling priority: 10

, bash , SCHED_RR, 10。 , :

 
  
  1. [root@zorrozou-pc0 zorro]# chrt -f 10 bash
  2. [root@zorrozou-pc0 zorro]# chrt -p $$
  3. pid 14843's current scheduling policy: SCHED_FIFO
  4. pid 14843's current scheduling priority: 10

,SCHED_RR SCHED_FIFO , 。 , ( priority ) 。SCHED_RR SCHED_FIFO , :

SCHED_FIFO: , , , CPU。

SCHED_RR: 。 100ms。

Linux 。 , 。 , Linux 。 , :O1 CFS。

O1

O1 Linux 2.6 , Linux 2.6.23 CFS。 O1 , Linux , O1 , 。 O1, O1。

O1 。 , CPU , 5ms 。 “ ” , 5ms cpu , 1s , “ ” 。 , , 。 , ? , , 。 , 。O1 , nice , CPU :CPU IO 。 CPU , CPU , , 。 。 IO , CPU , vi,emacs IO 。

? IO , shell、 。 , CPU , nice , , 500ms, CPU CPU 。 , bash , CPU , CPU , 500ms , bash , bash ms , , , bash 。 IO , , CPU , IO , CPU 。 nice -20 - 19, priority 100-139, nice 0 , priority 120, , CPU , priority , +-5。 , 115, 125。 nice priority 。 CFS , CFS CPU , 。

O1 CPU , 。 5 :

  • S(Interruptible sleep): 。
  • D(Uninterruptible sleep): 。
  • R(Running or runnable): 。
  • Z(Zombie process): 。
  • T(Stopped): 。

CPU , R , 。 , CPU , 。 , CPU , 8 CPU 4 , cpu , 4 “ ” , CPU 。

, (R ) CPU , “ ” 。 , , 。 CPU , 。 , ,R , 。 uptime (load average):

 
  
  1. [zorro@zorrozou-pc0 ~]$ uptime
  2. 16:40:56 up 2:12, 1 user, load average: 0.05, 0.11, 0.16

load average 1 ,5 ,15 ( R )。 , CPU 。 , 1 load average 16, CPU 32 , 。 CPU 8 , 。 , 。 , , 。

O1 :

  1. , (fork) 。 , 。 , , 。 , 100ms, fork , 50ms, 50ms。 , fork 。 , , , 1/4。 , , , 。
  2. R ,O1 , , 。 , 。
  3. 1 , , CPU 。 tick CPU 。 tick cpu , 1000 , 1000HZ。 tick :1、 CPU ?2、 ? , , , 。

O1 , , SMP( ) , CPU 。 archlinux HZ :

 
  
  1. [zorro@zorrozou-pc0 ~]$ zgrep CONFIG_HZ /proc/config.gz
  2. # CONFIG_HZ_PERIODIC is not set
  3. # CONFIG_HZ_100 is not set
  4. # CONFIG_HZ_250 is not set
  5. CONFIG_HZ_300=y
  6. # CONFIG_HZ_1000 is not set
  7. CONFIG_HZ=300

HZ 300, 1000。 , (100、250、300、1000), ?

CFS

O1 , 、 CPU , cgroup ,Linux 2.6.23 CFS (SCHED_OTHER) 。 , , 、 IO ,CPU 。CFS , 。

, 。 : ? IO CFQ : n , , n , cpu , 。 R , : R , 。 , :sched_latency_ns。 , 。 CPU , CPU , vruntime 。 vruntime key , , , vruntime , 。

CFS O1 , , , 。 , :

  1. 。 。
  2. CPU 。 sleep CPU, , sched_yield() CPU。
  3. vruntime (delta_exec > ideal_runtime)。 ideal_runtime sched_latency_ns/ n。 , 。
  4. 、 , 。 。

CFS

,CFS 。 , (vruntime ) 。 , CFS , vruntime , , , 。 , 19 , cpu 1 , vruntime 1s。 -20 , CPU 10s, vruntime 1s。CFS nice cpu “ cpu 10% ” 。 , nice 0 cpu, 50% cpu, nice 1 , 10% cpu, nice 0 55%,nice 1 45%。 cpu 55:45。 1.25。 , nice cpu 1.25。 , 40 nice , :

 
  
  1. static const int prio_to_weight[40] = {
  2. /* -20 */ 88761, 71755, 56483, 46273, 36291,
  3. /* -15 */ 29154, 23254, 18705, 14949, 11916,
  4. /* -10 */ 9548, 7620, 6100, 4904, 3906,
  5. /* -5 */ 3121, 2501, 1991, 1586, 1277,
  6. /* 0 */ 1024, 820, 655, 526, 423,
  7. /* 5 */ 335, 272, 215, 172, 137,
  8. /* 10 */ 110, 87, 70, 56, 45,
  9. /* 15 */ 36, 29, 23, 18, 15,
  10. };

, nice , 。 nice vruntime :

 
  
  1. delta vruntime delta Time * 1024 / load

, nice 0 ( 1024), vruntime (delta vruntime) :CPU (delta Time)* 1024 / load。 load sched_entity , (R ) 。load , 。CPU , delta vruntime 。 cpu , , 。 , , :

 
  
  1. delta vruntime delta time * 1024 * (2^32 / (load * 2^32)) = (delta time * 1024 * Inverseload)) >> 32

nice Inverse(load) , prio_to_weight , , CPU :

 
  
  1. static const u32 prio_to_wmult[40] = {
  2. /* -20 */ 48388, 59856, 76040, 92818, 118348,
  3. /* -15 */ 147320, 184698, 229616, 287308, 360437,
  4. /* -10 */ 449829, 563644, 704093, 875809, 1099582,
  5. /* -5 */ 1376151, 1717300, 2157191, 2708050, 3363326,
  6. /* 0 */ 4194304, 5237765, 6557202, 8165337, 10153587,
  7. /* 5 */ 12820798, 15790321, 19976592, 24970740, 31350126,
  8. /* 10 */ 39045157, 49367440, 61356676, 76695844, 95443717,
  9. /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153,
  10. };

, :kernel/shced/fair.c(Linux 4.4) __calc_delta() 。

CFS , vruntime 。 vruntime , , , vruntime ,CFS ? , 。CFS sched_min_granularity_ns , CPU 。

 
  
  1. [zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_min_granularity_ns
  2. 2250000

, , :sched_latency_ns, :

 
  
  1. [zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_latency_ns
  2. 18000000

, n, CPU sched_latency_ns/n。 , CPU n 。 , sched_min_granularity_ns 。 , sched_min_granularity_ns , sched_latency_ns , n * sched_min_granularity_ns 。 , CFS ” ”, ,CFS O1 “ “ , 。

VRUNTIME

CFS vruntime , , , vruntime 。 vruntime 0 , CPU , vruntime , 。 CFS CPU min_vruntime , CPU vruntime , , vruntime 0, min_vruntime 。 vruntime , vruntime 0 CPU。

vruntime , :

 
  
  1. [zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_child_runs_first
  2. 0

fork 。0 ,1 。 , , 。 , kernel/sched/features.h , 。 :

 
  
  1. /*
  2. * Place new tasks ahead so that they do not starve already running
  3. * tasks
  4. */
  5. SCHED_FEAT(START_DEBIT, true)

。 vruntime , fork 。 ,vruntime , vruntime min_vruntime。 START_DEBIT true, min_vruntime , , calc_delta_fair() 。 , sched_child_runs_first , ( 1), vruntime vruntime , vruntime , vruntime , 。

IO

, CPU CPU , IO , CPU, S 。 vim,bash , , ( ) select、poll、epoll 。 CFS , CPU , sleep , vruntime , , 。 O1 , IO , “ ” 。

, CPU IO , , CPU。 , vruntime , , vruntime , 。 ,CFS 。 , sleep , GENTLE_FAIR_SLEEPERS true, vruntime sched_latency_ns vruntime 。sched_latency_ns :

 
  
  1. [zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_latency_ns
  2. 18000000

,IO 。 CFS , : 。 。 ( ) select、poll、epoll , , apche、nginx php-fpm 。 nanosleep() , , CPU, sleep 。 , sleep , , CPU 。 ,CPU , 。 。

 
  
  1. [root@zorrozou-pc0 zorro]# cat /sys/kernel/debug/sched_features
  2. GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK LB_BIAS NONTASK_CAPACITY TTWU_QUEUE RT_PUSH_IPI NO_FORCE_SD_OVERLAP RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD

kernel/sched/features.h , WAKEUP_PREEMPTION : sleep 。 :

 
  
  1. [root@zorrozou-pc0 zorro]# echo NO_WAKEUP_PREEMPTION > /sys/kernel/debug/sched_features
  2. [root@zorrozou-pc0 zorro]# cat /sys/kernel/debug/sched_features
  3. GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY NO_WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK LB_BIAS NONTASK_CAPACITY TTWU_QUEUE RT_PUSH_IPI NO_FORCE_SD_OVERLAP RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD

。 , kernel/sched/features.h 。

sched_wakeup_granularity_ns , 。 CFS , vruntime , 。 sched_wakeup_granularity_ns , vruntime vruntime sched_wakeup_granularity_ns , 。 sched_wakeup_granularity_ns , 。

CFS

SCHED_BATCH

,CFS chrt SCHED_OTHER , 。 , :SCHED_BATCH SCHED_IDLE。 CFS , SCHED_BATCH , SCHED_OTHER 。 , chrt SCHED_OTHER ,CFS CPU , IO 。 , CPU , (batch), , 。 , SCHED_BATCH sched_yield cpu cfs , CPU ( sched_yield) vruntime , 。 , 。

SCHED_IDLE

SCHED_IDLE , , nice 19 。 CPU 。 , CFS 。

SCHED_DEADLINE

Linux SCHED_DEADLINE。 IO , , 。 chrt , 。

,SCHED_BATCH SCHED_IDLE , ( nice ) 0 。 :

 
  
  1. [zorro@zorrozou-pc0 ~]$ chrt -i 0 bash
  2. [zorro@zorrozou-pc0 ~]$ chrt -p $$
  3. pid 5478's current scheduling policy: SCHED_IDLE
  4. pid 5478's current scheduling priority: 0
  5. [zorro@zorrozou-pc0 ~]$ chrt -b 0 bash
  6. [zorro@zorrozou-pc0 ~]$ chrt -p $$
  7. pid 5502's current scheduling policy: SCHED_BATCH
  8. pid 5502's current scheduling priority: 0

CPU CFS

, CPU, 。 CPU ,CFS , CPU , CPU 。 CFS O1 : CPU , , 。 , CPU , CPU ,CFS CPU load balance , CPU 。 CPU , 。 ,CFS O1 。 CPU , 。

CFS CPU idle_balance() , CPU schedule() , CPU CPU 。 /proc/sched_debug CPU 。 , , ( ) 。

CFS CPU , CPU 。 ,CFS vruntime min_vruntime, min_vruntime, CPU 。

Linux , , 。 CFS 。 , 。 top ,NI PR ? ps NI PRI 、ulimit -e -r 。 , , 。 , , top PR ps -l PRI , , 。 ? 。

좋은 웹페이지 즐겨찾기