- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一些在 Apache 的 MPM prefork 服务器上建模的 Python 代码。我更像是一名应用程序程序员而不是网络程序员,自从我阅读 Stevens 以来已经有 10 年了,所以我正在努力加快理解代码的速度。
我找到了 how Apache's prefork code works, by Sander Temme 的简短描述.
The parent process, which typically runs as root, binds to a socket (usually port 80 or 443). It spawns children, which inherit the open file descriptor for the socket, and change uid and gid to the unprivileged user and group. The children construct a pollset of the listener file descriptors (if there is more than one listener) and watch for activity on it/them. If activity is found, the child calls accept() on the active socket and handles the connection. When it is done with that, it returns to watching the pollset (or listener file descriptor).
Since multiple children are active and they all inherited the same socket file descriptor(s), they will be watching the same pollset. An accept mutex allows only a single child to actually watch the pollset, and once that has found an active socket it will unlock the mutex so the next child can start watching the pollset. If there is only a single listener, that accept mutex is not used and all children will hang in accept().
这几乎就是我正在查看的代码的工作方式,但我不明白一些事情。
1) “ child ”和“听众”有什么区别?我认为每个 child 都是一个监听器,这对于我正在查看的代码来说是正确的,但在 Temme 的描述中可以有“单个监听器”和“ child ”。 child 什么时候会有多个听众?
2) (与 1 相关)这是每进程互斥体还是系统互斥体?就此而言,为什么要有互斥体? Accept(2) 不会在所有监听器之间执行自己的互斥吗?我的研究表明我确实需要一个互斥体,并且互斥体必须遍及整个系统。 (群体、信号量等)
Temme 继续说道:
Children record in a shared memory area (the scoreboard) when they last served a request. Idle children may be killed by the parent process to satisfy MaxSpareServers. If too few children are idle, the parent will spawn children to satisfy MinSpareServers.
3)这个实现有没有好的引用代码(最好是Python)?我找到了Perl的Net::Server::Prefork ,它使用管道而不是记分板的共享内存。我找到了Randal Schwartz的文章它只进行预 fork ,但不进行记分板。
pre-fork example from the Perl Cookbook没有任何围绕 select 的锁定,并且 Chris Siebenmann's Python example说它基于 Apache,但使用配对套接字作为记分板,而不是共享内存,并使用套接字作为控件,包括对给定子项的控制以“接受”。这与 Apache 的描述完全不符。
最佳答案
就 (1) 而言,监听器只是对接受连接的套接字是否存在的引用。由于Apache可以同时接受多个套接字上的连接,例如80/443,因此有多个监听器套接字。每个子进程在需要时都需要监听所有这些套接字。由于accept()一次只能在一个套接字上执行,因此它之前是poll/select,因此知道应该在哪个监听器套接字上执行accept。
对于(2),它是全局或跨进程互斥体。也就是说,一个进程锁定它会阻止其他试图获取同一锁的进程。尽管accept()在技术上会序列化进程,但多个监听器套接字的存在意味着您不能依赖它,因为您事先不知道要在哪个套接字上执行接受。即使在单个监听器套接字的情况下,使用accept互斥锁的原因是,如果有大量进程处理请求,那么如果操作系统唤醒所有进程以查看哪些进程有accept()返回,那么成本可能会相当高。由于处于 prefork 模式的 Apache 可能有 100 多个进程,这可能会导致问题。
因此,如果您只有一个监听器套接字,并且知道只有几个进程想要执行accept() 调用,那么您可以取消跨进程accept 互斥体。
关于locking - 多个进程之间共享套接字的accept()(基于Apache preforking),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293652/
Apache 2.X 支持插入式并行处理模块,称为多路处理模块(MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到ap
我正在编写一些在 Apache 的 MPM prefork 服务器上建模的 Python 代码。我更像是一名应用程序程序员而不是网络程序员,自从我阅读 Stevens 以来已经有 10 年了,所以我正
我是 python 的新手,正在使用 pythons SocketServer.ForkingTCPServer 创建一个需要连接到数据库 (mysql) 的网络脚本。我预计程序每秒会被命中 30 -
查看 Apache 配置文件,我看到 Prefork 和 Worker MPM 已定义。有什么区别?Apache 使用的是哪一种? 最佳答案 Prefork 和worker 是apache 提供的两种
我刚刚开始了解 apache 服务器的工作原理,前几天我在编写一个非常简单的网页并显示页面点击计数时遇到了问题: /* The simplest HelloWorld module */ #inclu
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我的服务器环境:centos 6.4,带有 prefork 模块的 apache2.2,带有模块 5.c 的 php 5.3。 我有 10 个由 apache 运行的虚拟主机,我想分离这 10 个站点
首先,我对以Django为基础的网站的性能丝毫不满意,它的访问量并没有增加,到目前为止,每天的访问量超过1000。 我很好奇它如何应付繁忙的交通高峰,所以我使用了ab工具进行一些基准测试。 我注意到并
我有一个用 perl/Mojolicious 编写的简单 Web 应用程序,并在 hypnotoad 下运行。 我需要为“spawn”事件定义一些处理程序(由Mojo::Server::Prefork
我不知道如何让 spork 不加载我所有的应用程序模型。由于我无法使用 spork 来帮助测试对我的模型的更改,因此速度大大减慢。这是我在调试正在加载的 spork 时得到的: - Spork
我正在尝试使用 Chef Solo 在 Vagrant 盒子(Ubuntu 14.04)中安装 apache2 和 php。这是我的 Recipe : include_recipe "apache2"
我有一些代码,我希望输出为 1 和 6,但它会无限输出 1。 use v5.10; use Parallel::Prefork; use List::MoreUtils qw( natatime );
我需要将 MPM prefork 模块更改为worker,但它在我的 Debian 9.1 上不起作用。当我启用工作模块时,PHP 无法工作。我无法重新启用 php7.0 模块。 这是控制台的输出:
摘要/问题: 我使用 Prefork MPM 运行 Apache,运行 php。我正在尝试使用 Apache mod_proxy 创建一个反向代理,我可以通过它重新路由我的请求,以便我可以使用 Apa
如何在 Apache 2.4、Debian 8 上将 MPM Prefork 切换为 Event?我已经安装了 php-7 和 php-fpm,但是找不到关于将 MPM Prefork 切换到 Eve
我正在尝试使用 WSGI 在 Apache(prefork)中运行 Python 应用程序,以便使用单个 Python 解释器。这是必要的,因为应用程序使用线程同步来防止发生竞争条件。由于 Apach
我最近从源代码安装了 Apache/2.4.6。目前启用的MPM模块是mpm_event_module。我想启用 prefork mpm,但不确定从哪里执行此操作。我知道如果使用 yum 安装 apa
我坐下来阅读 Apache's MPM prefork.c并且此代码使用名为 accept_mutex 的变量来防止多个线程调用 accept()。这很奇怪,因为据我所知accept() is thr
我有 3 个远程工作人员,每个工作人员都使用默认池(prefork)和单个任务运行。 单个任务需要 2 到 5 分钟才能完成,因为它在许多不同的工具上运行并在 ELK 中插入数据库。 worker 命
可用的不同 apache 包之间有什么区别。 Apache 2 apache2 线程开发 apache2-prefork-dev 将 sudo apt-get install apache2 将同时支
我是一名优秀的程序员,十分优秀!