【问题标题】:Do multiple requests in Phusion passenger run in their own threads?Phusion 乘客中的多个请求是否在自己的线程中运行?
【发布时间】:2013-09-06 01:15:42
【问题描述】:

我有一个使用 Phusion 乘客 + Apache Web 服务器部署的 Ruby on Rails 应用程序。每个请求是否在 Phusion Passenger 产生的自己的线程中运行?

【问题讨论】:

    标签: ruby passenger


    【解决方案1】:

    Passenger(以及大多数其他应用程序服务器)每个线程运行的请求不超过一个。通常每个进程也只有一个线程。来自Phusion Passenger docs

    Phusion Passenger 支持两种并发模型:

    • 进程:单线程、多进程 I/O 并发。 每个应用进程只有一个线程,一次只能处理一个请求。这是 Ruby 应用程序传统上使用的并发模型。它具有出色的兼容性(可以与并非设计为线程安全的应用程序一起使用),但不适合应用程序必须等待大量外部 I/O(例如 HTTP API 调用)的工作负载,并且使用更多内存,因为每个进程都有很大的内存开销。

    • 线程:多线程、多处理 I/O 并发。每个应用程序进程都有多个线程(可通过PassengerThreadCount 自定义)。该模型提供了更好的 I/O 并发性并使用更少的内存,因为线程在同一进程中彼此共享内存。但是,如果应用程序并非设计为线程安全的,则使用此模型可能会导致兼容性问题。

    (强调我自己的)

    【讨论】:

    • PhusionPassenger免费版是否使用了进程并发模型?
    • 是的,Phusion Passenger 每个请求执行多个线程。如果允许,它会为每个请求创建一个进程,直到达到最大进程数。然后它开始向现​​有进程添加线程。免费版总是创建多个进程,这让我很头疼,因为我有一个在整个应用程序中应该是唯一的全局对象,但是我每个进程都得到一个实例(但这对于经典的 RoR 应用程序来说不是问题,因为它们不应该有这样的对象)。付费企业版(30 美元/月)声称能够将进程限制为每个应用程序 1 个。
    【解决方案2】:

    Passenger 开源版本每个应用程序仅使用一个线程,如您的 apache 虚拟主机文件中所列(不确定 nginx)。所以你可以想象你的应用程序的多个实例在同一个 apache 服务器上运行,但是你必须将你的应用程序安装到多个目录中,并将 vhosts 条目指向它们,并在其前面放置某种负载均衡器。 客运企业可以更好地控制并发。

    编辑:清晰度。

    【讨论】:

    • 这是不正确的。 Apache 中的线程数量完全独立于 Phusion Passenger,因此无论您使用的是开源还是企业版,都与它完全无关。线程数完全由 Apache MPM 设置(例如 ThreadsPerChild)决定。企业版所做 提供的是运行应用程序本身(不是Apache,不是Nginx)和多线程。
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多