锁定老帖子 主题:一个网站性能的问题,寻求帮助!
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-27
最后修改:2008-11-19
网站是一个wap站点,负责将用户访问的web站点的页面转换成为wml页面展示给手机用户 服务器主要使用apache2.2 + resin3.1,四台服务器 一台服务器用apache做入口,使用mod_caucho做负载均衡,另外三台服务器负责处理具体逻辑 其中抓取网页部分用了Apache的Commons-HttpClient,解析HTML用了NekoHtml,缓存使用的是OSCache(没有做集群),数据库(主要保存的是html->wml的转换规则数据,数据量很小)用的MySql5。 逻辑的主要流程是这样: 1、用户在wap页面上点击或者输入一个web站点的网址,交给服务器处理 2、服务器首先判断请求的网页是否在本地缓存,如果是,直接输出给用户。 3、如果本地缓存不存在,则通过httpclient抓取远程的网页,并且解析并且根据一定规则处理成手机能够浏览的wml页面,展示给手机用户。
开始用户量很小的时候没出现什么问题,但随着每天PV的增加,性能的问题就越来越明显 目前每天的访问量大概每天只有100万的PV左右,但性能已经出现比较大的问题了。
现在的表现是抓取网页速度明显有所下降,从每次抓取一个页面需要几十到几百毫秒上升到了几秒钟,而且那两台Resin服务器的CPU的占用率最高时候能够达到接近100%,有时则是resin停止响应,需要重启resin才能继续响应用户请求。
另外在CPU占用方面,有些数据我不是很明白: 这是TOP出来的数据: CPU states: cpu user nice system irq softirq iowait idle
这里边的System指的是什么操作所占用的CPU呢?
数据库肯定不是瓶颈所在,因为全部做了缓存。 缓存本身也应该不会是瓶颈所在,因为用的是内存缓存+硬盘缓存 现在猜想的瓶颈可能会发生在解析HTML和抓取网页数据的部分。
通过自己的测试和分析,找出了问题可能导致性能问题的地方: 1、由于高峰期每秒接收用户请求并且数据不在缓存中的情况大概有5-10条,然而这10多条的数据抓取不可能在一秒钟之内完成(设置了抓取的超时时间是5秒钟),所以可能会导致前面的请求还没有处理完,后面的请求又过来了,对外的连接数就会一直增多,直到无法响应。但这种情况只应该发生在夜里10点到12点的高峰期。 2、经过JProfiler测试,发现占用CPU最高的操作是用NekoHtml解析HTML,占用的全部CPU资源的70-80%,这个我分析可能是影响效率的主要原因,我测试了一下,处理news.163.com这样的页面居然要花费几秒钟的时间。由于在做转换的时候我需要逐一遍历html的节点,所以用了递归方式处理的节点数据,但我不知道这个是否会影响解析的性能。 3、不知道mod_caucho在负载均衡方面是否有问题,因为发现三台resin的服务器分配的请求不太平均,其中一台分配的用户请求比较多,另外两台少一些,这样用户请求多的那一台服务器压力就特别大,所以导致访问速度非常慢。想尝试一下apache的反向代理负载均衡的模块试一下,不知道会不会分配平均一些。
请各位帮忙看一下性能问题可能会出现在什么地方,有什么好的方式解决没有?多谢了!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-06-27
看你还在用Linux Kernel 2.4吧,不妨升级到Kernel2.6看看。
system高是系统进程占用了CPU,也可能是线程切换导致的,再仔细观察观察vmstat |
|
返回顶楼 | |
发表时间:2008-06-27
robbin 写道
看你还在用Linux Kernel 2.4吧,不妨升级到Kernel2.6看看。
system高是系统进程占用了CPU,也可能是线程切换导致的,再仔细观察观察vmstat 服务器内核版本的确是2.4,准备升级一下了,另外今天我把OSCache的文件缓存去掉只用内存缓存,现在system已经降下来了,但性能还是跟不上,现在是高峰期,user所占的CPU达到了90%以上,系统空闲的CPU几乎没有
[root@TXYJ-SVR log]# top PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND |
|
返回顶楼 | |
发表时间:2008-06-28
java->1.6
sun java -> bea jrockit linux 2.4 -> 2.6 oscache -> memcached(解决java内存消耗,顺便解决2台机器的2份同样缓存的内存浪费问题) 把apache更换成lighttpd或者nginx,用proxy 3台resin拿出其中一台来做专门的获取url和分析操作 resin发现没有缓存中的,就发送命令到这台服务器上去,然后先告诉用户等待几秒钟重新刷新 这种结构就是至少保证缓存存在的访问者没有问题,然后下来的问题就是怎么改进抓取效率和页面处理效率的事情了 |
|
返回顶楼 | |
发表时间:2008-06-28
引用 2、经过JProfiler测试,发现占用CPU最高的操作是用NekoHtml解析HTML,占用的全部CPU资源的70-80%,这个我分析可能是影响效率的主要原因,我测试了一下,处理news.163.com这样的页面居然要花费几秒钟的时间。由于在做转换的时候我需要逐一遍历html的节点,所以用了递归方式处理的节点数据,但我不知道这个是否会影响解析的性能。
显然转换的程序需要优化 |
|
返回顶楼 | |
发表时间:2008-06-30
今天对缓存系统进行了改造,原来是每一台的Resin都自己维护自己的缓存,用OSCache,但考虑到要保存三份缓存也是资源浪费,所以就找了apache那台机器安装了memcached,分配了1G的内存,然后用memchaced的jar来替换之前的OSCache的缓存机制,开始没有赶把所有resin都替换,只替换了其中一台resin做测试,开始没出现什么问题,速度也还好,但过了一会resin就开始报错,Too many open files。本来我设置memcached的最大连接数是20,但用netstat查看的时候发现在memcached的端口上有80多个连接,不知道是不是我的代码哪里有问题呢? protected static MemCachedClient mcc = new MemCachedClient(); ... .. private CacheTool() { //设置memcached String[] servers ={"116.213.64.53:10240"}; Integer[] weights = { 3 }; SockIOPool pool = SockIOPool.getInstance(); pool.setServers( servers ); pool.setWeights( weights ); pool.setInitConn( 5 ); pool.setMinConn( 5 ); pool.setMaxConn( 20 ); pool.setMaxIdle( 1000 * 60 * 60 * 6 ); pool.setMaintSleep( 30 ); pool.setNagle( false ); pool.setSocketTO( 3000 ); pool.setSocketConnectTO( 0 ); pool.initialize(); } public Object getCache(String key, int period) { Object objValue = null; if(!remote){ try { objValue = cacheAdmin.getFromCache(key, period); } catch (NeedsRefreshException nrex) { cacheAdmin.cancelUpdate(key); objValue = null; } }else{ //使用memcached获取缓存内容 objValue = mcc.get( key ); // System.out.println(objValue); } return objValue; } ... .... public void putCache(String key, Serializable objValue) { if(!remote){ try{ cacheAdmin.putInCache(key, objValue); }catch(Exception e){ cacheAdmin.cancelUpdate(key); } }else{ //设置缓存,6小时后实效 mcc.set(key, objValue,new java.util.Date(1000*60*60*6)); } }
|
|
返回顶楼 | |
发表时间:2008-06-30
ulimit -n 4096看看
|
|
返回顶楼 | |
发表时间:2008-07-01
非常感谢以上老大们的帮助!
我已经把OSCache完全替换成memcached了 然后ulimit -n 65535 效果很明显,现在系统还算比较稳定了运行,只是解析HTML部分还暂时没想到办法 另外,发现apache使用mod_caucho作为负载均衡的时候,分配很不均匀,第一台服务器总是压力很大,后边两台压力就小的多,如果采用proxy的方式会不会好一些? |
|
返回顶楼 | |
发表时间:2008-07-01
用mod_proxy_http就很好
|
|
返回顶楼 | |
发表时间:2008-07-02
楼主很强啊?
html->wml ---你们能做?sina首页你们能转化么? 想当初2001年的时候,想做一个类似的html->wml的网关,无奈html太复杂,太不规范,已经放弃了。 html->wml 转化的效率很低啊,而且转化的正确率也很低啊! 不知道楼主的服务如何? |
|
返回顶楼 | |