gpt4 book ai didi

performance - apache 服务器达到 MaxClients 设置,考虑提高 MaxClients 设置

转载 作者:行者123 更新时间:2023-12-03 10:14:33 30 4
gpt4 key购买 nike

我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxClients setting,而且 apache 运行速度也很慢。当我查看仙人掌图时,它显示服务器甚至没有使用所有资源。这是当前配置

<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 10
ServerLimit 1024
MaxClients 768
MaxRequestsPerChild 4000
</IfModule>

<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>



free -m
total used free shared buffers cached
Mem: 768 352 415 0 0 37
-/+ buffers/cache: 315 452
Swap: 0 0 0



top - 11:03:54 up 41 days, 11:53, 1 user, load average: 0.05, 0.03, 0.00
Tasks: 35 total, 1 running, 34 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.3%st
Mem: 786432k total, 389744k used, 396688k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 38284k cached

我尝试了以下但服务器响应非常慢
<IfModule worker.c>
#StartServers 2
#MaxClients 150
#MinSpareThreads 25
#MaxSpareThreads 75
#ThreadsPerChild 25
#MaxRequestsPerChild 0

StartServers 20
MaxClients 1024
ServerLimit 1024
MinSpareThreads 128
MaxSpareThreads 768
ThreadsPerChild 64
MaxRequestsPerChild 0
</IfModule>

free -m
total used free shared buffers cached
Mem: 768 324 443 0 0 37
-/+ buffers/cache: 286 481
Swap: 0 0 0

enter image description here

@regilero

我已经更新到
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 50
MaxRequestsPerChild 300
</IfModule>

使用顶部我看到
Tasks:  36 total,   1 running,  35 sleeping,   0 stopped,   0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 786432k total, 613180k used, 173252k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 76488k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 10364 92 60 S 0.0 0.0 1:09.53 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/808
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/808
124 root 16 -4 12620 8 4 S 0.0 0.0 0:00.00 udevd
533 root 20 0 95504 5692 228 S 0.0 0.7 4:02.94 memcached
546 root 20 0 5924 332 276 S 0.0 0.0 6:54.51 syslogd
557 root 20 0 101m 1456 868 S 0.0 0.2 13:18.64 snmpd
570 root 20 0 62640 316 208 S 0.0 0.0 2:39.56 sshd
579 root 20 0 21656 24 20 S 0.0 0.0 0:00.00 xinetd
589 root 20 0 12072 12 8 S 0.0 0.0 0:00.05 mysqld_safe
940 mysql 20 0 559m 164m 3832 S 0.3 21.5 209:33.88 mysqld
1015 root 20 0 20880 200 132 S 0.0 0.0 0:10.48 crond
1023 root 20 0 46748 4 0 S 0.0 0.0 0:00.00 saslauthd
1024 root 20 0 46748 4 0 S 0.0 0.0 0:00.00 saslauthd
3605 root 20 0 62832 2168 636 S 0.0 0.3 0:02.58 sendmail
3613 smmsp 20 0 57712 1648 504 S 0.0 0.2 0:00.01 sendmail
17610 root 20 0 85932 3312 2600 S 0.0 0.4 0:00.02 sshd
17612 mcmap 20 0 86072 1760 1012 S 0.0 0.2 0:00.17 sshd
17613 mcmap 20 0 12076 1656 1292 S 0.0 0.2 0:00.01 bash
17637 root 20 0 45052 1432 1120 S 0.0 0.2 0:00.00 su
17638 root 20 0 12180 1800 1324 S 0.0 0.2 0:00.08 bash
17740 root 20 0 246m 9264 4516 S 0.0 1.2 0:00.19 httpd
18264 apache 20 0 282m 43m 4940 S 0.0 5.7 0:00.56 httpd
18514 apache 20 0 279m 40m 4832 S 0.0 5.3 0:01.47 httpd
18518 apache 20 0 273m 36m 4396 S 0.0 4.7 0:00.45 httpd
18528 apache 20 0 251m 13m 3660 S 0.0 1.8 0:00.41 httpd
18529 apache 20 0 278m 40m 4340 S 0.0 5.3 0:00.99 httpd
18530 apache 20 0 278m 40m 4268 S 0.0 5.3 0:00.67 httpd
18548 apache 20 0 272m 33m 3516 S 0.0 4.4 0:00.28 httpd
18552 apache 20 0 280m 42m 3684 S 0.0 5.5 0:00.48 httpd
18553 apache 20 0 271m 33m 3768 S 0.0 4.3 0:00.45 httpd
18555 apache 20 0 274m 36m 3672 S 0.0 4.7 0:00.58 httpd
18572 apache 20 0 247m 9020 2856 S 0.0 1.1 0:00.01 httpd
18578 apache 20 0 280m 42m 3684 S 0.0 5.6 0:00.76 httpd
18589 apache 20 0 246m 5452 676 S 0.0 0.7 0:00.00 httpd
18588 root 20 0 12624 1216 932 R 0.0 0.2 0:00.06


