linux调度
wh8_2011
这个作者很懒,什么都没留下…
展开
-
linux调度器(五)——进程管理与CFS
进程调度初始化 由于该过程涉及到进程的管理模块,这个模块的详细过程我们将在以后的机会介绍,所以这里,我们主要扣出与调度相关的内容。进程的创建内核入口为do_fork,首先我们简单的看一下它的主要行为:图 do_fork与CFS的交互 上图我们只是画了do_fork最普通的fork操作,及正常的启动状态,上面的三个sched_cla转载 2015-09-09 09:45:20 · 652 阅读 · 0 评论 -
初始化调度程序
5.9 初始化调度程序回到start_kernel函数中,mm_init()执行后,所有的绝大多数内存管理的初始化都完毕,后面的代码可以开开心心的使用Linux复杂、庞大而又高效的内存管理器了。来看下一个函数,超级重点的进程调度初始化函数sched_init()。不过自从Linux 2.6.23(2007年5月),内核引入了一种所谓的完全公平调度程序(Completely Fair Sched转载 2016-05-10 18:47:07 · 567 阅读 · 0 评论 -
进程相关的数据结构
为了管理进程,内核必须对每个进程所做的事情进行清楚的描述。例如,内核必须知道进程的优先级,它是正在CPU上运行还是因某些事件而被阻塞,给它分配了什么样的地址空间,允许它访问哪个文件等等。这些正是进程描述符的作用——进程描述符都是task_struct数据结构,它的字段包含了与一个进程相关的所有信息。因为进程描述符存放了那么多的信息,所以它是相当复杂滴。。。。不过别怕,我们解决主要矛盾,其他转载 2016-05-11 21:56:25 · 5883 阅读 · 0 评论 -
linux调度器(三)——周期性调度器与CFS
注:这里并没有详细分析到每个内部函数,如果要了解这些细节的话,可以看后面的OTHER CFS CLASS API及CFS主要的内部函数。 周期性调度器在调度框架上由scheduler_tick完成:在每一个cpu的时钟周期都触发一次该函数调用,它更新运行队列的时钟及load,然后调用当前进程的调度器类的周期调度函数。[cpp] view plaincopy转载 2015-09-09 09:43:24 · 1425 阅读 · 0 评论 -
CFS中一些调度参数的实现原理
在cfs调度中有这么几个常用的参数:sysctl_sched_latency:表示一段时间内,sched_entity肯定会被调度到一次,也就是一个sched_entity调度的最大的延时,2.6.35.13内核中默认是6ms。sysctl_sched_min_granularity:表示调度的最小粒度,如果调度的时间间隔小于这个时间段,内核是不会挑选其他sched_e转载 2016-07-27 09:05:56 · 1188 阅读 · 0 评论 -
CFS完全公平调度类
最近在学习Linux内核的相关知识,参考的资料是《Professional Linux Kernel Architecture》和linux2.6.24的内核源码。对Linux2.6.24中的核心调度器做一下总结。 Linux2.6.24内核采用分层的思想管理调度。可以看作两层,第一层被称为核心调度器,在核心调度器下面为调度器类。在调度器被调用时,它会查询调 度器类,得知接下来运行哪转载 2016-07-28 23:50:31 · 1225 阅读 · 0 评论 -
Linux调度域负载均衡-设计,实现和应用
第一部分:Linux负载均衡的设计一.负载均衡的原则1.确保每个cpu核心的负载均衡;2.在cpu和cache以及内存布局的影响下加权执行1。对于一般多核心cpu情况,以上两个原则可以简述为下面的原则:1.尽量不执行进程迁移,以确保cache的热度;2.除非各个cpu的负载已经严重失衡,执行负载均衡二.系统以及cpu的拓扑结构这个道理转载 2016-07-29 09:40:01 · 1893 阅读 · 0 评论 -
Linux CFS调度系统----周期性调度器
周期性调度器由scheduler_tick()函数实现,在每个时钟中断中都会调用该函数来更新一些统计量,并且会激活当前进程所属调度类的周期性处理接口,代码流程如下所示: 具体来说,scheduler_tick()做了以下工作: 1)更新就绪队列的实际时钟时间,不是虚拟时钟时间。 2)更新就绪队列权重数组cpu_load中的权重值转载 2016-08-01 08:10:11 · 790 阅读 · 0 评论 -
调度域(Scheduling Domain)
Scheduling Domains 引入的背景Scheduling Domains 是现代硬件技术尤其是多 CPU 多核技术发展的产物。现在,一个复杂的高端系统由上到下可以这样构成:它是一个 NUMA 架构的系统,系统中的每个 Node 访问系统中不同区域的内存有不同的速度。同时它又是一个 SMP 系统。由多个物理 CPU(Physical Package) 构成。这些物理 CP转载 2016-08-01 21:43:20 · 3863 阅读 · 0 评论 -
linux在多核处理器上的负载均衡原理
现在互联网公司使用的都是多CPU(多核)的服务器了,Linux操作系统会自动把任务分配到不同的处理器上,并尽可能的保持负载均衡。那Linux内核是怎么做到让各个CPU的压力均匀的呢?做一个负载均衡机制,重点在于:1. 何时检查并调整负载情况?2. 如何调整负载?先看第一个问题。如果让我这样的庸俗程序员来设计,我第一个想到的就是每隔一段时间检查一次负载是否转载 2016-08-01 21:45:20 · 5314 阅读 · 0 评论 -
Linux内核CPU负载均衡机制
还是神奇的进程调度问题引发的,参看Linux进程组调度机制分析,组调度机制是看清楚了,发现在重启过程中,很多内核调用栈阻塞在了double_rq_lock函数上,而double_rq_lock则是load_balance触发的,怀疑当时的核间调度出现了问题,在某个负责场景下产生了多核互锁,后面看了一下CPU负载平衡下的代码实现,写一下总结。内核代码版本:kernel-3.0.13-0.27转载 2016-08-01 22:06:45 · 3422 阅读 · 0 评论 -
Linux内核学习笔记(一)CFS完全公平调度类
Linux内核学习笔记(一)CFS完全公平调度类 最近在学习Linux内核的相关知识,参考的资料是《Professional Linux Kernel Architecture》和linux2.6.24的内核源码。对Linux2.6.24中的核心调度器做一下总结。 Linux2.6.24内核采用分层的思想管理调度。可以看作两层,第一层被称为核心调度器,在核心调度器下面为调度器类转载 2015-05-12 11:33:09 · 1384 阅读 · 0 评论 -
linux多CPU进程负载均衡解析
在linux中,支持对称smp的处理器模型,在多处理器的情况下,每个处理器都有自己的一个运行队列,这样就存在着分配不均的情况,有的cpu运行队列很多进程,导致一直很忙,有的cpu运行队列可能很少的进程甚至没有任何运行进程,导致cpu经常处于空转的状态,因此我们需要一种机制,来均衡各个cpu上运行队列的进程数。1数据结构为了支持多种多处理器模型,linux提出了调用域及组的概念,一个调用域可转载 2016-09-20 07:33:26 · 5378 阅读 · 0 评论 -
Linux Scheduling Domains
Scheduling Domains 引入的背景Scheduling Domains 是现代硬件技术尤其是多 CPU 多核技术发展的产物。现在,一个复杂的高端系统由上到下可以这样构成:它是一个 NUMA 架构的系统,系统中的每个 Node 访问系统中不同区域的内存有不同的速度。同时它又是一个 SMP 系统。由多个物理 CPU(Physical Package) 构成。这些物转载 2016-09-20 09:11:50 · 532 阅读 · 0 评论 -
Linux kernel中 __bitmap_weight函数的理解
对Linux kernel中 __bitmap_weight函数的理解 int __bitmap_weight(const unsigned long *bitmap, int bits){ int k, w = 0, lim = bits/BITS_PER_LONG; for (k = 0; k < lim; k++) w += hweight_long(bitmap[k])原创 2016-09-22 08:00:33 · 2966 阅读 · 0 评论 -
linux内核相关的两个问题
如果在命令行执行kill -9 1,那么结果是没有反应,连个提示都没有,实际上init进程是杀不死的,到底为何呢?kill指令实际上是发信号,如果一个进程对一个信号没有反应那么 原因可能有以下三点:1.该进程屏蔽了此信号;2.该进程是内核线程,手动屏蔽了此信号;3.内核忽略了此信号.我们看看init进程,它不是内核线程 (实际上在rest_init之初的init是内核线程,只是它马上exec到用户转载 2015-09-22 09:09:03 · 364 阅读 · 0 评论 -
Linux Scheduling Domains
Scheduling Domains 引入的背景Scheduling Domains 是现代硬件技术尤其是多 CPU 多核技术发展的产物。现在,一个复杂的高端系统由上到下可以这样构成:它是一个 NUMA 架构的系统,系统中的每个 Node 访问系统中不同区域的内存有不同的速度。同时它又是一个 SMP 系统。由多个物理 CPU(Physical Package) 构成。这些物转载 2015-11-07 12:45:17 · 663 阅读 · 0 评论 -
linux调度器(一)——概述
本次分析的kernel代码为2.6.32-220。并且我们先不考虑SMP。当前linux的调度程序由两个调度器组成:主调度器,周期性调度器(两者又统称为核心调度器);并且每个调度器包括两个内容:调度框架(其实质就是两个函数框架)及调度器类。调度器类是实现了不同调度策略的实例,如 CFS、RT class。它们的关系如下图:图 调度器的组成当前的内核支持两种调度器类(sc转载 2015-09-09 09:41:05 · 685 阅读 · 0 评论 -
linux调度器(八)——实时调度与SMP
实时调度器类实时调度类有两类进程:循环进程SCHED_RR:循环进程有时间片,随着进程的运行时间会减少。当时间片用完时又将其置为初值,并将进程置于队列末尾。先进先出SCHED_FIFO:没有时间片调度,运行后可执行任意长时间直到自己放弃CPU。实际上两类进程在相同优先级队列上都是先进先出的,只是一个有时间片一个没有时间片。 现在实时进程的调度其实就是使用之前内核的O(转载 2015-09-09 09:47:53 · 1125 阅读 · 0 评论 -
linux调度器(十)——调度器/proc信息解读
注下面的时间或时刻都是从rq->clock中获得的,而这个值是由update_rq_clock底层cpu来更新的。并且很多信息是需要内核配置CONFIG_SCHEDSTATS才有。/proc//sched$cat /proc/28733/sched cpu_test (28733, #threads: 1)---------------------转载 2015-09-09 09:49:46 · 717 阅读 · 0 评论 -
linux调度器(七)——other cfs class api and functions
OTHER CFS CLASS APIset_curr_task_fair(rq):将cpu运行队列里的当前运行进程设置为cfs运行队列里当前运行的进程(set_curr_task_fair),对于组调度则必须把它上级的se也设置为相应cfs_rq的当前运行进程。该接口主要用于修改某个进程的调度策略(__sched_setscheduler调度器类的运行队列信息也需要更新)或把一个进程从一转载 2015-09-09 09:47:05 · 503 阅读 · 0 评论 -
linux调度器(九)——调度器的配置参数
调度器的配置参数/proc/sys/kernel/sched_min_granularity_ns(4000000ns):sysctl_sched_min_granularity,表示进程最少运行时间,防止频繁的切换,对于交互系统(如桌面),该值可以设置得较小,这样可以保证交互得到更快的响应(见周期调度器的check_preempt_tick过程)/proc/sys/kernel/sc转载 2015-09-09 09:48:39 · 649 阅读 · 0 评论 -
linux调度器(四)——主调度器与CFS
当内核从系统调用返回,或者从中断处理程序返回,内核都会检查当前进程是否设置了TIF_NEED_RESCHED标志;或者进程主动放弃CPU时(sched_yield,sleep或者收到SIGSTOP,SIGTTOP信号)都会进入主调度器。同样的我们先看一下主调度的框架部分,该部分就是sched.c:schedule(void):关闭内核抢占如果进程之前是不可运行并且被内核抢占了,那么如果它现转载 2015-09-09 09:44:39 · 1155 阅读 · 0 评论 -
linux调度器(二)——CFS模型
本系列文章阅读的core是:2.6.32-220这里使用“模型”而不是“算法”是因为这东西实在不好用算法描述(但是它却运行得很好,包括性能)。 核心思想: 把CPU总时间按运行队列的所有se的权重分配给每个se。每个se使用cpu的顺序由它们已使用的cpu虚拟时间(vruntime)决定的,已使用的虚拟时间越少,它在运行队列的位置越靠左,那么它再次被调度执行的概率也就越高。转载 2015-09-09 09:42:31 · 523 阅读 · 0 评论 -
linux调度器(六)——应用层理解CFS及组调度
上面我们介绍了CFS及组调度相关的主要内容,但可能很多人还跟我一样有点云里雾里的,下面我们直接从应用层面上也查看CFS及组调度的效果。首先对于非组调度,决定它们运行时间的唯一因素就是weight,也就是我们知道的nice,我们可以通过renice来重新调整进程的优先级,然后再使用taskset将它们限定在同一个CPU上(CFS只是保证一个CPU的公平,所以你可以看到一个有趣的现象:如指定两个进程的转载 2015-09-09 09:46:10 · 576 阅读 · 0 评论 -
Idle进程的切换过程
每个cpu都有自己的运行队列,如果当前cpu上运行的任务都已经dequeue出运行队列,而且idle_balance也没有移动到当前运行队列的任务,那么schedule函数中,按照rt ,cfs,idle这三种调度方式顺序,寻找各自的运行任务,那么如果rt和cfs都未找到运行任务,那么最后会调用idle schedule的idle进程,作为schedule函数调度的下一个任务。转载 2015-09-16 09:54:40 · 1018 阅读 · 0 评论 -
Linux内核CPU负载均衡机制
还是神奇的进程调度问题引发的,参看Linux进程组调度机制分析,组调度机制是看清楚了,发现在重启过程中,很多内核调用栈阻塞在了double_rq_lock函数上,而double_rq_lock则是load_balance触发的,怀疑当时的核间调度出现了问题,在某个负责场景下产生了多核互锁,后面看了一下CPU负载平衡下的代码实现,写一下总结。内核代码版本:kernel-3.0.13-0.27转载 2015-09-16 09:31:43 · 2400 阅读 · 0 评论 -
linux在多核处理器上的负载均衡原理(2)
假如现在是 Core 3 在执行idle_balance,则先在domain 1里找最忙的group,找到第二忙的group是core 0(core 4不在domain 1里,所以不会找到它),再从core 0里找最忙的runqueue(运行队列),core 0就一个运行队列,所以直接就是它对应的runqueue了,然后从该runqueue里挪出几个任务到Core 3,这一层domain的均衡做完转载 2015-11-07 06:44:16 · 791 阅读 · 0 评论 -
Linux进程管理之SMP负载平衡
一:前言之前在分析Cpuset的时候提起过cpu负载平衡(load balance),当时因为分析的对象是cpuset,所以忽略了负载平衡的实现,在本节的分析中,我们来深入分析这一个过程.鉴于篇幅问题,这里只分析SMP系统的的负载平衡,至于超线性和NUMA的情况,这里就不做介绍了.另外,在本文的分析中还会涉及到之前对CFS以及CFS组调度的一些知识.如果有对这些不太熟悉的,建议先阅读本站有关C转载 2015-11-07 14:58:14 · 1803 阅读 · 0 评论 -
Linux-2.6.21的负载均衡
1负载均衡思想负载均衡是指多CPU系统(如SMP-Symmetric Multi-Processor,NUMA-Non Uniform Memory Architecture) 中的所有逻辑CPU发挥的功效相当,最大限度地利用所有的硬件资源,从而提高系统的性能。本文介绍Linux2.6.21内核负载均衡的设计思想。1.1调度域和调度组为了充分发挥硬件性能,在多CPU系统上做转载 2015-11-07 06:29:31 · 1033 阅读 · 0 评论 -
linux在多核处理器上的负载均衡原理
现在互联网公司使用的都是多CPU(多核)的服务器了,Linux操作系统会自动把任务分配到不同的处理器上,并尽可能的保持负载均衡。那Linux内核是怎么做到让各个CPU的压力均匀的呢?做一个负载均衡机制,重点在于:1. 何时检查并调整负载情况? 2. 如何调整负载?先看第一个问题。如果让我这样的庸俗程序员来设计,我第一个想到的就是每隔一段时间检查一次负载是转载 2015-11-07 06:45:19 · 3202 阅读 · 0 评论 -
多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间
多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 陈硕Blog.csdn.net/Solstice 自从 Intel Pentium 加入 RDTSC 指令以来,这条指令是 micro-benchmarking 的利器,可以以极小的代价获得高精度的 CPU 时钟周期数(Time Stamp Counter),不少介绍优化的文章[1]和书籍用它来比转载 2016-10-29 17:13:52 · 1360 阅读 · 0 评论