[系统优化] 系统调度策略调整笔记
文章目录
- 1. 有哪些调度策略?
- 1.1 SCHED_OTHER
- 1.2 SCHED_FIFO
- 1.3 SCHED_RR
- 1.4 SCHED_BATACH
- 1.5 SCHED_IDLE
- 2. 调度设置
- 3. 经验总结
- Reference
参考文档:linux 官方doc:https://docs.kernel.org/scheduler/sched-rt-group.html
https://zhuanlan.zhihu.com/p/686081665
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_real_time/7/html/tuning_guide/real_time_throttling#Real_Time_Throttling
1. 有哪些调度策略?
- 通过chrt –m可以查看当前系统支持的调度策略
1.1 SCHED_OTHER
- 普通进程调度策略
- 也是将线程的调度策略设置为默认的动态优先级调度(通常是基于负载的调度),可以使用SCHED_OTHER策略
- 是常规调度策略,不支持线程优先级设置,只使用默认优先级0
1.2 SCHED_FIFO
- 实时进程调度策略,支持线程优先级设置,设置范围1-99
- 先到先服务 ; 进程 一旦 占有 CPU , 就一直运行 , 直到 有更高优先级的进程到达 时才放弃 CPU , 或者 进程自己放弃 CPU ;
- 等待进程主动放弃 才可以执行其它优先级相同的任务
- 所以这个调度策略是对普通进程来说是抢占式的
- 这个策略受到系统的两个参数控制,用于防止这种抢占式进程全占cpu后导致系统卡死的情况,所以系统一般在一定时间内将这种进程切换出去,只允许普通进程使用该cpu;如下设置,linux调度器为非实时进程预留5%的CPU时间片。下面的设置可能是一秒中有50ms的时间留给普通进程使用该cpu。一般默认情况下,linux系统会让实时进程只占用95%的CPU,防止系统出问题。
- kernel.sched_rt_period_us = 1000000 # 一般为默认值
- kernel.sched_rt_runtime_us = 950000
1.3 SCHED_RR
- 属于实时进程调度策略
- 时间片轮转 ; 进程分配到 CPU 时间片用于执行 , 该时间片用完后 , 该进程 放到该优先级队列的末尾 , 等待系统重新分配时间片执行 ;
- 这种策略可能不太好就是cpu的cache命中率会影响较大,因为一直切换导致cache命中率低,从而影响总的耗时。
1.4 SCHED_BATACH
- 保留
1.5 SCHED_IDLE
- idle进程调度策略
2. 调度设置
# 通过 下面命令去查找调度策略参数设置。
sysctl -a | grep sched_rt
sudo sysctl –w kernel.sched_rt_runtime_us = 500000
# 可以通过终端命令对某个进程进行调度优先级修改
sudo chrt -a -f -p 20 ${pid}
# 查看某个进程的调度策略
chrt –p ${pid}
- C++中如何对线程添加调度策略
#include <sched.h>
#include <sys/resource.h>
// set SCHED_OTHER
pid_t tid = getpid();
int sched_priority = ...;
setpriority(PRIO_PROCESS, tid, sched_priority);
// set FIFO/RR schedule
struct sched_param sched_p;
memset(reinterpret_cast<void*>(&sched_p), 0, sizeof(sched_p));
sched_p.sched_priority = sched_priority;
pthread_t thread = ...;
// 如果thread是std::thread, 则通过pthread_t thread = thread.native_handle();来获取底层pthread_t
int policy = SCHED_FIFO; // or SCHED_RR
int errr_no = pthread_setschedparam(thread, policy, &sched_p);
3. 经验总结
- FIFO 虽然让进程变为实时进程,提升进程效率,但是有可能会存在其他隐藏问题,比如对于CUDA的线程有可能有一些负面影响
- 另外FIFO虽然会加快当前线程,但是当硬件CPU不充裕的时候,会饿死普通线程,所以要注意这个策略的使用。
- 另外,因为系统会默认实时进程只占用95%的进程,那么
Reference
- https://cloud.tencent.com/developer/article/2253363