Linux 깊이 들 어 가 는 프로 세 스 우선 순위
왜 프로 세 스 우선 순위 가 있어 야 합 니까?다 중 태 스 크 운영 체제 가 탄생 한 이래 로 프로 세 스 가 cpu 를 차지 하 는 능력 을 수행 하 는 것 은 인위적인 통제 가 필요 한 일 인 것 같 습 니 다.어떤 프로 세 스 는 상대 적 으로 중요 하지만,어떤 프로 세 스 는 그렇게 중요 하지 않 기 때문이다.
프로 세 스 우선 순위 가 작용 하 는 방식 은 발명 이래 거의 변화 가 없다.하나의 cpu 시대 든 다 핵 cpu 시대 든 제어 프로 세 스 가 cpu 시간 을 차지 하 는 길 이 를 통 해 이 루어 진다.같은 스케줄 링 주기 에 우선 순위 가 높 은 프로 세 스 가 차지 하 는 시간 이 길 고 우선 순위 가 낮은 프로 세 스 가 차지 하 는 시간 이 짧다 는 것 이다.
이런 측면 에서 볼 때 프로 세 스 우선 순위 도 cgroup 의 cpu 제한 과 마찬가지 로 cpu 가 차지 하 는 QOS 체제 입 니 다.저 는 항상 곤 혹 스 러 웠 습 니 다.왜 이미 우선 순위 가 있 고 cpu 를 위 한 cgroup 을 다시 설계 해 야 합 니까?얻 은 답 은 아마도 우선 순위 라 는 값 이 자원 분배 의 비율 을 직관 적 으로 피드백 하지 못 하기 때 문 일 것 이다.
그러나 이것 은 중요 하지 않 습 니 다.실제 커 널 의 현재 프로 세 스 스케줄 러 cfs 의 측면 에서 볼 때 cpushare 방식 을 동시에 실현 하 는 cgroup 과 우선 순위 라 는 두 체 제 는 똑 같은 개념 입 니 다.하나의 체 제 를 추가 했다 고 해서 어떤 실현 원 가 를 높이 지 는 않 습 니 다.그렇다면 cgroup 은 또 그렇게 멋 있어 보이 는데,왜 기꺼이 하지 않 겠 는가?
시스템 에서 우리 가 가장 잘 아 는 우선 순위 설정 방식 은 nice 와 renice 명령 입 니 다.그러면 우 리 는 먼저 하나의 개념,무엇이:
NICE 값
nice 값 은 Linux/UNIX 를 잘 아 는 사람들 이 잘 아 는 개념 일 것 입 니 다.우 리 는 모두 프로 세 스 의'우선 순위'상 태 를 반영 하 는 값 이라는 것 을 알 고 있 습 니 다.그 수치 범 위 는-20 에서 19 로 모두 40 개의 등급 입 니 다.이 값 은 작 을 수록 프로 세 스 의 우선 순위 가 높 고,값 이 클 수록'우선 순위'가 낮 음 을 나타 낸다.우 리 는 나 이 스 명령 을 통 해 실행 할 명령 에 나 이 스 값 을 설정 할 수 있 습 니 다.방법 은:
[root@zorrozou-pc0 zorro]# nice -n 10 bash
这样我就又打开了一个bash,并且其nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。我们可以通过nice命令直接查看到当前shell的nice值
[root@zorrozou-pc0 zorro]# nice
10
对比一下正常情况:
[root@zorrozou-pc0 zorro]# exit
推出当前nice值为10的bash,打开一个正常的bash:
[root@zorrozou-pc0 zorro]# bash
[root@zorrozou-pc0 zorro]# nice
0
另外,使用renice命令可以对一个正在运行的进程进行nice值的调整,我们也可以使用比如top、ps等命令查看进程的nice值,具体方法我就不多说了,大家可以参阅相关manpage。
需要大家注意的是,我在这里都在使用nice值这一称谓,而非优先级(priority)这个说法。当然,nice和renice的man手册中,也说的是priority这个概念,但是要强调一下,请大家真的不要混淆了系统中的这两个概念,一个是nice值,一个是priority值,他们有着千丝万缕的关系,但对于当前的Linux系统来说,它们并不是同一个概念。
我们看这个命令:
[root@zorrozou-pc0 zorro]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 6924 5776 0 80 0 - 17952 poll_s pts/5 00:00:00 sudo
4 S 0 6925 6924 0 80 0 - 4435 wait pts/5 00:00:00 bash
0 R 0 12971 6925 0 80 0 - 8514 - pts/5 00:00:00 ps
大家是否真的明白其中PRI列和NI列的具体含义有什么区别?同样的,如果是top命令:
Tasks: 1587 total, 7 running, 1570 sleeping, 0 stopped, 10 zombie
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
Mem: 132256952k total, 107483920k used, 24773032k free, 2264772k buffers
Swap: 2101192k total, 508k used, 2100684k free, 88594404k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3001 root 20 0 232m 21m 4500 S 12.9 0.0 0:15.09 python
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。 :
#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 :
[root@zorrozou-pc0 zorro]# chrt
Show or change the real-time scheduling attributes of a process.
Set policy:
chrt [options] <priority> <command> [<arg>...]
chrt [options] -p <priority> <pid>
Get policy:
chrt [options] -p <pid>
Policy options:
-b, --batch set policy to SCHED_OTHER
-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)
Scheduling flag:
-R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR
Other options:
-a, --all-tasks operate on all the tasks (threads) for a given pid
-m, --max show min and max valid priorities
-p, --pid operate on existing given pid
-v, --verbose display status information
-h, --help display this help and exit
-V, --version output version information and exit
For more details see chrt(1).
Policy options , 5 。 , , :SCHED_FIFO、SCHED_RR, :SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。
: , 。 CPU , 。 1-99, :
[root@zorrozou-pc0 zorro]# chrt 10 bash
[root@zorrozou-pc0 zorro]# chrt -p $$
pid 14840's current scheduling policy: SCHED_RR
pid 14840's current scheduling priority: 10
, bash , SCHED_RR, 10。 , :
[root@zorrozou-pc0 zorro]# chrt -f 10 bash
[root@zorrozou-pc0 zorro]# chrt -p $$
pid 14843's current scheduling policy: SCHED_FIFO
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):
[zorro@zorrozou-pc0 ~]$ uptime
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 :
- , (fork) 。 , 。 , , 。 , 100ms, fork , 50ms, 50ms。 , fork 。 , , , 1/4。 , , , 。
- R ,O1 , , 。 , 。
- 1 , , CPU 。 tick CPU 。 tick cpu , 1000 , 1000HZ。 tick :1、 CPU ?2、 ? , , , 。
O1 , , SMP( ) , CPU 。 archlinux HZ :
[zorro@zorrozou-pc0 ~]$ zgrep CONFIG_HZ /proc/config.gz
# CONFIG_HZ_PERIODIC is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
CONFIG_HZ_300=y
# CONFIG_HZ_1000 is not set
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 , , , 。 , :
- 。 。
- CPU 。 sleep CPU, , sched_yield() CPU。
- vruntime (delta_exec > ideal_runtime)。 ideal_runtime sched_latency_ns/ n。 , 。
- 、 , 。 。
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 , :
static const int prio_to_weight[40] = {
/* -20 */ 88761, 71755, 56483, 46273, 36291,
/* -15 */ 29154, 23254, 18705, 14949, 11916,
/* -10 */ 9548, 7620, 6100, 4904, 3906,
/* -5 */ 3121, 2501, 1991, 1586, 1277,
/* 0 */ 1024, 820, 655, 526, 423,
/* 5 */ 335, 272, 215, 172, 137,
/* 10 */ 110, 87, 70, 56, 45,
/* 15 */ 36, 29, 23, 18, 15,
};
, nice , 。 nice vruntime :
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 , , 。 , , :
delta vruntime = delta time * 1024 * (2^32 / (load * 2^32)) = (delta time * 1024 * Inverse(load)) >> 32
nice Inverse(load) , prio_to_weight , , CPU :
static const u32 prio_to_wmult[40] = {
/* -20 */ 48388, 59856, 76040, 92818, 118348,
/* -15 */ 147320, 184698, 229616, 287308, 360437,
/* -10 */ 449829, 563644, 704093, 875809, 1099582,
/* -5 */ 1376151, 1717300, 2157191, 2708050, 3363326,
/* 0 */ 4194304, 5237765, 6557202, 8165337, 10153587,
/* 5 */ 12820798, 15790321, 19976592, 24970740, 31350126,
/* 10 */ 39045157, 49367440, 61356676, 76695844, 95443717,
/* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153,
};
, :kernel/shced/fair.c(Linux 4.4) __calc_delta() 。
CFS , vruntime 。 vruntime , , , vruntime ,CFS ? , 。CFS sched_min_granularity_ns , CPU 。
[zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_min_granularity_ns
2250000
。
, , :sched_latency_ns, :
[zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_latency_ns
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 , :
[zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_child_runs_first
0
fork 。0 ,1 。 , , 。 , kernel/sched/features.h , 。 :
/*
* Place new tasks ahead so that they do not starve already running
* tasks
*/
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 :
[zorro@zorrozou-pc0 ~]$ cat /proc/sys/kernel/sched_latency_ns
18000000
,IO 。 CFS , : 。 。 ( ) select、poll、epoll , , apche、nginx php-fpm 。 nanosleep() , , CPU, sleep 。 , sleep , , CPU 。 ,CPU , 。 。
[root@zorrozou-pc0 zorro]# cat /sys/kernel/debug/sched_features
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 。 :
[root@zorrozou-pc0 zorro]# echo NO_WAKEUP_PREEMPTION > /sys/kernel/debug/sched_features
[root@zorrozou-pc0 zorro]# cat /sys/kernel/debug/sched_features
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 。 :
[zorro@zorrozou-pc0 ~]$ chrt -i 0 bash
[zorro@zorrozou-pc0 ~]$ chrt -p $$
pid 5478's current scheduling policy: SCHED_IDLE
pid 5478's current scheduling priority: 0
[zorro@zorrozou-pc0 ~]$ chrt -b 0 bash
[zorro@zorrozou-pc0 ~]$ chrt -p $$
pid 5502's current scheduling policy: SCHED_BATCH
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 , , 。 ? 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
연결 포트, 프로 세 스 중복 방지자바 에 전념 한 지 6 년 이 되 었 습 니 다. 자바 핵심 기술 QQ 군 가입 을 환영 합 니 다. 135138817, 매주 5 박 에 단체 주 들 이 기술 강 좌 를 진행 합 니 다. 시 작 된 자바 프로 세 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.