问题标签 [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 投票
2 回答
27504 浏览

apache - 什么是 pre-fork Web 服务器模型?

我想知道当 web 服务器将自己描述为 pre-fork web 服务器时它到底意味着什么。我有一些例子,例如unicorn用于 ruby​​ 和gunicorn用于 python。

更具体地说,这些是问题:

  • 这个模型解决了什么问题?
  • 最初启动 pre-fork Web 服务器时会发生什么?
  • 它如何处理请求?

此外,关于独角兽/gunicorn 的更具体的问题:

假设我有一个想要与 (g)unicorn 一起运行的 web 应用程序。在初始化时,webapp 会做一些初始化工作(例如填写额外的数据库条目)。如果我用多个工作人员配置 (g)unicorn,初始化的东西会运行多次吗?

0 投票
1 回答
332 浏览

python - 预分叉多线程 Python 应用程序

我有一个已经是多线程的 Python 程序,我想用进程替换一些线程,以减少上下文切换并利用 gevent 进行异步 I/O。
主要进程是 I/O 绑定的,所以我想使用 gevent 以便能够处理大量并发 I/O。我们将它称为我系统的接收器组件。

该程序的其余部分主要受 CPU 限制,因此我希望每个进程都有一些线程来处理来自接收器的请求。这些是我的工作进程。
我选择线程在一个进程中处理多个请求的原因是因为线程的创建和销毁成本更低。如果程序收到大量请求,它可以自动扩展以启动更多线程以处理更多请求。当负载减少时,它可以摆脱额外的线程,以避免上下文切换的额外开销。

使用 gevent 分叉可能会导致一些问题,而gipc正是为了解决这些问题而存在的。
工作线程有时会从缓存和数据库等各种来源读取数据,但如果我理解正确,GIL 将在 I/O 发生时切换到另一个线程。

如果我确实决定要在我的工作人员中使用 gevent,我可以(我认为)避免猴子修补线程模块并为每个工作进程分配一个 greenlet 池。当 I/O 发生时,GIL 是否仍会被释放,并且在将 gevent 与线程结合时,另一个线程将开始执行直到 I/O 调用完成?

最后还有另一个过程将响应保存到数据库。它自然是 I/O 绑定的,因此 gevent 将是执行此操作的绝佳选择。

我已经阅读了混合线程和 prefork 的危险。我不会在主进程中创建任何线程,因此不会将诸如互斥锁之类的锁定机制复制到子进程中。我不会分叉我的任何子进程。假设我在这个设计的任何阶段都没有遇到麻烦是否安全?Python 是否减轻了预分叉和线程的一些问题?

0 投票
1 回答
1772 浏览

php - PHP readfile() 永远不会结束并使 Apache 服务器挂起

我有一个 apache 服务器,php 应用程序的大问题。

该服务器正在为一个使用 php 运行的高流量网站提供服务。

每隔 24 小时或 48 小时,apache 就会挂起,我必须重新启动它才能再次访问该网站。我必须重新启动它,因为 apache 达到了允许的进程/服务器的最大数量(对我来说是 16000),并且它无法释放其他进程,因为其他进程都处于活动状态。

该服务器上托管的网站是一个 php 应用程序,它在最后提供一个文件:假设它是一个下载服务器。

浏览器通过提交 POST 请求的表单请求文件。

问题是这个发布请求似乎永远不会结束(我可以看到我的服务器状态上的几乎所有 16000 个进程都是 POST 请求)。

提供的文件是大文件(10M 到 2G),我使用 php readfile 函数为它们提供服务(我不想通过 href 链接为它们提供服务,所以我使用表单 POST 请求,以便用户永远看不到文件在我的文件系统上)。

使用 php readfile 的函数似乎永远不会结束,即使我在它的末尾使用 exit() (参见下面的代码片段)。

我在这里要求一种方法来避免这种由我的 php 代码引起的永无止境的 POST 请求。我想保持 POST 提供文件的方式。

首先我的conf:

  • Ubuntu 服务器 14.04
  • apache 2.4 与 mpm prefork
  • php 5.5.9 (mod php)
  • 硬件:128G内存

我的 mpm_prefork.conf 文件:

我的 apache2.conf 文件:

我的 php.ini 文件:

我的 apache 日志文件:我的问题没有什么有趣的

显示问题发生时间的 munin 图: 在此处输入图像描述

我的 apache 服务器状态如下所示: 在此处输入图像描述

在此处输入图像描述

还有我的服务器类(导致问题的代码):

有人有解决方案来避免永无止境的 POST 请求吗?如果可以解决问题,我可以通过 php 以外的其他方式提供文件。

请不要重复,我已经添加了足够的代码、conf 片段和图片来具体说明这个问题:)

0 投票
1 回答
1700 浏览

apache - Prefork MPM 配置不在 httpd.conf 中

我的 EC2 Micro 实例存在内存问题,导致它终止了我的 MySQL 进程。

我已经阅读了很多关于调整 Apache 以限制内存消耗的内容,并且正在寻找编辑 Prefork MPM 设置。问题是 - 当我进入 httpd.conf 时,我没有看到任何 MPM 模块的提及。

