问题标签 [preforking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5802 浏览

locking - accept() 在多个进程之间共享套接字(基于 Apache 预分叉)

我正在研究一些以 Apache 的 MPM prefork 服务器为模型的 Python 代码。我更像是一名应用程序程序员而不是网络程序员,自从我阅读 Stevens 以来已经 10 年了,所以我正在努力加快理解代码的速度。

我找到了Sander Temme 对 Apache 的 prefork 代码如何工作的简短描述。

通常以 root 身份运行的父进程绑定到一个套接字(通常是端口 80 或 443)。它产生子节点,继承套接字的打开文件描述符,并将 uid 和 gid 更改为非特权用户和组。孩子们构造一个监听器文件描述符的轮询集(如果有多个监听器)并观察它/它们上的活动。如果找到活动,则子进程在活动套接字上调用 accept() 并处理连接。完成后,它会返回查看轮询集(或侦听器文件描述符)。

由于多个子节点处于活动状态并且它们都继承了相同的套接字文件描述符,因此它们将监视相同的轮询集。一个接受互斥体只允许一个孩子实际观看轮询集,一旦找到一个活动套接字,它将解锁互斥体,以便下一个孩子可以开始观看轮询集。如果只有一个侦听器,则不使用该接受互斥体,并且所有子级都将挂在接受()中。

这几乎就是我正在查看的代码的工作方式,但我不明白一些事情。

1)“孩子”和“听众”有什么区别?我认为每个孩子都是一个听众,这对于我正在查看的代码来说是正确的,但是在 Temme 的描述中可以有“单个听众”和“孩子”。一个孩子什么时候会有多个听众?

2)(与 1 相关)这是每个进程的互斥锁还是系统互斥锁?就此而言,为什么要有互斥锁?不接受(2)在所有听众中做自己的互斥锁吗?我的研究表明我确实需要一个互斥锁,并且该互斥锁必须跨越整个系统。(群、信号量等)

泰姆接着说:

当他们最后一次服务请求时,孩子们会在共享内存区域(记分板)中记录。空闲子进程可能会被父进程杀死以满足 MaxSpareServers。如果空闲的子节点太少,父节点将产生子节点以满足 MinSpareServers。

3)这个实现有没有很好的参考代码(最好是Python)?我找到了 Perl 的Net::Server::Prefork,它使用管道而不是共享内存作为记分牌。我发现了Randal Schwartz的一篇文章,它只做预分叉,但不做记分牌。

Perl Cookbook中的pre-fork 示例没有围绕 select 进行任何类型的锁定,Chris Siebenmann 的 Python 示例说它基于 Apache,但使用配对套接字作为记分板,而不是共享内存,并使用套接字进行控制,包括控制给定的孩子“接受”。这根本不符合 Apache 的描述。

0 投票
1 回答
417 浏览

apache - 如何在 LAMP 服务器上高效地提供 PHP 动态图像?

现在我正在我的 LAMP (CentOS/Apache/MySQL/PHP) 堆栈上运行一个 PHP 脚本,它使用 GD 生成动态图像。我将它们缓存在硬盘上 5 分钟。如果存在缓存版本,我会提取它而不是生成新版本。这节省了 CPU 时间,但由于 Apache 仍在运行 PHP 文件,它会为每个图像生成一个新的 Apache 进程。

Apache 通常以大约 30MB 运行,我重写了大部分配置并将其降低到每个进程大约 10MB。但是,对于大约 30 个并发进程,这很快就会增加。该服务器还必须提供正常的网站内容。我想知道是否有设置另一个轻量级服务器或进一步优化 Apache/PHP 的好方法?这是我在 500MB RAM 上的 prefork 设置:

0 投票
1 回答
956 浏览

c - c语言中的FastCGI fork

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

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

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

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

2) 运行FCGX_Init(),而不是 pre-fork 到 10 个进程 BEFOREwhile (FCGX_Accept_r(&request) >= 0)

3) 之后运行 pthreadswhile (FCGX_Accept_r(&request) >= 0)

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

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

0 投票
2 回答
452 浏览

sockets - FastCGI / SCGI 前叉

我一直在尝试实现一个 Web 服务器网关(出于娱乐和教育目的),我对 FastCGI/SCGI 背后的核心架构与 pre-fork 模型有一些疑问。

FastCGI/SCGI 实现如何处理 pre-fork 场景中的通信?AFAIK,网关只有一个套接字来连接到 FastCGI 服务器。通常,有一个父进程接受来自网关的连接并将工作移交给预先分叉的工作人员之一。

由于在孩子分叉建立连接,您应该如何让孩子使用这些套接字与网关进行通信?

0 投票
0 回答
370 浏览

php - apache/php 模块套接字问题

我在 Debian Lenny 32bit 下运行 Apache2.2 服务器+PHP 5.2。我在 C 中构建了一个“简单”的 php 模块扩展。这个扩展做一件事:通过套接字调用一个小的“回声服务器”并等待结果(在双方发送/接收一个“A”)。

