部署 当前项目 Passenger+Nginx 的模式部署,Passenger 采用的是免费版,最近想并发测试一下性能,Passenger 默认开启了 16 个进程处理请求,但是发现大部分时候只有第一个进程在处理了大量请求,其他进程都在闲置

1370740521 · 2022年11月01日 · 最后由 xiaox 回复于 2022年11月16日 · 749 次阅读

最近针对项目并发测试,发现通过横向扩展服务器的方式已经无法增加系统的 TPS 了,目前购买的阿里云 ECS 为 16C32G 的配置,启动了 16 个 Passenger 进程来处理 HTTP 请求,但是通过并发压力测试时,passager 的进程只有几个在工作,大量的进程处理请求数为 0,想请教大佬们 Passenger 有没有配置能让 http 请求均匀分配到 Passenger 进程中处理的配置。

目前项目采用的是 Nginx+Passenger,相关配置如下:

之前 passenger_max_requests 写的是 2000,也是一样的现象(忘记截图了),passenger_max_requests 改成 20 后也是如下图所示,大部分 Passenger 在闲置不处理 http 请求,当我 passenger_max_requests 数字增大到 2000 时,我 http 请求会偶尔会卡,可能原因是当一个 Passenger 的第一个进程处理的 http 请求太多,会卡住:

各位大佬之前有遇到过这个情况吗?

上 puma 解决问题

amonlei 回复

😂 puma 真能解决问题吗,晚上我们准备重新用 unicorn 试试,但是第一次部署 unicorn,不知道 unicorn 的监控怎么弄。

  1. 免费版只支持单线程,这应该是并发上不去的根本原因。
  2. passenger_max_requests,当 processed 大于该值时,线程销毁再创建新的线程;passenger_max_requests 根据机器性能自动计算最大值,但基本上不会大于 2000,所以和设置 0(不限制)是没区别,当并发比较大的时候,仅会有少量 processed 分配到其他线程。2000 和 20 的区别,当设置 20 的时候,看似有大部分 processed 分配到其他线程了但仍没有占满全部线程,那是因为一个线程到了 20 的时候已经被销毁了,你看到的是不断销毁和创建的新线程,从 id 可以看出。
  3. passenger_max_pool_size,官方算法 max_app_processes = (1024 * 32 * 0.75) / 150 = 163.84,这在免费版只代表有多少备用线程,不是并发线程。企业版的配置是完全不一样的,如有用过企业版的朋友可以分享一下。
xxqfamous 回复

👍 太感谢了,之前一直在分析代码层面的原因,后面才追溯到服务器这块,我们现在准备换成 puma unicorn 后,全部重新并发测试一下

passenger 活在过去了吧😂

1370740521 回复

系统换成 Puma 后,相同压力并发测试情况下,响应时间快了 10 倍,TPS 提高了 2.5 倍。👍 👍 👍 👍

1370740521 回复

cpu 和内存使用情况呢?

steve 回复

目前 CPU 整体还好,就是内存方面有很大的问题,内存上去了后,就算没有人使用内存也不会下降,可能是代码内存溢出导致的,但是内存溢出后系统不主动回收,这个有点头疼了

写溢出不太容易,😀

1370740521 回复

内存最高到多少?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号