案例场景

  A服务器充当静态服务器的同时又充当动态服务器A服务器上的首页,有一个动态请求,提供及时资讯服务,2秒即要更新客户端的数据信息,且该功能被站外大量引用,很大程度上增加了并发请求的密度。另外,该功能是该项目的核心,对于用户来说访问网站的目的就是使用该功能。

 

解决方法

  项目上线后,高并发引起的问题首先暴露在数据库的访问的压力过大上。解决方法:调整mysql默认的最大连接数,调整方法如下:

  1)进入MYSQL安装目录打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100;

  2)修改为 max_connections=500;

  3) 重启服务。

  问题暂时得以解决之后,连接数够用了,但是动态请求依然不能正常访问。分析日志得到结论:大量频繁DB查询,导致cpu时间统统被java进程占据。解决方法,将查询结果缓存至内存中,调整思路如下:

  1)第一次访问该应用的时候,执行查询操作,把动态功能需要的全部数据缓存到Mapx里面;

  2)动态功能需要的数据从缓存中取得,不直接访问数据库;

       3)  用定时任务每2秒执行一次,更新缓存中的数据。

  问题暂时得以解决之后,数据库查询变少了,但是并发问题依然没有解决。解决方法,优化apache配置,方法如下:

  修改httpd.conf文件中的<IfModule prefork.c>模块配置为

  <IfModule prefork.c>

  StartServers       10

  MinSpareServers    20

  MaxSpareServers    80

  ServerLimit      2000

  MaxClients       1000

  MaxRequestsPerChild  10000

  </IfModule>

  以增加apache吞吐量

  问题暂时得以解决之后,apache吞吐量变大了,但是并发问题依然没有解决。暴露问题:动态应用由于使用proxypass转发,tomcatajp处理不了如此高并发的访问,导致503错误。解决方法如下:

  1)将缓存的数据写到xml文件里,保存到静态应用下,从而避免503错误。

  2) 前台用ajax 处理 xml数据。

  3)配置Apache Server Status 监视apache运行状态

  <location /zving-server-status>

  SetHandler server-status

  </location>

  4)访问 http://servername/zving-server-status 查看apache状态