【问题标题】:FastCGI fork in cc语言中的FastCGI fork
【发布时间】:2011-09-21 14:11:03
【问题描述】:

我目前正在开发highload项目,我需要使用C/FastCGI/nginx组合。

问题是,我需要我的 FastCGI 应用程序在线程/进程中运行。

我知道有两种方法可以做到这一点:

1) 编译程序,然后使用 spawn-fcgi 来分叉进程。 (我不能用这个)

2) 运行 FCGX_Init(),而不是在 while (FCGX_Accept_r(&request) >= 0) 之前预分叉到 10 个进程

3) 在while (FCGX_Accept_r(&request) >= 0) 之后运行 pthreads

所以,我的问题是:whis 是运行 fastcgi 应用程序的最快方式。我可以在此之后预分叉 fastcgi 应用程序吗:

int sock = FCGX_OpenSocket(":9000", 10);
FCGX_InitRequest(&request, sock, 0);

10 个进程可以监听单个套接字吗? 如果我有 N 个进程正在运行,我是否必须使用线程?这样就够了吗?

【问题讨论】:

  • 为什么不能使用spawn-fcgi?这似乎是最好的选择,因为它会为您处理分叉的负载平衡。

标签: c pthreads fork fastcgi preforking


【解决方案1】:

我不知道您具体使用的 FastCGI API,但通常您不能将文件描述符(即套接字)移交给另一个进程,除非它在您分叉之前已打开。进程具有独立的文件描述符表。线程都将共享同一个文件描述符表,因为它们在同一个进程中。

据我所知,一次只能让一个进程监听一个端口。通常要做的是让一个线程唯一的工作是监听连接。当它得到一个时,连接被接受并交给池中的下一个工作线程,通过让线程接管接受的套接字(而不是侦听套接字)直到套接字关闭。侦听器线程立即返回侦听连接。

这应该会给你最小的开销。

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 2018-06-16
    • 1970-01-01
    • 2014-02-16
    • 2020-08-16
    • 2010-10-22
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多