free -m
total used free shared buffers cached
Mem: 768 578 189 0 0 74
-/+ buffers/cache: 504 263
Swap: 0 0 0

enter image description here
刚刚添加了过去 4 小时仙人掌结果的当前图片。繁忙时段是星期一星期二。所以我会等到下周看到配置更改的进一步结果。但它看起来像以前一样改进,我最多只有 10 个可用线程。看看这个,你认为我可以做更多的改进吗?
free -m
total used free shared buffers cached
Mem: 768 619 148 0 0 49
-/+ buffers/cache: 570 197
Swap: 0 0 0

新测试

在 2GB Ram VPS 盒子上,我现在将 prefork 设置为
StartServers      20
MinSpareServers 20
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

今天早上我的内存缓存服务器死了
Nov 20 09:28:40 vps22899094 kernel: Out of memory: Kill process 12517 (memcached) score 81 or sacrifice child
Nov 20 09:28:40 vps22899094 kernel: Killed process 12517, UID 497, (memcached) total-vm:565252kB, anon-rss:42940kB, file-rss:44kB

在 apache 中设置的最佳值应该是多少?

#/etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-l 127.0.0.1"

/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

bind-address=127.0.0.1

#script
thread_concurrency=2
query_cache_size = 16M
query_cache_type=1
query_cache_limit=5M

# MyISAM #
#key-buffer-size = 32M
#myisam-recover = FORCE,BACKUP

# SAFETY #
#max-allowed-packet = 16M
#max-connect-errors = 1000000

# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
#query-cache-type = 0
#query-cache-size = 0
max-connections = 50
thread-cache-size = 16
#open-files-limit = 65535
#table-definition-cache = 1024
#table-open-cache = 2048

# INNODB #
#innodb-flush-method = O_DIRECT
#innodb-log-files-in-group = 2
#innodb-log-file-size = 5M
#innodb-flush-log-at-trx-commit = 1
#innodb-file-per-table = 1
#innodb-buffer-pool-size = 921M
# LOGGING #
log-error = /var/log/mysqld.log
log-queries-not-using-indexes = 1
slow-query-log = 1
slow-query-log-file = /var/log/mysqld-slow.log

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

最佳答案

当您将 Apache 与 mod_php 一起使用时,Apache 在 prefork 中被强制执行模式,而不是 worker .因为,即使已知 php5 支持多线程,也知道一些 php5 库在多线程环境中表现不佳(例如,您将在一个线程上调用区域设置来更改其他 php 线程上的区域设置) .

所以,如果 php 没有像 php-fpm 那样以 cgi 方式运行,那么你在 apache 和 apache 中有 mod_php 在 prefork 模式下。
在您的测试中,您只是简单地评论了 prefork 设置并增加了 worker 设置,您现在拥有的是 prefork 设置的默认值和共享设置的一些更改值:

StartServers       20
MinSpareServers 5
MaxSpareServers 10
MaxClients 1024
MaxRequestsPerChild 0

这意味着您要求 apache 以 20 个进程开始,但您告诉它,如果有 10 个以上的进程什么都不做,它应该减少这个子进程的数量,以保持 5 到 10 个进程可用。 apache的增减速度为每分钟1次。很快,您将回到经典情况,即您的可用 apache 进程数量相当少(平均 2 个)。平均值很低,因为通常您有 5 个可用进程,但是一旦流量增加,它们就会全部使用,因此没有可用进程,因为 apache 创建新分支的速度非常慢。这肯定会增加,因为您的 PHP 请求似乎很长,它们没有提前完成,并且 apache 分支没有足够快地发布以处理另一个请求。

在最后一张图中看到红色峰值之前的少量绿色了吗?如果您可以在 1 分钟而不是 5 分钟的基础上绘制此图,您会发现此绿色数量不足以在没有任何错误消息的情况下接收传入流量。

现在您设置 1024 MaxClients .我猜这个配置修改后cacti图不会被拿走,因为这样修改后,当没有更多可用进程时,apache会继续fork新的 child ,限制为1024个忙碌的 child 。每个 child 需要 20MB 的内存(或者你可能在 PHP 中有一个很大的 memory_limit 并且允许像 64MB 或 256MB 这样的东西并且这些 PHP 请求确实使用了更多的内存),也许是一个数据库服务器......你的服务器现在正在变慢,因为您只有 768MB 的 RAM。也许当 apache 尝试启动前 20 个 child 时,您已经达到了可用的 RAM 限制。

