我的VPS计划让我可以将1GB的内存突破到2GB。 当然,我不能每天使用2 GB,也不能使用大于1 GB,所以我打算优化Web服务器的性能。
平均每小时点击量约为8,000-10,000。 这意味着每秒约2个连接。 目前达到的每小时最高点击量约为60'000。 这意味着大约每秒16个连接。
不幸的是,我目前的Apacheconfiguration使用了太多的内存(当没有连接的客户端 – 通常在夜间 – 它使用大约1GB),所以我试图自定义Apache安装,以适应我的需要。
我正在使用Ubuntu,kernel 2.6.18,使用apache2-mpm-worker,因为我读过它需要更less的内存和fcgid(+ PHP)。 这是我的/etc/apache2/apache2.conf:
Timeout 45 KeepAlive on MaxKeepAliveRequests 100 KeepAliveTimeout 10 <IfModule mpm_worker_module> StartServer 2 MinSpareThreads 25 MaxSpareThreads 75 MaxClients 100 MaxRequestsPerChild 0 </IfModule>
这是ps aux的输出:
www-data 9547 0.0 0.3 423828 7268 ? Sl 20:09 0:00 /usr/sbin/apache2 -k start root 17714 0.0 0.1 76496 3712 ? Ss Feb05 0:00 /usr/sbin/apache2 -k start www-data 17716 0.0 0.0 75560 2048 ? S Feb05 0:00 /usr/sbin/apache2 -k start www-data 17746 0.0 0.1 76228 2384 ? S Feb05 0:00 /usr/sbin/apache2 -k start www-data 20126 0.0 0.3 424852 7588 ? Sl 19:24 0:02 /usr/sbin/apache2 -k start www-data 24260 0.0 0.3 424852 7580 ? Sl 19:42 0:01 /usr/sbin/apache2 -k start
而这是ps的辅助为php5:
www-data 7461 2.9 2.2 142172 47048 ? S 19:39 1:39 /usr/lib/cgi-bin/php5 www-data 23845 1.3 1.7 135744 35948 ? S 20:17 0:15 /usr/lib/cgi-bin/php5 www-data 23900 2.0 1.7 136692 36760 ? S 20:17 0:22 /usr/lib/cgi-bin/php5 www-data 27907 2.0 2.0 142272 43432 ? S 20:00 0:43 /usr/lib/cgi-bin/php5 www-data 27909 2.5 1.9 138092 40036 ? S 20:00 0:53 /usr/lib/cgi-bin/php5 www-data 27993 2.4 2.2 142336 47192 ? S 20:01 0:50 /usr/lib/cgi-bin/php5 www-data 27999 1.8 1.4 135932 31100 ? S 20:01 0:38 /usr/lib/cgi-bin/php5 www-data 28230 2.6 1.9 143436 39956 ? S 20:01 0:54 /usr/lib/cgi-bin/php5 www-data 30708 3.1 2.2 142508 46528 ? S 19:44 1:38 /usr/lib/cgi-bin/php5
正如你可以看到它使用大量的内存。 我怎样才能减less到适合1GB的内存?
PS:我也考虑切换到Nginx,如果Apache不能满足我的需要…
UPDATE1:我刚刚写了一些关于fcgid config的内容,因为我之前没有这样做:
FcgidMaxRequestsPerProcess 1000 FcgidIdleTimeout 15 FcgidBusyTimeout 30 FcgidMaxProcessesPerClass 5
减lessApache使用的内存量相当简单…只需增加线程数就可以减less进程的数量。
另一方面,减lessCGI / PHP使用的内存数量将很大程度上取决于您的PHP应用程序,它们的内存效率以及您使用的是哪个版本的PHP。
至less,你可以看看下面的修改你的Apache,这将给你2个Apache进程,每个线程有50个线程,并确保Apache进程每10k连接重新加载一次(不考虑keepalived连接)以释放Apache内存:
<IfModule mpm_worker_module> KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 StartServers 2 ServerLimit 2 MinSpareThreads 50 MaxSpareThreads 100 ThreadLimit 100 ThreadsPerChild 50 MaxClients 100 MaxRequestsPerChild 10000 </IfModule>
那么你可能想看看你的fcgidconfiguration,以确保你限制活跃的php进程的数量,并确保进程得到重新加载,以释放未使用的内存。 但是,这很大程度上取决于您的Web应用程序和使用模式:
FcgidMaxRequestsPerProcess FcgidIdleTimeout FcgidBusyTimeout FcgidMaxProcesses FcgidMaxProcessesPerClass
我已经通过编译Apache(使用prefork!)+ PHP5在我的VPS上解决了。 现在它从50个subprocess开始,消耗大约6-700 MB。
我认为这是我能做的最好的:P