从 API 服务器移除 Eventlet

https://blueprints.launchpad.net/ceilometer/+spec/remove-web-eventlet

从 Kilo 版本开始,提供 Ceilometer API 的 WSGI 应用程序可以通过两种基本不同的方式运行

  • 作为使用 eventlet 补丁的基于 Werkzeug 的 Web 服务器运行的 Python 命令。

  • 作为由任何 WSGI 服务器(通常是 Apache + mod wsgi)托管的 WSGI 应用程序。

在专用的 WSGI 主机中托管服务器应用程序具有性能、配置和扩展优势。 运行命令行服务虽然方便简单的测试,但当它被补丁以使用 eventlet 时,可能会导致难以诊断的错误和异常行为。 由于 Werkzeug 服务器可以(并且如目前编写的那样)提供对多进程和多线程交互的支持,因此应删除 eventlet 的包含。

问题描述

Eventlet 补丁了 socket 模块以提供非阻塞网络 I/O。 这在大多数情况下效果很好,但当出现异常的 socket 情况时(例如,客户端在读取服务器想要发送的所有数据之前频繁关闭连接),生成的堆栈跟踪可能比没有 eventlet 的情况下的堆栈跟踪更难用作调试辅助工具。 我们希望我们的工具尽可能有用,*尤其*是在需要调试的情况下。

在使用 Werkzeug 服务时,使用 eventlet 有些多余,因为 Web 服务器配置为运行多个进程。

提议的变更

我们可以相对容易地解决这个问题。 目前,在 ceilometer.cmd 下导入的所有内容都启用了 eventlet 补丁(通过 ceilometer/cmd/__init__.py)。 这有些过头了。 我们应该评估哪些服务从中受益,并仅为这些服务启用它。 我们可以从 API 服务器开始。

此外,为了引导人们找到最佳解决方案,我们应该更新文档和指导,向下游说明使用 WSGI 主机是在生产环境中托管 API 服务的更好方法。

替代方案

  • 什么都不做。 这是一个卫生的更改,将使用户和开发人员受益,但并非绝对必要。

数据模型影响

REST API 影响

没有。 如果我们搞砸了什么。

安全影响

无。

Pipeline 影响

无。

其他最终用户影响

无。

性能/可扩展性影响

对于生产环境,使用 WSGI 主机的指导将为调整配置以进行扩展和性能提供更多选择。

其他部署影响

希望利用使用 WSGI 主机的更直接指导的部署者将不得不按照说明进行操作。

开发者影响

实现

负责人

主要负责人

chdent

其他贡献者

持续维护者

chdent

工作项

  • 将 eventlet 和非 eventlet 命令分成两个不同的模块目录,从 api 模块开始。

  • 比较并对比 API 服务器在有和没有 eventlet 时的性能,特别注意对访问存储层的影响。 Mike Bayer 指出,删除 eventlet 对配置良好的 Web 服务器和配置良好的存储层影响很小。 我们需要在三种呈现 APU 的样式中确认这一点:WSGI 主机、带有 eventlet 的 Werkzeug、不带 eventlet 的 Werkzeug。

  • 更新开发人员和管理员文档。

未来生命周期

这是一个核心服务,将由 Ceilometer 项目持续维护。 一旦 API 服务器不再使用 eventlet,我们就可以查看其他控制台脚本是否有任何可以从更改中受益。

依赖项

没有新的依赖项。

测试

现有的 API 测试将涵盖这些更改。

文档影响

如上所述,需要更新开发人员和管理员文档,以反映有关最佳服务配置的新指导。

参考资料