Symfony2网站+100用户= 100%CPU费用

时间:2013-11-25 22:51:55

标签: php symfony nginx debian

我遇到了一个问题,我的服务器无法解决。我可能会错过某处的配置,但我搜索并发现没什么好的。

服务器硬件: 英特尔凌动N2800 2个核心,4个线程(http://ark.intel.com/products/58917/) 4Gb RAM

它使用NGinx,PHP5 FPM和MySQL在Debian7下运行。

只有一个网站在运行。平均50位访客同时访问,最多可达140位访客。

这是高峰时间发生的事情:

top - 23:01:41 up 80 days,  8:40,  1 user,  load average: 19,78, 19,52, 19,37
Tasks: 166 total,  22 running, 144 sleeping,   0 stopped,   0 zombie
%Cpu(s): 90,6 us,  9,1 sy,  0,0 ni,  0,0 id,  0,0 wa,  0,0 hi,  0,3 si,  0,0 st
KiB Mem:   4020300 total,  3232164 used,   788136 free,   362764 buffers
KiB Swap:   525308 total,   121404 used,   403904 free,  1191508 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
32295 www-data  20   0  247m  37m 6456 R  19,5  1,0   4:02.15 php5-fpm
32469 www-data  20   0  251m  40m 6592 R  19,5  1,0   3:30.46 php5-fpm
32689 www-data  20   0  243m  32m 6816 R  19,2  0,8   2:56.03 php5-fpm
32692 www-data  20   0  251m  41m 6564 R  19,2  1,0   2:57.84 php5-fpm
 1115 www-data  20   0  251m  40m 6428 R  18,9  1,0   0:54.01 php5-fpm
 1249 www-data  20   0  251m  40m 6356 R  18,9  1,0   0:42.35 php5-fpm
 1251 www-data  20   0  250m  39m 6420 R  18,9  1,0   0:37.36 php5-fpm
31314 www-data  20   0  251m  40m 6440 R  18,9  1,0   6:52.49 php5-fpm
32296 www-data  20   0  251m  40m 6560 R  18,9  1,0   4:03.63 php5-fpm
32410 www-data  20   0  251m  40m 6708 R  18,9  1,0   3:53.65 php5-fpm
32468 www-data  20   0  247m  36m 6720 R  18,9  0,9   3:27.14 php5-fpm
32471 www-data  20   0  251m  40m 6472 R  18,9  1,0   3:33.24 php5-fpm
32691 www-data  20   0  251m  40m 6584 R  18,9  1,0   3:03.90 php5-fpm
32294 www-data  20   0  251m  40m 6452 R  18,5  1,0   4:18.55 php5-fpm
32297 www-data  20   0  251m  40m 6456 R  18,5  1,0   4:07.43 php5-fpm
32467 www-data  20   0  246m  35m 6456 R  18,5  0,9   3:41.64 php5-fpm
 1250 www-data  20   0  241m  30m 6312 R  18,2  0,8   0:37.06 php5-fpm
32114 www-data  20   0  247m  37m 6428 R  18,2  0,9   4:38.27 php5-fpm
32470 www-data  20   0  243m  32m 6424 R  18,2  0,8   3:30.56 php5-fpm
32527 www-data  20   0  239m  28m 6428 R  18,2  0,7   3:19.96 php5-fpm
 1629 root      20   0 17228 5444 1308 S   2,9  0,1   0:01.63 rkhunter
23561 mysql     20   0  488m  73m 7944 S   1,3  1,9 227:34.60 mysqld
 4016 root      20   0 23740 1660 1136 R   0,7  0,0   0:00.07 top
20368 www-data  20   0 66340 4732 2116 S   0,3  0,1  10:34.08 nginx

你肯定明白我不能那样。

该网站使用Symfony2构建。 symfony的配置文件可在此处获取:http://pastebin.com/CJbea0Qf

phpinfo在那里:https://drive.google.com/file/d/0ByNmwlJzaeKpNkNTcF9GZGNQVmM/edit?usp=sharing

这是网站的Nginx配置(我找到了一个例子并稍微修改了一下) 重写规则是因为旧地址。

server {
    listen *:80;

    server_name ***.fr www.***.fr;

    root /home/www/clients/client1/web7/web/beta/web/;


    rewrite ^/index.php / permanent;
    rewrite ^/disclaimer.php / permanent;
    rewrite ^/disclaimer-mobile.php / permanent;
    rewrite ^/news.php /news permanent;
    rewrite ^/contact.php /contact permanent;

    rewrite ^/app\.php/?(.*)$ /$1 permanent;

    try_files $uri @rewriteapp;

    location @rewriteapp {
            rewrite ^(.*)$ /app.php/$1 last;
    }

    # Deny all . files
    location ~ /\. {
            deny all;
    }

            # Do some static file caching
            location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
                    log_not_found     off;
                    expires           1d;
            }

    location ~ ^/(app|app_dev)\.php(/|$) {
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_index app.php;
            send_timeout 1800;
            fastcgi_read_timeout 1800;
            fastcgi_buffer_size 128k;
            fastcgi_buffers 256 16k;
            fastcgi_busy_buffers_size 256k;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            #fastcgi_pass 127.0.0.1:9000;
    }

     location ~ ^/(mystatus|myping)$ {
            access_log off;
            include fastcgi_params;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
    }


    # Statics
    location /(bundles|media) {
            access_log off;
            expires 30d;

            # Font files
            #if ($filename ~* ^.*?\.(eot)|(ttf)|(woff)$){
            #       add_header Access-Control-Allow-Origin *;
            #}

            try_files $uri @rewriteapp;
    }
}

