![jizilian](/assets/img/avatar_default.png)
Scan the ceilometer specs repository. Filter the result and fix the mistakes. Change-Id: Idfbc41c3b681aa57cd5153dffc2dae600a58efb9
4.4 KiB
Remove Eventlet from the API Server
https://blueprints.launchpad.net/ceilometer/+spec/remove-web-eventlet
As of Kilo, the WSGI application which provides the Ceilometer API can be run in two fundamentally different ways:
- As a Python command that runs a Werkzeug-based web server that is monkeypatched to use eventlet.
- As a WSGI application hosted by any WSGI server, often Apache + mod wsgi.
Hosting the server application in a dedicate WSGI host has performance, configuration and scaling advantages. Running the command line service, while convenient for simple testing, can result in difficult to diagnose bugs and unusual behaviors when it is monkeypatched to use eventlet. Since the Werkzeug server can (and as written, does) provide support for multi-process and multi-threaded interactions, the inclusion of eventlet should be removed.
Problem description
Eventlet monkeypatches the socket module to provide non-blocking network I/O. This can work well most of the time, but when unusual socket situations arise (for example the client frequently closes the connection before reading all the data the server would like to send) the produced tracebacks can be more difficult to use as debugging aids than those that are produced without eventlet in place. We want our tooling to be as useful as possible especially when there are situations that require debugging.
When using the Werkzeug service, using eventlet is fairly redundant as the web server is configured to run multiple processes.
Proposed change
We can resolve this problem relatively easily. At the moment eventlet
monkey patching is turned on for everything that is imported under
ceilometer.cmd
(through
ceilometer/cmd/__init__.py
). This is overkill. We should
evaluate which services benefit from it and turn it on only for those.
We can start with the API server.
Further, for the sake of guiding people to the best solutions, we should update documentation and guidance to downstreams to indicate that using a WSGI host is the better way to host the API service in production.
Alternatives
- Do nothing. This is a hygienic change that will benefit users and developers but is not strictly required.
Data model impact
None
REST API impact
None. If there is anything we've messed up.
Security impact
None.
Pipeline impact
None.
Other end user impact
None.
Performance/Scalability Impacts
For production environments, the guidance to use a WSGI host will provide more options for adjusting configuration for scaling and performance.
Other deployer impact
Deployers who wish to take advantage of the more direct guidance to use a WSGI host will have to do what it says.
Developer impact
None
Implementation
Assignee(s)
- Primary assignee:
-
chdent
- Other contributors:
-
None
- Ongoing maintainer:
-
chdent
Work Items
- Separate eventlet and non-eventlet commands into two different module directories, starting with the api module.
- Compare and contrast performance of the API server with and without eventlet paying specific attention to the impact on accessing the storage layer. Mike Bayer has pointed out that removing eventlet has little impact on a properly configured web server with a properly configured storage layer. We need to confirm this across the three styles of presenting the APU: WSGI host, Werkzeug with eventlet, Werkzeug without eventlet.
- Update developer and admin documentation.
Future lifecycle
This is a core service which will receive ongoing maintenance from the Ceilometer project. Once the API server is not using eventlet we can see if any of the other console scripts would benefit from the change.
Dependencies
No new dependencies.
Testing
Existing API tests will cover these changes.
Documentation Impact
As mentioned above developer and admin documentation will need to be updated to reflect the new guidance about the best service configuration.
References
None