当前位置: 首页 > article >正文

[系统优化] 系统调度策略调整笔记

文章目录

  • 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

http://www.kler.cn/a/375548.html

相关文章:

  • web三、 window对象,延时器,定时器,时间戳,location对象(地址),本地存储-localStorage,数组去重new Set
  • Pytorch | 从零构建EfficientNet对CIFAR10进行分类
  • img向后端获取图片时怎么解决需携带token的问题
  • 混合开发环境---使用编程AI辅助开发Qt
  • 冯诺依曼架构与哈佛架构的对比与应用
  • 关于使用拓扑排序算法实现解析勾稽关系优先级的研究和实现
  • 重新修改我的标志
  • metasploit/modules/payloads 有哪些模块,以及具体使用案例
  • springboot框架使用RabbitMQ举例代码
  • ansible详细介绍和具体步骤
  • 4路CAN转WiFi网关
  • 《影像科学与光化学》
  • php反序列化常见魔术方法整理
  • 硅谷甄选(三)登录注册
  • Cloud Native Spring in Action
  • 排序算法:从原理到 Java 实现
  • 【JavaGuide】十大经典排序算法总结
  • B站狂神说+mybatis增删改查操作
  • 提升网站安全性 HTTPS的重要性与应用指南
  • 后端:Spring、Spring Boot-实例化Bean依赖注入(DI)
  • 【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】
  • (10)文件操作
  • linux虚拟机上使用USB转串口工具
  • HTTP 全知道:请求与响应的深度剖析
  • Spring Boot JPA中的Page组件详解
  • 【时间之外】IT人求职和创业应知【23】