我的 VPS 套餐提供 1GB RAM,可扩展至 2GB。当然,我不可能每天都使用 2GB,也不可能每天使用超过 1GB,所以我计划优化我的网络服务器的性能。
每小时的平均点击量约为 8,000-10,000。这意味着每秒大约有 2 个连接。到目前为止,每小时的最大点击量约为 60,000。这意味着每秒大约有 16 个连接。
不幸的是,我当前的 apache 配置使用了太多内存(当没有连接的客户端时 - 通常在夜间 - 它使用大约 1GB)所以我尝试定制 apache 安装以满足我的需求。
我使用的是 Ubuntu,内核 2.6.18,带有 apache2-mpm-worker,因为我读到它需要较少的内存,以及 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
这是 php5 的 ps aux:
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
如您所见,它占用了大量内存。我该如何将其减少到仅适合 1GB RAM?
PS:如果 Apache 不能满足我的需求,我也考虑切换到 nginx...
UPDATE1:我刚刚写了一些关于 fcgid 配置的内容,因为我之前没有写过:
FcgidMaxRequestsPerProcess 1000
FcgidIdleTimeout 15
FcgidBusyTimeout 30
FcgidMaxProcessesPerClass 5
答案1
减少 Apache 使用的内存量相当简单...只需通过增加线程数量来减少进程数量。
另一方面,减少 CGI / PHP 使用的内存量在很大程度上取决于您的 PHP 应用程序、它们的内存效率以及您所使用的 PHP 版本。
至少,您可以尝试使用以下命令修改您的 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>
然后,您可能需要查看 fcgid 配置,以确保限制活动 php 进程的数量,并确保重新加载进程以释放未使用的内存。然而,这在很大程度上取决于您的 Web 应用程序和使用模式:
FcgidMaxRequestsPerProcess
FcgidIdleTimeout
FcgidBusyTimeout
FcgidMaxProcesses
FcgidMaxProcessesPerClass
答案2
我通过在我的 VPS 上编译 apache(使用 prefork!)+ PHP5 解决了这个问题。现在它以 50 个子进程启动,消耗大约 6-700 MB。
我认为这是我能做的最好的事情 :P