Change-Id: I5281573843b990bdd569a4cc07904363cd4d4646
4.1 KiB
Adding some concurrency/parallelism to the processor
The processor is currently single-threaded (except for AMQP listeners) and running on a single process. This is a proposal to add some concurrency to the processor, which will lead to a huge performance improvement.
https://storyboard.openstack.org/#!/story/2005423
Problem Description
Given that the processor spends most of its time waiting once it has caught up with the current timestamp, this is not a critical feature. However, this does not imply much changes to the code, and would lead to a huge performance improvement.
Having faster processors allows to catch up with the current timestamp quicker, which is useful on new deployments, or when a long period needs to be re-processed.
Proposed Change
This change can be split into two parts. The first (and simplest) part would be to retrieve all metrics for a given scope and period (pseudo-)simultaneously, by making use of eventlet greenthreads. CloudKitty already depends on eventlet, so this requires no new dependency. Once support for python2 will have been dropped, this part can be updated in order to use the STL, and remove the dependency on eventlet (which could be replaced by concurrent.futures or asyncio).
The change is rather straightforward: rather than making consecutive
calls to _collect
(one per metric type) in the workers,
these should be made simultaneously.
The second part would be to spawn several workers for each
cloudkitty-processor instance. For this, the proposal would be to use
the cotyledon library, which is already used by other
OpenStack services, like ceilometer. Again, the change is quite small:
Instead of inheriting object
, the Orchestrator
would inherit from cotyledon.Service
. A
cotyledon.ServiceManager
spawning several orchestrator
services will also be added.
In order to limit the load on the network and memory, the number of workers will be configurable.
Alternatives
- Instead of using cotyledon, the STL's multiprocessing could be used. However, cotyledon has some useful features, like forwarding signals to the workers. Moreover, some new kind of services may be added in the future (rating agents etc...); cotyledon would allow to easily intergrate those without having to make much changes to the code.
Data model impact
None
REST API impact
None
Security impact
None
Notifications Impact
None
Other end user impact
None, apart from a notable performance improvement.
Performance Impact
A significant improvement to the processor's performance will be made.
Other deployer impact
None
Developer impact
This adds a new dependency to cloudkitty: cotyledon. Introducing concurrency and parallelism will encourage developpers to adopt a functional coding style, in order to avoid race issues.
Implementation
Assignee(s)
Gerrit topic: adding-concurrency
.
- Primary assignee:
-
peschk_l
Work Items
- Retrieve metrics in eventlet greenthreads.
- Make cloudkitty-processor run several workers with cotyledon.
- Add an orchestration section to the documentation. It will contain details about how to configure the number of workers and how to configure the coordination URL.
Dependencies
cotyledon
Testing
This will be tested by tempest scenarios, once these are implemented.
Documentation Impact
An orchestration section will be added to the documentation. It will contain details about how to configure the number of workers and how to configure the coordination URL.
References
- Cotyledon documentation: https://cotyledon.readthedocs.io/en/latest/index.html
- Eventlet documentation: https://eventlet.net/