为处理器添加一些并发/并行性

目前处理器是单线程的(除了 AMQP 监听器),并且运行在一个进程中。这是一个为处理器添加并发性的提案,这将带来巨大的性能提升。

https://storyboard.openstack.org/#!/story/2005423

问题描述

鉴于处理器在追赶到当前时间戳后,大部分时间都在等待,因此这不是一个关键特性。但是,这并不意味着代码需要进行大量的修改,并且可以带来巨大的性能提升。

更快的处理器可以更快地追赶到当前时间戳,这对于新的部署或需要重新处理较长时间段的情况非常有用。

提议的变更

此更改可以分为两个部分。第一部分(也是最简单的一部分)是通过使用 eventlet 绿线程,(伪)同时检索给定范围和时间段的所有指标。CloudKitty 已经依赖 eventlet,因此不需要新的依赖项。一旦支持 python2 被放弃,这部分就可以更新为使用 STL,并移除对 eventlet 的依赖(可以替换为 concurrent.futures 或 asyncio)。

该更改相当简单:在 worker 中,不要连续调用 _collect(每个指标类型一个),而应该同时调用它们。

第二部分是为每个 cloudkitty-processor 实例生成多个 worker。为此,建议使用 **cotyledon** 库,该库已被其他 OpenStack 服务(如 ceilometer)使用。同样,更改也比较小:不是继承 objectOrchestrator 应该从 cotyledon.Service 继承。还将添加一个 cotyledon.ServiceManager,生成多个 orchestrator 服务。

为了限制对网络和内存的负载,worker 的数量将是可配置的。

备选方案

  • 可以使用 STL 的多进程,而不是使用 cotyledon。但是,cotyledon 具有一些有用的功能,例如将信号转发到 worker。此外,未来可能会添加一些新的服务类型(评分代理等);cotyledon 可以轻松集成这些服务,而无需对代码进行大量更改。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

没有,除了显著的性能提升之外。

性能影响

将对处理器的性能进行显著改进。

其他部署者影响

开发人员影响

这为 cloudkitty 添加了一个新的依赖项:**cotyledon**。引入并发和并行性将鼓励开发人员采用函数式编程风格,以避免竞争问题。

实现

负责人

Gerrit 主题:adding-concurrency

主要负责人

peschk_l

工作项

  • 使用 eventlet 绿线程检索指标。

  • 使用 cotyledon 运行多个 cloudkitty-processor worker。

  • 在文档中添加一个 **编排 (orchestration)** 部分。它将包含有关如何配置 worker 数量以及如何配置协调 URL 的详细信息。

依赖项

  • cotyledon

测试

一旦这些场景实现,将通过 tempest 场景进行测试。

文档影响

将在文档中添加一个 **编排 (orchestration)** 部分。它将包含有关如何配置 worker 数量以及如何配置协调 URL 的详细信息。

参考资料