我正在用 Python 编写一个事件聚合服务器,使用 Nginx + Gunicorn。在 1 cpu/2 核机器 (AWS c4.large) 上 CPU 达到最大值之前,系统可扩展到大约 300 rps。添加额外的 gunicorn 工作器或使用 eventlet 工作器只能在边缘上有所帮助(约 10%)。响应在 1-2ms 范围内(事件正在写入磁盘)。
从我的分析来看,gunicorn 似乎将所有时间和精力都花在了从套接字读取数据上(它在 sync.py 中的 select() 调用中)。与此同时,Nginx 本身占用了大约 2-3% 的 CPU。使用 UNIX 套接字不会改变网络套接字的性能配置文件。
由于这些事件非常小(约 200 字节),因此 gunicorn 似乎需要付出过多的努力才能将请求从套接字中取出。我希望能够在这些请求负载到达 gunicorn 之前以某种方式对其进行批处理,但我不知道该怎么做。有什么方法可以减少 gunicorn 所花费的努力/CPU 并提高每个盒子的吞吐量?
答案1
或许 https://medium.com/building-the-system/gunicorn-3-means-of-concurrency-efbb547674b7 将有助于
尝试不同的值 --workers