Apache2 针对大量轻量级连接的优化技巧

发布于 2024-12-15 00:39:19 字数 548 浏览 1 评论 0原文

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

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

我们还关闭了 KeepAlive

我已经对这些设置进行了相当多的尝试,并且已经使用 apache benchmark 进行了测试。每当我使用 ab 提高并发连接时,我都会收到“apr_socket_recv:连接由对等方重置 (104)”。我还提高了文件描述符的最大数量。

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

We have a very lightweight tracking script written in PHP, running on Apache/2.2.14 (Ubuntu). The script will receive a high number of concurrent connections, but each connection will be fast. Currently, we are using prefork, configured as follows:

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

We also have KeepAlive Off

I've played around with these setting quite a bit, and have been testing with apache benchmark. Anytime I raise the concurrent connections with ab, I get "apr_socket_recv: Connection reset by peer (104)." I've also raised the max number of file descriptors.

I'm wondering if any apache gurus out there can point me in the right direction for this type of setup (high number of lightweight connections). What are the optimum values for StartServers, Min/MaxSpareServers, etc? Is the worker MPM worth looking into? Any thoughts are welcome.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娇女薄笑 2024-12-22 00:39:19

我可以给你一些提示:

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

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

如果您认为您的服务器可以处理 600 个分叉,则使用 RAM,创建 600 个分叉,并可能将 MaxRequestsPerChild 设置更改为 3000 之类的值,这样有时旧的分叉会被删除并重新创建(避免 memleaks) 。您不会在分叉创建率上浪费任何时间,Apache 也不会在管理子进程的创建和删除方面浪费任何时间。

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

I can give you some hints:

  • try to use Apache in worker mode instead of prefork. To do that either put PHP in fastcgi mode (php-fpm) or take the risk to keep it in mod_php inside a threaded apache worker (the risk is that siome external libraries may conflict, like locale settings, but if your PHp tracking code is small you may control that everything there is multi-thread enabled -- PHP5 without any external lib is multi-thread enabled)
  • If you MaxClient is 600 then put 600 in StartServers, MinSpareServers and MaxSpareServers. else Apache is creating a new fork at a very low speed :

the parent process creates new children at a maximum rate of 1 per second.

if you think your server can handle 600 forks then take the RAM, create the 600 forks, and maybe alter the MaxRequestsPerChild setting to something like 3000, so that sometimes old forks are removed and recreated (avoiding memleaks). You will not losse any time in the fork creation rate and Apache will not loose any time managing creation and deletion of childrens.

  • Disabling KeepAlive is a good thing in your case, as you did
  • To known what is the right value for MaxLients, either in prefork or worker mode, just test it, track the memory used by one fork and divide the siez of your available RAM by this number. Be carefull, php will use some RAM as well, with mod_php this RAM will be in the apache fork memory usage, in php-fpm it will be in the php-fpm processes, check the memory_limit setting in PHP for the max size of one PHP process.
  • Reduce your PHP RAM usage, so that you will be able to run more PHP scripts in parallel. Do not build big arrays, keep the session light, etc. Using APC opcode may reduce your memory footprint (and do other nice things as well), using PHP 5.3 instead of 5.2 as well.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文