OSDI 2018管理系统
|
默认的核心策略中包含动态的 CPU 资源预估功能,它会使用以下的三个参数根据过去一段时间的负载和 CPU 使用情况调整当前应用程序申请的资源:
作为 Arachne 中的默认策略,它提供的一定是相对简单的、普适的模型,我们可以根据自己的需求调整策略中的三个参数,也可以实现其他的策略。 为了减少程序中的缓存丢失,Arachne 的调度器不会使用准备队列,它会持续检查当前 CPU 上的所有活跃线程直到发现可以运行的线程,因为以下的两个原因,这个看起来非常简单的轮训机制实际上非常高效: 在同一时间,单个 CPU 上应该只会包含少数几个线程上下文; 当前线程一定会由其他核心唤醒,因为跨核的传输会带来缓存丢失,而在触发缓存丢失时可以并行扫描全部上下文不会带来过大的开销; 因为线程可能处于阻塞状态等待特定的执行条件满足,所以上下文中会包含 wakeupTime,即线程多久后需要被唤醒;线程可以通过 block(time) 和 signal(thread) 两个方法改变 wakeupTime 通知调度器当前线程的状态和唤醒时间。 大多数的线程操作都需要在多个 CPU 之间通信,而跨核的通信会导致缓存缺失(Cahce Miss),缓存缺失大概需要 50 ~ 200 个 CPU 循环,这也是影响 Arachne 运行时性能的主要因素。为了解决缓存缺失带来的性能影响,运行时会在数据传输时并行执行其他的指令,优化 CPU 缓存以提升用户态线程的性能。线程的创建和调度是运行时的关键操作,优化这些操作的性能就可以降低延迟并提高吞吐量。 线程创建 多数的用户态线程管理器都会在同一个 CPU 上创建线程并使用工作窃取(Work-stealing)[^4]平衡多个 CPU 上的负载,但是工作窃取对于存在时间较短的线程来说是非常昂贵的,所以我们希望在线程创建时立刻触发负载均衡,将线程创建在其他的核心上;同时,为了减少程序中的缓存丢失,Arachne 将每一个线程的上下文都绑定了特定的 CPU 上,只有在仲裁者回收时才可能发生处理器迁移,大多数的线程在创建之后就不会触发迁移。当应用程序创建新的线程时:
(编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