所以。一种经典的处理方法是检查 apache fork 使用的内存量(在它运行时执行一些顶级命令),然后找出使用此数量的 RAM 可以处理多少并行请求(这意味着并行 apache 子进程)预 fork 模式)。假设它是 12 , 例如。以这种方式将此数字放入 apache mpm 设置中:
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 12
MaxRequestsPerChild 300
</IfModule>

这意味着您不会在流量增加或减少时移动 fork 的数量,因为您总是希望使用所有 RAM 并为流量高峰​​做好准备。 300意味着你在 300 个请求后回收每个 fork,它比 0 好,这意味着你不会有潜在的内存泄漏问题。 MaxClients 设置为 12 25 或 50,大于 12 来处理 ListenBacklog队列,它可以将一些请求排入队列,你可能需要一个更大的队列,但你可能会得到一些超时(删除了这个奇怪的前句,我不记得我为什么这么说,如果传入的请求超过 12 个,下一个将是推送到 Backlog 队列中,但您应该将 MaxClient 设置为您的目标进程数)。

是的,这意味着您不能处理超过 12 个并行请求。

如果你想处理更多的请求:
  • 多买一些 内存
  • 尝试在 中使用 apache worker 模式,但删除 mod_php 并使用 php 作为具有自己的池程序设置的并行守护程序(这称为 php-fpm ),将其与 fastcgi 连接。请注意,您肯定需要购买一些 RAM 以允许大量并行 php-fpm 进程,但可能比 mod_php
  • 少。
  • 减少在你的 php 进程中花费的时间 .从您的仙人掌图中,您必须解决潜在问题:11:25-11:30 左右出现真正的流量高峰,或者某些 php 代码变得非常缓慢。快速请求将减少并行请求的数量。

  • 如果您的问题确实是流量高峰,则可以使用缓存解决方案,例如代理缓存服务器。如果问题是 PHP 中的随机缓慢,那么...这是一个应用程序问题,例如,您是否从 PHP 对另一个站点执行一些 HTTP 查询?

    最后,正如@Jan Vlcinsky 所说,您可以尝试 nginx ,其中 php 将仅作为 可用php-fpm .如果您无法购买 RAM 并且必须处理绝对值得测试的大流量。

    更新:关于 内部虚拟连接 (如果这是您的问题,但也许不是)。

    查询 this linkthis previous answer .这是“正常的”,但如果您没有简单的虚拟主机,这些请求可能会影响您的主要繁重应用程序,生成缓慢的 http 查询并阻止普通用户访问您的 apache 进程。它们是在正常重新加载或子项管理时生成的。

    如果您没有简单的基本“它有效”默认 Virtualhost 通过一些重写来阻止对您的应用程序的这些请求:
      RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
    RewriteRule .* - [F,L]

    更新:

    只有一个 Virtualhost 并不能保护您免受内部虚拟连接的影响,最糟糕的是,您现在确定这些连接是在您唯一的 Virtualhost 上建立的。所以你真的应该通过使用重写规则来避免对你的应用程序产生副作用。

    阅读您的仙人掌图形,您的 apache 似乎不在工作模式下的 prefork 模式错误。运行 httpd -lapache2 -l在 debian 上,检查您是否有 worker.c 或 prefork.c。如果您处于工作模式,您可能会在应用程序中遇到一些 PHP 问题,但您应该检查工作设置,这是一个示例:
    <IfModule worker.c>
    StartServers 3
    MaxClients 500
    MinSpareThreads 75
    MaxSpareThreads 250
    ThreadsPerChild 25
    MaxRequestsPerChild 300
    </IfModule>

    您启动 3 个进程,每个进程包含 25 个线程(因此默认情况下有 3*25=75 个并行请求可用),您允许 75 个线程不执行任何操作,一旦使用一个线程,就会 fork 一个新进程,添加 25 个线程。当你有超过 250 个线程无所事事(10 个进程)时,一些进程会被杀死。您必须根据您的内存调整这些设置。在这里,您允许 500 个并行进程(即 25 个线程的 20 个进程)。您的用法可能更多:
    <IfModule worker.c>
    StartServers 2
    MaxClients 250
    MinSpareThreads 50
    MaxSpareThreads 150
    ThreadsPerChild 25
    MaxRequestsPerChild 300
    </IfModule>

    关于performance - apache 服务器达到 MaxClients 设置,考虑提高 MaxClients 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18761239/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com