如何扩展 CPU 绑定的 Twisted 应用程序?
How to scale a CPU bound Twisted application?
我正在开发一个扭曲的网络应用程序,它上传文件并对其进行加密,然后将 url+ 密钥返回给用户。
我的任务是扩展此应用程序。在超过3-4个并发上传请求的时刻,性能会明显下降。
我不是 Twisted 专家,但我认为这是因为它 运行 在单个 python 进程中,是一个高 cpu 应用程序和 GIL?
我该如何进行缩放?
如果这是一个不同的框架,比如 Flask,我会把 uwsgi 放在它前面,并扩展进程的数量。类似的东西对 Twisted 有用吗?如果有用,通常使用什么工具?
如果您认为可以将 uwsgi 放在应用程序前面,我想它非常接近无共享。因此,您可以 运行 程序的多个实例并从每个实例中获得一个核心的性能价值。
对于如何 运行 多个实例,有几个非常明显的选项。你可以在前面有一个负载平衡器。您可以让进程共享一个侦听端口。可能还有更多的可能性。
由于您的协议似乎是 HTTP,因此任何旧的 HTTP 负载平衡器都应该适用。它不需要 Twisted 或 Python 基于自身(尽管它当然可以)。
如果您更愿意共享一个侦听端口,Twisted 具有用于在进程之间传递文件描述符 (IReactorSocket
) 以及用于启动从父进程继承文件描述符的新进程的 API (IReactorProcess
).
我正在开发一个扭曲的网络应用程序,它上传文件并对其进行加密,然后将 url+ 密钥返回给用户。
我的任务是扩展此应用程序。在超过3-4个并发上传请求的时刻,性能会明显下降。
我不是 Twisted 专家,但我认为这是因为它 运行 在单个 python 进程中,是一个高 cpu 应用程序和 GIL?
我该如何进行缩放?
如果这是一个不同的框架,比如 Flask,我会把 uwsgi 放在它前面,并扩展进程的数量。类似的东西对 Twisted 有用吗?如果有用,通常使用什么工具?
如果您认为可以将 uwsgi 放在应用程序前面,我想它非常接近无共享。因此,您可以 运行 程序的多个实例并从每个实例中获得一个核心的性能价值。
对于如何 运行 多个实例,有几个非常明显的选项。你可以在前面有一个负载平衡器。您可以让进程共享一个侦听端口。可能还有更多的可能性。
由于您的协议似乎是 HTTP,因此任何旧的 HTTP 负载平衡器都应该适用。它不需要 Twisted 或 Python 基于自身(尽管它当然可以)。
如果您更愿意共享一个侦听端口,Twisted 具有用于在进程之间传递文件描述符 (IReactorSocket
) 以及用于启动从父进程继承文件描述符的新进程的 API (IReactorProcess
).