在任何多路复用资源的系统中,计算在哪里运行以及何时运行的调度问题都可能是最基本的问题。然而,就像计算机中许多其他重要问题一样(例如数据库中的查询优化),调度器的研究像钟摆一样,时而活跃,时而处于休眠状态,因为它被认为是一个“已解决”的问题。
调度一直是系统和网络中最基本的操作之一。它涉及将任务分配给CPU并在它们之间进行切换,这些决策对应用程序性能和系统效率都至关重要。长期以来,操作系统(OS)调度专注于公平性。
(资料图片仅供参考)
然而,近年来的两个发展导致了OS调度研究的复兴。首先,云计算的出现赋予了不同的,难以优化的指标。例如,微延迟和微秒(µs)尺度,这些指标在传统的调度器中没有被考虑。其次,摩尔定律的结束使得操作系统堆栈(包括调度)的专业化成为了继续提高性能的必要条件。
近年来有三篇论文或许实现了性能、可扩展性和策略选择相关的突破。第一篇论文挑战了低延迟(通常通过配置专用核心实现)和高利用率(需要核心重新分配)之间的假定权衡,通过在单微秒粒度上实现分配决策来解决这个问题。第二篇论文通过将策略的创建和操作进行分解,使得用户空间代理完全可以处理策略的创建和操作,而固定的内核机制则负责向代理通信事件和应用实施调度决策。第二篇论文根据微秒级灵活策略进行负载均衡和分配决策的能力,最终选择了根据应用程序选择策略的问题。
1. 微秒级核心重新分配第一篇论文由Ousterhout等人回答了一个基本问题,即操作系统中核心分配可以多快进行以及这种重新分配是否有益于应用程序的性能。该论文介绍的系统名为Shenango,挑战了广泛存在的观念,即在微秒级别上跨应用程序分配核心是不可行的,因为存在高开销和潜在的缓存污染。
在这篇论文中,作者们详细阐述了Shenango系统的设计和实现,包括如何实现快速核心重新分配,以及如何避免因重新分配而导致的性能下降。此外,作者们还通过大量的实验验证了Shenango系统的有效性,快速核心重新分配确实是可能的,并展示了其在性能方面的显著优势。
在Shenango操作系统中,我们实现了微秒级别的核心重新分配,其关键在于使用了专用调度核心。该核心每5微秒可以做出一次CPU核心的分配决策,以确保系统的高效性。为了确定何时从应用程序中分配或回收核心,Shenango监视每个应用程序的线程运行队列和网络数据包队列的长度,并使用其导数作为拥塞信号。这种方法可以有效避免系统拥塞,保障了系统的稳定性和可靠性。同时,该算法完全在专用核心上运行,该核心还管理将传入的网络数据包引导到其相应的目标应用程序的CPU核心。这使得整个系统的运行更加高效,同时也提高了系统的可靠性和安全性。
作者们展示了这种方法的有效性,通过展示如何通过细粒度的CPU核心重新分配,来改善在同一系统上共存的延迟敏感和批处理应用程序的性能。通过基于瞬时输入的数据包速率分配CPU核心,Shenango操作系统在使用5微秒核心重新分配间隔与100微秒间隔相比,前者的延迟降低了,后者的吞吐量提高了6倍以上。随后的研究表明,Shenango的微秒级调度程序还可以帮助缓解其他系统资源(例如缓存和内存带宽)的干扰,并向网络提供细粒度反馈以防止过载。
2. 部署操作系统调度到Linux的框架构建像Shenango这样高效的调度器是一个有趣的实验室练习,但是在生产环境中需要考虑更多的因素。比如,如何兼容现有的应用程序和操作系统(如Linux),如何满足不同的需求以及如何实现更高的可扩展性和可靠性等等。为了解决这些问题,一些Google的工程师构建了一个名为ghOSt的框架,该框架可以实现不同的调度策略,并将它们部署到Linux内核中,以方便用户更容易地使用。
ghOSt设计背后的关键理由是为了提高操作系统的灵活性。ghOSt从微内核中汲取灵感,将OS调度委托给用户空间代理,可以是全局的或每个CPU。这种方法的优点显而易见:用户空间代理可以根据不同的需求和场景制定不同的调度策略,而不仅仅是受限于内核代码的固有规则。因此,开发人员可以享受用户空间开发的灵活性,而不受内核代码的限制和长时间部署周期的困扰。
为了在用户空间代理和内核之间实现无缝的通信,ghOSt使用了共享内存来传递提示信息,使代理能够做出更明智的调度决策。这种方法不仅提高了操作系统的性能,而且还为应用程序提供了更广泛的功能和更高的效率。而最简化内核调度类,是ghOSt设计中最为重要的组成部分之一。内核调度类负责将代理传递的调度事件转换为内核可以理解的格式,并将处理结果返回给代理。
总的来说,ghOSt的设计使得操作系统变得更加灵活和高效,从而能够更好地满足不同用户的需求。它为开发人员提供了更多的自由度和创造空间,使得他们可以更好地实现自己的想法和创意。同时,ghOSt的设计也为用户提供了更好的体验和更快的响应速度,使得他们能够更加高效地完成工作。
ghOSt面临的最大挑战是内核组件与用户空间代理之间的通信延迟,可能需要达到5微秒。这可能会导致:
(1)竞争条件,例如,用户空间代理向已从线程的CPU掩码中删除的CPU来调度线程);
(2)低利用率,因为CPU保持空闲等待代理的调度决策。
ghOSt通过在共享内存上实现事务API来避免竞争条件,该API允许代理以原子方式提交调度决策。为了减轻第二个问题,作者们建议使用自定义的eBPF程序,在每个核心上本地运行并临时调度任务,直到收到代理的决策。当将其他操作系统功能卸载到用户空间(例如内存管理)时,相同的技术也适用。
3.选择最佳调度策略选项在引入ghOSt之后,可以轻松开发和部署自定义调度策略,但问题在于每个应用程序应该使用哪种策略。为了回答这个问题,McClure等人进行了全面的分析。
在引入ghOSt之后,可以轻松开发和部署自定义调度策略。然而,虽然这是一个不错的进展,但是使用哪种策略对于每个应用程序来说都是一个重要的问题。为了解决这个问题,McClure等人进行了全面的分析,并提出了以下建议:
首先,应该考虑应用程序的需求以及其性质。例如,一些应用程序需要保持高可用性,需要在任何时候都能够提供服务,因此需要使用具有高容忍度的策略。另一些应用程序可能会经常需要进行扩展,因此需要使用具有良好扩展性的策略。了解应用程序的性质是选择调度策略的关键。
其次,应该考虑数据中心的资源利用率。在数据中心中运行的应用程序通常会共享物理资源,例如CPU,内存和网络带宽。因此,应该选择那些可以最大程度利用这些资源的策略。例如,可以使用负载均衡策略来确保每个节点都能够平均分配负载,从而使整个数据中心的资源利用率最大化。
最后,应该考虑操作和管理的成本。一些策略可能会增加管理和操作的成本,因此需要权衡这些成本和性能。应该选择那些既能够满足应用程序的需求,又可以最小化操作和管理成本的策略。
作者们将调度过程分为两个不同的策略:在应用程序之间分配核心和在每个应用程序内的CPU之间平衡负载任务。令人惊讶的是,他们发现第二个策略相对简单;无论任务服务时间分布,核心数量,核心分配策略和负载均衡的开销如何,无论是延迟还是效率,都是最好的负载均衡策略。
相比之下,核心分配策略要复杂得多。例如,与过去的工作相反,作者们发现根据平均延迟或利用率主动回收应用程序的核心对于小任务的性能表现更好,而不是等待CPU变为空闲状态。他们还发现,在处理小任务时,最好为每个应用程序分配一定数量的CPU,而不是动态分配。
这项分析开辟了新的研究领域,例如开发实现可扩展为全局队列的新硬件,在模拟中表现甚至优于任务获取。此外,该研究没有考虑抢占的存在,因此需要进一步研究抢占策略如何影响调度决策。
4.小结这三篇论文,探讨了在操作系统调度器中如何引入现代化的方法。第一篇论文专注于构建尽可能快速的调度器,第二篇旨在简化实现并与现有应用程序和操作系统兼容的新策略。第三篇论文则探讨不同类型应用程序的最佳调度策略。最终,这三篇论文为致力于开发现代计算系统更好的调度策略作出了有益的贡献。这些论文强调了需要更好、更有效率、更灵活的操作系统调度程序,开辟了新的研究领域,并展示了操作系统调度策略持续发展和创新的重要性。
【参考文献】
Amy Ousterhout, Joshua Fried, Jonathan Behrens, Adam Belay, 和 Hari Balakrishnan (MIT CSAIL). “Shenango: Achieving High CPU Efficiency for Latencysensitive Datacenter Workloads. Proceedings of the 16th Usenix Symposium on Networked Systems Design and Implementation”, 2019. https://dl.acm.org/doi/10.5555/3323234.3323265 (https://www.usenix.org/conference/nsdi19/presentation/ousterhout)Jack Tigar Humphries (Google), Neel Natu (Google),Ashwin Chaugule (Google), Ofir Weisse (Google), Barret Rhoden (Google), Josh Don (Google), Luigi Rizzo (Google), Oleg Rombakh (Google), Paul Turner (Google), 和 Christos Kozyrakis (Stanford University and Google). “ghOSt: Fast & Flexible User-space Delegation of LinuxScheduling. Proceedings of the 28th ACM Symposium on Operating Systems Principles”, 2021. https://dl.acm.org/doi/10.1145/3477132.3483542Sarah McClure (UC Berkeley), Amy Ousterhout (UCBerkeley), Scott Shenker (UC Berkeley and ICSI), Sylvia Ratnasamy (UC Berkeley). "Efficient Scheduling Policies for Microsecond-scale Tasks." Proceedings of the 19th Usenix Symposium on Networked Systems Design and Implementation, 2022. https://www.usenix.org/conference/nsdi22/presentation/mcclure