如题,现在有一个科学计算的后台服务,其中某一个接口单次请求,通信时间为 15 秒左右,单纯计算部分大概 4-5 秒。
因为服务不太注重稳定性,倒是想略微提高一下可用性,代码是纯 python 实现的,于是想到用 pypy 加速。(不考虑嵌入 jit 之类的黑魔法,整个项目行数五万左右,如果要对性能密集区域单独拿出来加速的话需要修改的地方太多了)
于是想到部署的问题,有没有带佬在 pypy 上跑过 gunicorn 的,因为我不清楚 gunicorn 的网关怎么做的,平时也只是用着方便而已。gunicorn 是否有 C 语言实现的部分与 pypy 不兼容的问题?如果有的话 pypy 应该如何部署网络服务呢?(还有一种可能是 pypy 就没法用来部署服务(悲))
===============================
web 框架 aiohttp
1
ebingtel 2020-11-13 11:32:13 +08:00
gunicorn 纯 py 实现……
|
2
black11black OP @ebingtel
我刚才看没人回复试着部署了一下,gunicorn 的二进制文件有问题啊,以前没遇到过这种情况。 一般用 pypy 都是直接从官网上下个二进制 pypy3,解压以后用 pypy3 启动,用 pypy3 -m pip 启动包管理器,这种情况是没添加到系统路径的。 但是 pypy3 -m pip install gunicorn 之后用 gunicorn 无法启动程序,因为它理论上应该放一个二进制文件到 /usr/local/bin 里的,但是实际上并没有。而且就算放了,如果我之前在 python3 上安装过 gunicorn,这个二进制文件又算谁的呢? 之后试了试虚拟环境,venv 搞了个虚拟环境,虚拟环境下安装 gunicorn 看看能不能添加二进制文件。试了试还是不行。 |
3
arischow 2020-11-13 13:05:48 +08:00
想请教,这个事情性能瓶颈在 gunicorn 吗?
|
4
linw1995 2020-11-13 14:27:34 +08:00
有没有排查过,是不是在协程中调用了耗时较长时间的同步函数。可以用 debug mode 排查一下是不是这个问题
https://docs.python.org/3/library/asyncio-dev.html#debug-mode |
5
nonduality 2020-11-13 17:50:45 +08:00
一个可能不对的建议:把耗时长的计算模块独立出来,用 pypy 跑,利用它提速(你最好 benchmark 一下提速效果);另用 gunicorn 跑一个 web 服务器,两者用某种协议如 RPC 通讯。
|
6
black11black OP @nonduality
大部分是字典操作,提速大概 5 秒变 2 秒的程度吧,未及预期但是已经满意。 |
7
nonduality 2020-11-14 10:38:00 +08:00
@black11black 我说把计算模块独立出来,是想让纯 Py 的代码能用 PyPy 加速,而 Gunicorn 则用 CPython 跑,两者互不影响。用 RPC 通讯是非常简单的,把计算模块简单包装一下就可以,用来提交计算任务并取回计算结果,一般不需要超过 20 行代码。
另外,你可以读下《高性能 Python 编程》,里头介绍了不少优化方法。因为我相信你的代码有很多可以优化的地方,包括数据读取后缓存、改变数据结构等等,甚至都不需要用 PyPy 。 |
8
black11black OP @nonduality
你说的书我读过,另外还有一本名字反过来的叫 python 高性能。你说的通信问题,为了实现高可用本身需要通讯模块异步 + 后端集群否则你单独搞出来个同步单节点其实很尴尬。我本人做过 python 的异步 RPC 模块和 go 对接,如果你也做过的话我不觉得你会认为这套东西可以十分轻松且十分可靠地接到复杂系统里,本身你的服务就不是一个单节点模型。 他那些书里写的加速方法确实有用,但是很多时候我们没有精力去做优化,一个最尴尬的问题是如果我不注重开发效率那么是什么原因促使我选择 python 的呢?所以大部分时候只会选择一些开箱即用的加速方式,包括 pypy3 也有很多奇妙的 bug,只能说能跑也得测试稳定性问题 |