3

我们有一个用 PHP 编写的非常轻量级的跟踪脚本,在 Apache/2.2.14 (Ubuntu) 上运行。该脚本将接收大量并发连接,但每个连接都会很快。目前我们使用的是prefork,配置如下:

StartServers          5
MinSpareServers       5
MaxSpareServers      10
ServerLimit         600
MaxClients          600
MaxRequestsPerChild   0

我们也有 KeepAlive Off

我已经玩了很多这些设置,并且一直在使用 apache 基准测试。每当我提出与 ab 的并发连接时,我都会得到“apr_socket_recv: Connection reset by peer (104)”。我还提高了文件描述符的最大数量。

我想知道那里是否有任何 apache 大师可以为我指出这种设置的正确方向(大量轻量级连接)。StartServers、Min/MaxSpareServers 等的最佳值是多少?工人 MPM 值得研究吗?欢迎任何想法。

4

1 回答 1

4

我可以给你一些提示:

  • 尝试在工作模式下使用 Apache 而不是 prefork。为此,要么将 PHP 置于 fastcgi 模式 (php-fpm),要么冒险将其保存在线程 apache 工作程序内的 mod_php 中(风险是 siome 外部库可能会发生冲突,例如区域设置,但如果您的 PHp 跟踪代码是小你可以控制启用多线程的所有东西——没有任何外部库的 PHP5 启用了多线程)
  • 如果您的 MaxClient 为 600,则将 600 放入StartServers,MinSpareServersMaxSpareServers. 否则 Apache 正在以非常低的速度创建一个新的分支:

父进程以每秒 1 个的最大速率创建新子进程。

如果您认为您的服务器可以处理 600 个分叉,那么请占用 RAM,创建 600 个分叉,并可能将MaxRequestsPerChild设置更改为 3000 之类的设置,以便有时会删除并重新创建旧分叉(避免内存泄漏)。您不会在分叉创建率上浪费任何时间,Apache 也不会浪费任何时间来管理子项的创建和删除。

  • 正如您所做的那样,禁用 KeepAlive 在您的情况下是一件好事
  • 要知道 MaxLients 的正确值是多少,无论是在 prefork 还是 worker 模式下,只需对其进行测试,跟踪一个 fork 使用的内存,然后将可用 RAM 的大小除以这个数字。请注意,php 也会使用一些 RAM,使用 mod_php,此 RAM 将在 apache fork 内存使用中,在 php-fpm 中它将在 php-fpm 进程中,检查 PHP 中的memory_limit设置以获取一个 PHP 的最大大小过程。
  • 减少您的 PHP RAM 使用量,以便您能够并行运行更多 PHP 脚本。不要构建大数组,保持会话轻等。使用 APC 操作码可以减少内存占用(并且还可以做其他好事),使用 PHP 5.3 而不是 5.2 也是如此。
于 2011-11-11T13:31:39.770 回答