sho*_*000 27 apache performance thread-safety cacti
我用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
Run Code Online (Sandbox Code Playgroud)
我尝试了以下但服务器响应非常慢
<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
Run Code Online (Sandbox Code Playgroud)
@regilero
我已更新到
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 50
MaxRequestsPerChild 300
</IfModule>
Run Code Online (Sandbox Code Playgroud)
使用顶部我看到
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
Run Code Online (Sandbox Code Playgroud)
刚刚添加了当前的仙人掌结果图片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
Run Code Online (Sandbox Code Playgroud)
新测试
在2GB Ram VPS盒子上,我现在已经将prefork设置为
StartServers 20
MinSpareServers 20
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
Run Code Online (Sandbox Code Playgroud)
今天早上我的memcache服务器死了
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
Run Code Online (Sandbox Code Playgroud)
在apache中设置最佳值应该是什么?
#在/ etc/SYSCONFIG/memcached的
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-l 127.0.0.1"
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
reg*_*ero 36
当您使用带有mod_php的Apache时,apache在prefork
模式下强制执行,而不是worker
.因为,即使知道php5支持多线程,也知道一些php5库在多线程环境中表现不佳(例如,你可以在一个线程上调用其他php线程上的语言环境进行语言环境调用) .
所以,如果php没有像php-fpm一样以cgi方式运行,你可以在apache中使用mod_php,在prefork模式下使用apache.在您的测试中,您只需评论prefork设置并增加工作人员设置,您现在拥有的是prefork设置的默认值以及共享设置的一些更改值:
StartServers 20
MinSpareServers 5
MaxSpareServers 10
MaxClients 1024
MaxRequestsPerChild 0
Run Code Online (Sandbox Code Playgroud)
这意味着你要求apache从20进程开始,但你告诉它,如果有10个以上的进程什么也不做,那么应该减少这个数量的子进程,保持5到10个进程可用.apache的增加/减少速度是每分钟1.很快你就会回到经典的情况,你可以获得相当少的免费apache进程(平均2).平均值很低,因为通常你有5个可用的进程,但是一旦流量增加它们都被使用,所以没有进程可用,因为apache在创建新的分支时非常慢.由于您的PHP请求似乎很长,它们没有尽早完成并且apache forks不会很快发布以处理另一个请求,这肯定会增加.
在最后的图表上看到红色峰值之前的少量绿色?如果您可以在1分钟而不是5分钟的基础上绘制图表,您会看到此绿色数量不足以在没有任何错误消息的情况下获取传入流量.
现在你设置1024
MaxClients
.我猜这个配置修改后没有采用cacti图,因为通过这样的修改,当没有更多的进程可用时,apache将继续分叉新的子进程,限制为1024个繁忙的子进程.拿一个像每个孩子20MB RAM的东西(或者你在PHP中有一个很大的memory_limit并且允许64MB或256MB这些并且这些PHP请求真的使用更多的RAM),也许是数据库服务器......你的服务器现在正在放慢速度,因为你只有768MB的RAM.也许当apache试图启动前20个孩子时,你已经达到了可用的RAM限制.
所以.一种经典的处理方法是检查apache fork使用的内存量(在运行时生成一些顶级命令),然后找到你可以使用这个RAM量处理多少并行请求(这意味着并行apache children in prefork模式).例如,让我们说它是12.以这种方式将此数字放在apache mpm设置中:
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 12
MaxRequestsPerChild 300
</IfModule>
Run Code Online (Sandbox Code Playgroud)
这意味着您不会在流量增加或减少时移动分叉数,因为您总是希望使用所有RAM并为流量峰值做好准备.这300
意味着你在300次请求后回收每个fork,它优于0,这意味着你不会有潜在的内存泄漏问题.MaxClients设置为12 25或50,超过12来处理(删除这个奇怪的sentende,我不记得为什么我说过,如果有超过12个请求传入,则下一个请求将被推入Backlog队列,但是您应该将MaxClient设置为您的目标进程数).ListenBacklog
队列,这可以排队一些请求,你可能会占用更大的队列,但你可能会得到一些超时
是的,这意味着您无法处理超过12个并行请求.
如果您想处理更多请求:
如果您的问题确实是流量峰值,则可以使用缓存(如代理缓存服务器)提供解决方案.如果PHP中的问题是随机的慢,那么......这是一个应用程序问题,你是否从PHP对另一个站点进行了一些HTTP查询?
最后,正如@Jan Vlcinsky所说,您可以尝试使用nginx,其中php只能以php-fpm的形式提供.如果你不能购买RAM,必须处理一个明确要求测试的大流量.
更新:关于内部虚拟连接(如果这是你的问题,但可能不是).
检查此链接和之前的答案.这是"正常的",但如果您没有简单的虚拟主机,这些请求可能会占用您的主要应用程序,生成慢速http查询并阻止常规用户访问您的apache进程.它们是在优雅的重装或儿童管理下产生的.
如果您没有简单的基本"It works"默认Virtualhost通过一些重写来阻止您的应用程序上的这些请求:
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]
Run Code Online (Sandbox Code Playgroud)
更新:
只有一个Virtualhost不能保护您免受内部虚拟连接的攻击,这是最糟糕的,您现在确定这些连接是在您唯一的Virtualhost上进行的.因此,您应该使用重写规则来避免对应用程序产生副作用.
阅读您的仙人掌图形,似乎您的apache在工作模式下不处于prefork模式错误.运行httpd -l
或apache2 -l
使用debian,检查是否有worker.c或prefork.c.如果您处于工作模式,您可能会在应用程序中遇到一些PHP问题,但您应该检查工作程序设置,这是一个示例:
<IfModule worker.c>
StartServers 3
MaxClients 500
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
Run Code Online (Sandbox Code Playgroud)
你启动3个进程,每个进程包含25个线程(默认情况下3*25 = 75个并行请求),只允许75个线程无效,只要使用一个线程,就会分叉一个新进程,再增加25个线程.当你有超过250个线程什么都不做(10个进程)时,一些进程被杀死.您必须使用内存调整这些设置.在这里,您允许500个并行进程(即25个线程的20个进程).您的用法可能更多:
<IfModule worker.c>
StartServers 2
MaxClients 250
MinSpareThreads 50
MaxSpareThreads 150
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
124705 次 |
最近记录: |