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

我有一个问题,我不能解决我的服务器。 我可能会错过某个地方的configuration,但是我search了一下,发现没有问题。

服务器硬件:Intel Atom N2800 2核,4线程( http://ark.intel.com/products/58917/)4Gb RAM

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

只有一个网站正在运行。 平均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构build的。 symfony的configuration文件可以在这里find: http : //pastebin.com/CJbea0Qf

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

这是Nginx的网站configuration(我find了一个例子,修改一下)重写规则是因为旧地址。

 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-FPMconfiguration。

 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岁。

Evolution我用nginx的fastcgi_cache参数设置了一个caching。 每个页面caching5分钟。 这将打破所有“查看”柜台,但我不在乎,因为该网站显然更快。 我注意到,现在,当我做一个service php5-fpm reload ,服务器正在下降到1负责! 而且,即使在同一时间有100位访问者也会这样。 但奇怪的是,昨天有一次,它又开始上涨了,20点了。 我没有重新加载php5-fpm,它全部下降到1! 它从昨天开始工作 似乎有某种使得php-fpm疯狂的触发点!

一周后,新的设置,这是我做什么来提高我的服务器的性能。

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

其次 ,我将APC缓存大小设置为128M 。我认为这是我的服务器配置最大的问题。 Symfony大量使用APC,APC缓存100%碎片化! 我看到这个apc统计页面(从这里得到它,因为它不存在于我的服务器: http : //jesin.tk/apc-php-download/ )。 现在APC缓存是0.76%分段,95%满,100%缓存命中! 我改变的设置: apc.shm_size 128Mapc.max_file_size 3M

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

现在的服务器真的很稳定,CPU负载大约为2.我想我解决了它!

好像是正常的情况。 服务器不是那么强大,而且每秒有很多请求。 为确保一切正常,请提供页面生成时间,网站未加载时的数量以及网站每秒获取的请求数量(例如,来自访问日志)。

解决这个高负载问题的一个办法是启用Nginx缓存。 如果你有几页,甚至1秒的页面缓存将会有很大的改善。 Nginx可以从缓存中提供每秒数千页的内容。

  1. nginx配置 – 你可以限制一个ip地址的连接数量

    limit_zone one $ binary_remote_addr 4m; limit_conn一个4;

  2. 你可以尝试启用symfony 2文件缓存或使用像清漆。 如果你要使用symfony 2缓存,你会得到更多的硬盘加载
  3. 你可以尝试使用Doctrine Array Hydration