我有一个1GB的内存VPS。 如果我停止Apache,我有400 MB的RAM免费。 所以最大的客户端应该是(总ram – 使用的ram)/ max_service_ram_consumption = 400 / 31.所以MaxClients应该是13。
这些是定义:
StartServers: number of server processes to start MinSpareServers: minimum number of server processes which are kept spare MaxSpareServers: maximum number of server processes which are kept spare ServerLimit: maximum value for MaxClients for the lifetime of the server MaxClients: maximum number of server processes allowed to start MaxRequestsPerChild: maximum number of requests a server process serves
我正在使用prefork(默认的apache)。
我的configuration是这样的:
Timeout 30 KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 2 <IfModule mpm_prefork_module> StartServers 3 MinSpareServers 3 MaxSpareServers 10 ServerLimit 50 MaxClients 50 MaxRequestsPerChild 1000 </IfModule>
StartServers和MinSpareServers的默认值是5.我将其更改为3.我看不到任何内存消耗的差异。 我也将MaxClients从150更改为50.我将MaxRequestsPerChild限制为1000.(默认为0 – 无限制)。
请告诉我StartServers,MinSpareServers和MaxSpareServers如何影响内存消耗。 为什么拥有更低/更高的价值会是更好/更糟的。 我知道这些价值观也影响着业绩。 但是我找不到一个好的apache内存消耗计算器。
如何configurationapache.conf以便能够拥有大约50/100个最大用户?
你在正确的轨道上。 这里有一些应该帮助你弄清楚剩下的细节。
您需要对mod_status提供的所有统计信息进行详细的Apache监控
内存总是很less,如果你检查所有的虚拟机提供商基本上根据你获得的内存大小收取虚拟机的价格。 所以当你花费时要注意。
您可以定义ServerLimit(需要apache停止/启动来重新定义),然后使用MaxClients(可以通过重新启动进行调整)来设置服务器能够处理的最大值。 这些值是为了保护某人免受互联网浪费您的服务器资源。 如果你计算你可以有13个线程; 13是。
查看一段时间内您的使用模式,并将StartServers调整为平均使用状态。 所以你会从接近平均使用量的东西开始; 如果networking服务器需要提供更多的请求,则会增加几名工作人员。 这些数量将由MaxClients的Ceil值来控制
所以,如果你的交通量增加很小,你不想立即使用大量的工人; 你宁愿要搞一两个工人,以避免浪费大量额外的工人的记忆,这些工人可能不会被使用。 它需要MaxRequestsPerChild产生的进程被销毁,然后基于使用Apache将决定是否需要开始新的replace老工人。
关于MaxRequestsPerChild,你想在这里避免0; 尽pipe将内容caching在内存中以提高性能是一个不错的主意,但是您没有足够的内存空间。 在1000或2000这样的较低的数字可能比默认的10000更好,因为在服务较less的HTTP请求之后回收工作人员会限制他们在内存使用方面逐渐增长的生命周期。 因此,尽早回收这些东西将会为您节省一些回忆。
至于用户数量; 这取决于…如果您的用户将在一整天内很好地打networking服务器,或者是每个人都需要同时需要networking服务器。 你需要监视(graphics和东西)内存,Apache,CPU使用率和其他系统健康数字,并检查这些当你试图想办法使事情运行更平滑,因为没有通用的配方,使事情变得更好; 这取决于用例和使用模式。
在Apache的内存使用上,这是一个棘手的问题。 每个Apache线程都可以访问内存的某个部分。 这个可访问的地址空间是这个特定进程唯一的一部分,而其他一些地址空间部分则与其他Apache线程共享。 所以当你想计算它们全部使用的时候,你要确保你不占用同一个地址空间两次。
这是我计算Apache内存占用量的方法; 你可能需要改变第一行,以适应你的Apache的进程名称,因为根据分配一些名称Apache进程'httpd'一些'apache2'或可能是别的东西我现在不能想到的…
cmd='httpd' ps -o size=,rss=,vsz= $(pgrep "$cmd") | awk ' { size_sum += $1; rss_sum += $2; vsz_sum += $3; processes += 1 } END { printf "Size : %.2f (%.2f) MB\n",size_sum/1024,size_sum/1024/processes printf "RSS : %.2f (%.2f) MB\n",rss_sum/1024,rss_sum/1024/processes printf "VSZ : %.2f (%.2f) MB\n",vsz_sum/1024,vsz_sum/1024/processes }'
输出应该看起来像
Size : 178.84 (16.26) MB RSS : 118.08 (10.73) MB VSZ : 1754.29 (159.48) MB
这是来自我的一个Web服务器。 每行的第一个值是总数,括号中的第二个值是每个进程的平均值。 为了解释价值,我会引用ps man page
这对你的math意味着什么; 进程可能会增长到VSZ大小,他们当前正在使用RAM的RSS ,这是你想要在你的公式中使用的数字,当试图计算MaxClients / ServerLimit时, SIZE在理论上是你的进程可能需要的大小,如果我们完全交换我们的空闲。 有关该主题的一些资源提倡使用pmap来计算内存占用
ps -ef | grep httpd | grep -v ^root | awk '{ print $2 '} | xargs pmap -d | grep ^mapped: | awk '{ print $4 }' | cut -dK -f1 | awk '{ SUM += $1} END { print SUM/NR }'
这应该返回与我们之前计算的SIZE相同的值。