1GB VPS-Apache Worker MPM-FCGID-最大并发连接数-RAM CAP


9

我花了一两个星期研究和设置我的服务器,以使用Worker MPM和FCID运行Apache。我正在尝试对其进行优化,以允许尽可能多的并发连接。在Worker MPM上找到良好的信息一直是一场噩梦。

服务器-具有1GB RAM的VPS(关闭Apache仅使用约150MB RAM)我希望Apache具有约750MB的内存使用率CAP-这样我的服务器将永远不会用完RAM。

我已经运行服务器大约两年了,没有任何问题-但是我们最近开始流式传输MP3,这需要更多的并发连接。该服务器还受到了一些较小的DDOS攻击-因此我将设置减少了一吨,以防止服务器内存不足-我还为速率限制添加了一些防火墙规则。

我现在进行的设置看起来运行良好-但是我遇到了一些Segmentation Fault错误

[Sat Mar 23 03:19:50 2013] [notice] child pid 28351 exit signal Segmentation fault (11)
[Sat Mar 23 03:56:20 2013] [notice] child pid 29740 exit signal Segmentation fault (11)
*** glibc detected *** /usr/sbin/httpd.worker: malloc(): memory corruption: 0xb83abdd8 ***

还有一些内存不足错误

Out of memory during array extend.

这是我目前的设置,非常感谢您提供一些建议。

Apache设置:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
#####################
# Spawn 2 child processes, spawning 25 threads for each child process.
# So, a pool of 50 threads is left up and sleeping, ready to serve incoming requests.
# If more requests will come in, apache will spawn new child processes, each one spawning 25 threads,
# enlarging the thread pool until the total number of threads become 50. In that case, apache begin
# to cleanly drop processes, trying to reach 25 threads.
# New processes and its threads are spawned in case of a large spike of requests, until 200 parallel
# client requests are reached, then apache will no longer accept new incoming connections.
# When the load calm down, and requests come back under 200 parallel connections, apache will continue
# to accept connections. After 25, 000 requests served by a child, q. 1000 per thread, the process
# get closed by the father to ensure no memory leak is fired.
<IfModule worker.c>
ServerLimit      16
StartServers         2
MaxClients       400
MinSpareThreads   25
MaxSpareThreads  50 
ThreadsPerChild    25
MaxRequestsPerChild  1000
ThreadLimit          64 
ThreadStackSize      1048576
</IfModule>
#####################

然后在fcgid.conf中进行一些设置

FcgidMinProcessesPerClass 0 
FcgidMaxProcessesPerClass 8 
FcgidMaxProcesses  25
FcgidIdleTimeout 60 
FcgidProcessLifeTime 120 
FcgidIdleScanInterval 30

根据要求,我的输出为/etc/my.cnf

[mysqld]
datadir = / var / lib / mysql
套接字= / var / lib / mysql / mysql.sock
用户= MySQL

#skip-innodb

connect_timeout = 10
max_connections = 300
symbolic-links = 0
innodb_file_per_table = 1
myisam_sort_buffer_size = 8M
read_rnd_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
sort_buffer_size = 512K
table_cache = 32
max_allowed_pa​​cket = 1M
key_buffer = 16k
query_cache_type = 1
查询缓存大小= 32M
thread_cache_size = 16
net_buffer_length = 2K
thread_stack = 256K
wait_timeout = 300

slow_query_log

#log-slow-queries = / var / log / mysql / slow-queries.log
slow_query_log = / var / log / mysql / slow-queries.log
long_query_time = 1

[mysqld_safe]
日志错误= / var / log / mysqld.log
pid文件= / var / run / mysqld / mysqld.pid

和PHP memory_limit = 64M


有任何想法吗?
user1287874

1
因此,在您拥有的1 GB中,如果Apache占用750 MB,您如何预想其他250 GB会被分配?这真的很重要……我要问是因为750高度不现实且不健康。实际上,如果您想要性能良好的系统,则这1 GB中的
〜200-250

Answers:


0

这些设置都是关于平衡的,您可以在不担心内存不足和服务器崩溃的情况下获得它们的水平,或者使进程被vps父进程杀死,这可能就是为什么要获取SegFaults的原因。

通常,当我优化服务器时,我将运行mysql tuning-primer.sh脚本来了解MySQL可以使用的最大内存量:

https://launchpad.net/mysql-tuning-primer

然后对于prefork,我将MaxClients乘以php memory_limit来了解Apache + PHP最多可以使用多少内存。这些是粗略的估计,但是一旦您做了很多,您就会有所感觉。

我尝试将这2的总数保持在服务器的最大内存附近,如果您的VPS没有交换分区,则出于某些原因,我绝对会尝试将其保持在低于RAM的最低水平:

1)服务器上的其他进程将使用内存

2)服务器上的某些php脚本可能正在使用ini_set自己更改memory_limit。

如果您可以提供/etc/my.cnf和php memory_limit,则可以为您提供一些不错的设置。


编辑:我只是想提一提,我知道您使用的是worker而不是prefork,相同的概念适用,但是worker必须处理线程,而不仅仅是MaxClients,因此prefork是一个更好的示例。获取所需信息后,我将不得不查看设置,以便为您提供良好的建议


嗨,迈克尔,您好,我已经更新了设置(在听取了一些建议之后),之后我将Serverlimit降低到了8个Maxclients降低到了200个,将FCGID降低到了10个-会密切注意它的进展。我将很快在原始帖子中发布输出
2013年

多久?四月?
艾迪(Eddie)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.