最后,PHP-FPM config。

pm = dynamic
pm.max_children = 20
pm.start_servers = 10
pm.min_spare_servers = 8
pm.max_spare_servers = 15
pm.max_requests = 400

我不知道您是否需要其他数据来帮助我解决这个问题。

该网站非常“轻松”。不是很多用户交互,只是简单的页面(它主要是一个图库),所以只生成页面。

非常感谢

可能(或不是)重要的一件事 当我重新加载php5-fpm时,负载电量相当平静(~2),但它随着时间的推移而放大,直到不低于8。

演进 我用nginx fastcgi_cache参数设置了一个缓存。每个页面缓存5分钟。这将打破所有“视图”计数器,但我不在乎网站显然更快。 我注意到,现在,当我执行service php5-fpm reload时,服务器将降至1负责!即便在同一时间有+100名访客,它仍然如此。但奇怪的是,昨天一次,它又开始上升,20次充电。我确实重装了php5-fpm,这一切都降到了1!它从昨天起就开始工作了。 似乎有某种触发点让php-fpm变得疯狂!

3 个答案:

答案 0 :(得分:4)

使用新设置一周后,我会采取以下措施来改善服务器的性能。

首先,我使用 Nginx fastcgi缓存。这显然提高了性能!!缓存的页面非常快。 我遵循http://www.digitalocean.com/community/articles/how-to-setup-fastcgi-caching-with-nginx-on-your-vpshttp://techminded.net/blog/transparent-cache-in-nginx.html之类的内容。很容易理解它是如何工作的。我的缓存设置为5分钟。对于某些页面来说太多了,对其他页面来说还不够。我必须在这一点上努力。但由于这是PHP-FPM占用所有资源,而不是执行PHP代码显然降低了CPU费用。

第二次,我将 APC缓存大小设置为128M我认为这是我服务器配置的最大问题。 Symfony使用APC很多,APC缓存是100%碎片!我在apc stat页面看到了这一点(从我这里得到它,因为我的服务器上没有它:http://jesin.tk/apc-php-download/)。现在,APC缓存碎片为0.76%,95%已满,100%缓存命中! 我更改的设置为apc.shm_size 128Mapc.max_file_size 3M

BTW,在APC统计页面上,我可以看到1728.50缓存请求/秒。当然,如果你的缓存不好,性能会很差。现在一切都清楚了!这应该在Symfony的文档中解释,因为它是非常重要的一点。

服务器现在非常稳定,CPU负载大约为2.我想我已经解决了!

答案 1 :(得分:1)

似乎这是正常情况。服务器不是那么强大,每秒有很多请求。为了确保一切正常,请提供页面生成时间,站点未加载时,以及站点每秒获取多少请求(例如,从访问日志)。

此高负载问题的解决方案之一是启用Nginx缓存。如果你有几页,即使1秒的页面缓存也会有很大的改进。 Nginx每秒可以从缓存中提供数千页。

答案 2 :(得分:-1)

  1. nginx配置 - 您可以限制来自一个IP地址的连接数

    limit_zone one $ binary_remote_addr 4m; limit_conn one 4;

  2. 您可以尝试启用symfony 2文件缓存或使用类似清漆的内容。如果您打算使用symfony 2缓存,则可以获得更多的硬盘加载
  3. 您可以尝试使用Doctrine Array Hydration