我一直在环顾四周,我能找到的唯一参考是在 /etc/httpd/conf.modules.d/00-mpm.conf 中,我可以看到应该加载 prefork 模块。(LoadModule mpm_prefork_module modules/mod_mpm_prefork.so)

当我执行 httpd -l 时, prefork.c 未列出。

在这一点上,我不确定模块是否使用 apache 加载/编译,如果是 - 如何配置它。感谢任何帮助!

0 投票
0 回答
43 浏览

php - 如何在需要 POST 数据的后台运行长 PHP 脚本时显示成功页面?

我有一个长时间运行的 php 脚本,它需要来自用户的 $_POST 数据。我希望用户能够提交数据并获得“成功启动”页面。但是,在向用户显示该页面后,我仍然想在后台运行一个 PHP 脚本,这需要一段时间。关于如何做到这一点的任何想法?

分叉、多处理、调用外部脚本?请记住,我需要将 $_POST 数据提交给长时间运行的脚本。

0 投票
1 回答
470 浏览

docker - 在 docker 下移动 prefork 应用程序

我有一个 prefork 模型服务器。这意味着应用程序将启动,在端口上绑定一个套接字,它们分叉 X 次,以便每个子节点共享同一个端口。

我现在想在 docker 下移植这个应用程序。我的理解是一个 docker 实例应该只运行我的一个服务器,以获得更好的可用性。因此,如果我想运行我的进程的 5 个实例,我应该运行 5 个 docker 实例,所有这些实例都运行一次我的应用程序。到目前为止我是正确的吗?

如果是,我的问题是,是否可以让我所有的 docker 实例都在同一个端口下运行?

我同意我可以使用反向代理来为我的服务映射一系列端口,但如果可能的话,我想避免这种情况。

0 投票
0 回答
184 浏览

python - 在其他任务中创建的 Celery 计划任务不会立即转到代理

我的芹菜任务设置如下:

我有 5 个工人(prefork),每个工人有 30 个并发。所有运行 prefetch_multiplier=1 和 -Ofair 参数。我正在使用带有 CELERY_ACKS_LATE=True 的 redis 代理

现在,我从 celery 节拍计划中调用 heavy_task(1,2).delay() ,任务转到任何 1 个工作人员,然后它创建的所有 10,000 个任务仅与该工作人员一起驻留,而不发布给经纪人,以便其他工作人员可以从事这些任务。worker 的 prefetch_count 不断增加到 10,000

只有在原始工作人员的内存开始消耗接近 90% 之后,这些任务才会发布到代理,从而转移到其他工作人员。有时工作人员也会被操作系统杀死,所以我的任务永远丢失了,因为它们在 redis 代理中没有“未被确认”。

我应该怎么做才能让这些次要任务立即交给经纪人,而不会让一名工人承担所有任务?

0 投票
0 回答
77 浏览

fork - 更新的 Ubuntu 和 pcntl_fork 停止工作 (php)

我的服务器最近发生的变化:

  • 我几乎可以肯定这是因为 dist 升级。(几天前)

  • 我添加了一个新用户并在 var/www/html/banana 中为他添加了一个库。所以它也可能来自那个(?) - (2周前)

  • 尝试安装 FastCGI 没有任何成功 - 但这并没有破坏任何常规处理和流程。(2个月前)

我通常使用分叉从我的 PHP 代码中运行 API 查询,并且在某些时候它停止了对我的工作(它确实有效,但是当得到繁重的查询结果时它停止了)。

错误日志:

运行cat /var/mail/root输出:

有人可以帮我更好地调试问题并解决它吗?

运行这个脚本会得到真实的结果:

编辑:我尝试在没有分叉的情况下在服务器上运行相同的脚本,并且我得到了所有结果(在等待了很多并且让我的网站卡了一段时间之后..)

0 投票
1 回答
972 浏览

apache - httpd -l 中未显示 prefork.c

我有 CentOS 7,我的 apache 版本是 2.4.6。我输入了这个命令:

这是答案:

因此,我在这些模块中看不到 prefork.c。另外,我在 /etc/httpd/conf/httpd.conf 中看不到 prefork 模块,但答案httpd -V | grep "Server MPM"是:

此外,这些链接的建议没有帮助: apache2-prefork-dev installation Prefork MPM configuration not in httpd.conf ((这意味着安装httpd-devel没有帮助,并且添加以下行/etc/httpd/conf.modules.d/00-mpm.conf并没有解决我的问题:

)) 我想在答案中看到 prefork.chttpd -l并且我想在/etc/httpd/conf/httpd.conf 我应该做什么中看到 prefork 模块?感谢分享。

0 投票
4 回答
60 浏览

mysql - How can I make grouping optimize?

Here is my query:

Also here is the result of EXPLAIN :

enter image description here

Also here is the result of that subquery (x) EXPLAIN:

enter image description here

See? Much optimal. So the issue is grouping here. Any idea how can I make that query better?


EDIT: We need two tables:

  1. requests table -- A new row will inserted inside it for each users request. So, the last (biggest) determines user's last time been online in our website somewhat.

  2. events table -- A new row will be inserted inside it for each answer, comment.

We're talking about a Q/A website. All we're trying to do is "sending an email to the users who got a new comment/answer after their last time being online in our website".