进入prefork-mpm 模型,我将套接字设置为全局 var PHP 结构。所以在全球范围内,扩展源听起来像这样:

在 mymodule.h

在 mymodule.c

听起来很完美......每次 Apache 分叉一个新进程时,我都会创建一个新连接 (sa==0) 如果 Apache 一段时间后决定“重用”现有进程,我的套接字 - 已经连接 - (并且我敢肯定)将在不创建套接字的情况下将数据发送到服务器。就像某种“套接字池”一样

但麻烦来了……

由于未知原因,在 Apache 尝试重用打开的套接字的情况下,send_recv() 挂起在 send() 命令上。当然,套接字处于阻塞模式,但为什么会出现这种行为?

(顺便说一句,如果我将相同的代码(当然没有 PHP 代码)运行到具有多个 send_recv 的可执行文件中,一切都会完美运行!)

Apache似乎锁定了套接字!??

任何想法 ?

0 投票
1 回答
3614 浏览

ruby - Ruby readpartial 和 read_nonblock 不抛出 EOFError

我试图理解并重新创建一个简单的预分叉服务器,就像独角兽一样,服务器在启动时分叉 4 个进程,这些进程都在控制套接字上等待(接受)。

控制套接字@control_socket绑定到 9799 并产生 4 个等待接受连接的工作人员。每个工人所做的工作如下

我使用了一个非常简单的机架应用程序,它只返回一个状态码为 200 的字符串和一个 text/html 的 Content-Type。

我面临的问题是,当我使用 a而不是or之类的东西读取传入请求(通过点击“ http://localhost:9799 ”处的 url)时,我的服务器正常工作。当我使用非阻塞读取时,它似乎永远不会抛出 EOFError,根据我的理解,这意味着它没有接收到状态。getsreadread_partialread_nonblockEOF

这会导致读取loop无法完成。这是完成这项工作的代码片段。

但是,如果我使用简单的gets而不是,read或者read_nonblock如果IO.select([@client])break.

这是代码工作并返回响应的时间。我打算使用 read_nonblock 的原因是 unicorn 使用了一个等效的实现 non_blocking 读取的kgio库。

接下来粘贴整个代码。

有人可以向我解释为什么“read_partial”或“read_nonblock”或“read”读取失败。我真的很感激这方面的一些帮助。

谢谢。

0 投票
1 回答
2182 浏览

php - Apache 模块 mpm_worker + php 问题

我在 ubuntu 机器中使用 php 和 apache 并尝试多线程概念。Apache 带有默认的“prefork”模块。当我启用 mpm_worker 模块时,Php 停止工作..

在 apache 中启用 mpm_worker 时,我是否需要启用任何其他模块才能使 php 正常工作。

谢谢..

0 投票
1 回答
5232 浏览

apache - 用于 apache 的 Prefork vs worker 模块,正在使用什么?

无法确定我的 apache 使用的是哪个 MPM,任何人都可以根据以下输出来判断吗?
我的猜测是 Prefork 正在被使用?

[root@rp1a ~]# cat /etc/sysconfig/httpd

[root@rp1a ~]# tail /etc/httpd/conf.d/rp-base.conf

[root@rp1a ~]# apachectl -V

[root@rp1a ~]# /usr/sbin/httpd -V

[root@rp1a ~]# apachectl -l

[root@rp1a ~]# httpd -l

[root@rp1a ~]# httpd.worker -l

[root@rp1a ~]# ps -C httpd.worker -F

[root@rp1a ~]# ps -C httpd -F | 头

0 投票
1 回答
52 浏览

php - 相当于 PHP 中的 Ruby IO

我正在寻找一种方法来做类似的事情IO.selectIO.pipe在 PHP 中。谷歌搜索几个小时并没有得到任何好的结果。基本上,对于预制服务器模型,我需要主进程和子进程之间的 IPC 文件描述符对。

0 投票
1 回答
268 浏览

sockets - 做socket编程时,accept函数需要加锁吗?

我创建了一个预分叉 Web 服务器,它创建服务器套接字、绑定它、侦听地址和端口,并预分叉指定数量的工作人员(子进程),这些工作人员充当服务客户端请求的工作人员。

所有工作人员都继承父服务器的套接字描述符并使用它来接受客户端请求。子进程作为“并行”的自治进程运行,并使用带有服务器套接字描述符的接受函数。在接受客户端请求时,我是否必须对接受功能使用锁定和解锁机制,或者操作系统会为我这样做?这里的想法是多个进程使用公共服务器套接字描述符来接受客户端请求。我是否必须使用互斥机制来保护它以避免竞争条件或死锁?

请考虑我在接受函数中使用 I/O 非阻塞。

我有以下代码:

我应该使用类似的东西:

??