优化繁忙的网站与清漆和大量的内存

[更新更多consise!]

我是新来的优化Web服务器的大量stream量的世界,但现在我正在进入。

星期一我们的networking服务器被“猛砍” – 我们得到了大量的stream量(一个小时左右就有85,000名访问者),即使我们运行Varnish和nginx(它们正在做好自己的工作),Apache的一方真的很挣扎是在某些请求上生成的一些dynamic内容。

服务器目前有8GB的内存, 很快就会升级到32GB ,所以我真的需要32GB系统的configuration帮助。 目前运行64位的centos。

我已经研究了清漆和nginx设置,它们是非常合理的设置(静态内容由nginx直接抛出,大量的dynamic东西抛出清漆,如果不清漆的请求传递给Apache)。

所以到Apache ..我们使用MPM prefork模块,每个Apache进程似乎用尽了很多公羊:

前三名:

S 48 20961 2965 0 75 0 187128 128307 ? ? 00:05:25 httpd S 48 20959 2965 0 75 0 249788 143435 ? ? 00:05:55 httpd S 48 18581 2965 0 75 0 314564 157747 ? ? 00:06:40 httpd 

底部3:

 S 0 2965 1 0 78 0 15132 89017 stext ? 00:00:00 httpd S 48 20947 2965 0 75 0 38492 93001 ? ? 00:00:00 httpd S 48 20945 2965 0 75 0 43300 93897 ? ? 00:00:01 httpd 

我不完全确定,但我认为一个进程=一个客户端=一个连接到一个人的浏览器。 我想我的第一个问题是可以有人确认吗? 是的,我们在同一台服务器上运行php和zend框架,MySQL作为数据库后端。

目前的configuration(服务器目前有8GB RAM):

 MaxKeepAliveRequests 100 KeepAliveTimeout 2 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 200 MaxClients 200 MaxRequestsPerChild 500 </IfModule> 

我认为目前Apache在理论上可以尝试在最坏的情况下使用大约63GB的内存。 例如,315MB进程* 200 maxclients =大量ram。 我不完全确定它是这样工作的,但如果有人可以证实,它也会帮助!

我想要做的是获得一些关于我应该注意的事情的build议 – 我们希望服务器能够随时处理另一个请求,并利用所有我们得到的新RAM 。 如果我自己弄不清楚的话,我会在另一个问题上进行MySQL的优化,但是为了防止这种情况的发生,以下是conf: http : //pastebin.com/GbJU7AxY

干杯! 约翰。

这个85,000 /天的访客人数究竟是多less? 独特的访问者,总的HTTP命中,还有什么?

只要能够从caching中提供请求,光油应该能够每秒处理数千次点击,并且只需很less的CPU和内存。 特别是当Slashdotted,因为大多数人会寻找完全相同的内容。 它确实需要微调。 默认情况下,它是相当保守的,因为它不太了解通过的内容。 它根据它所看到的标题和一个简单的规则集来做出决定。 例如,默认情况下,Varnishcaching对象2分钟,但是只有当请求中不存在cookie时 ,对象的TTL> 0,…等。检查默认VCL(特别是vcl_recvvcl_fetch )以确定默认的逻辑,并确保你了解它。

因此,即使您的后台服务器没有处理GA cookie,但通过Google的JavaScript处理,您的域上设置的一个Google Analytics Cookie也会将所有请求传递到后端。 一个WordPress应用程序设置各种types的cookies,其中大部分只适用于dynamic内容,这些内容由浏览器在每个请求中返回。 如果您的页面包含49个静态资产和1个dynamic页面,则表示这些静态资产都不会被caching,因为这些请求包含您不关心的Cookie。 只有dynamic请求上的cookie才能通过。 像这样的错误基本上禁用了清漆。 另外,代码返回的各种caching控制(和相关的)HTTP头是很重要的。 如果您的应用程序声明Varnish从后端检索的对象已经过期,例如过去使用了Expires标头,则Varnish将不会caching该对象。

换句话说,您需要调整您的应用程序以发出正确的标题,以便客户端(包括Varnish和浏览器)都可以caching返回的内容。 任何你不能在你的应用程序中纠正的,你可以在Varnish的VCL中重写。

例如,这里是我的代码,以删除到达服务器的各种客户端跟踪cookie。 这属于vcl_recv

 # Remove tracking cookies. The server doesn't need to see them. if (req.http.Cookie) { # Remove has_js and Google Analytics __* cookies. set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js|sifrFetch)=[^;]*", ""); # Remove a ";" prefix, if present. set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); # Remove cookie header if empty if (req.http.Cookie == "") { remove req.http.Cookie; } } 

同样,我将传入的cookie删除到某些path,以使这些请求可caching:

 if ( req.url ~ "^/cms/cms_files/(?:css|img|js)/" || #CMS1 req.url ~ "^/site_files/(?:css|img|imgc|js|swf|uploads|xml/.+\.xml$)" || #CMS1 req.url ~ "^/(?:images|stylesheets|javascripts|swf|site_files/js_libs|site/image|favicon\.ico$|robots\.txt$)" || #CMS2 ( req.http.host ~ "(?:shop\.example\.com|www\.example\.nl)" && #Magento req.url ~ "^/(?:404|js|media|skin|favicon\.ico$)" ) || #Magento ) { unset req.http.cookie; } 

我在vcl_fetch中使用了一个类似的节,并且unset beresp.http.cookie; 而是防止后端在我不想要的path上设置任何Cookie。

你可以添加一些debugging头文件给你提供关于varnish处理请求的信息。 查看那些与萤火虫,你会更多地了解你的应用程序。 另一个很好的信息来源是“ 清漆书” 。 例如,请参阅: https : //www.varnish-software.com/static/book/VCL_Basics.html

我们的大部分dynamic内容都被caching了60年,足以抵御踩踏事件。 如果你需要一些单独的内容,但是你的页面上的大部分内容都是静态的,可以看一下Varnish的ESI (edge-side-includes),它允许你为页面的不同部分指定不同的cache-TTL。

现在您已经将后端请求减less到最低限度,优化了这些请求。 分析您的应用程序,find并解决问题。

你是正确的: MaxClients x (maximum physical memory per Apache process) = (total memory Apache can use)

这是物理内存,而不是你提到的虚拟内存。 最后, res列显示每个进程使用的物理内存。 每个Apache进程都会增长到您网站运行的最大脚本。 将MaxClients限制为您的服务器可以处理的数量。 接受您没有资源的请求是没有意义的。 只要你开始交换,你就输了。 增加Apache preforks的进程(服务器)数量,因为分叉是一个非常繁重的操作。 ServerLimit行是多余的。 禁用KeepAlive或将其设置为1-2秒。

如果您提供了很多静态资产,请考虑从mod_php切换到PHP-FPM。 这使您的Apache进程轻量级。