[公告]网站遇到了性能问题

这两天,在访问高峰期时,博客园网站会出现性能问题。
出现问题时,访问博客园速度比较慢,Web服务器CPU占用很高,经常处于100%,数据库服务器CPU占用更高,几乎是一条直线,重启IIS才能暂时解决问题。
该问题给大家带来了麻烦,请大家谅解!
问题的原因正在进一步分析中,原因可能是:1、搜索引擎爬网 2、程序本身的性能问题。
我会尽快解决这个问题。
期待有经验的朋友提供一些好的建议。
博客园目前的程序运行于ASP.NET 2.0+SQL Server 2005。

posted on 2006-07-04 14:39 dudu 阅读(3401) 评论(53)  编辑 收藏 网摘 所属分类: 网站管理

评论

#1楼 2006-07-04 14:58 蛙蛙池塘      

好,知道了。   回复  引用  查看    

#2楼 2006-07-04 15:13 阿蒙      

在下公司的网站也曾遇到这样的问题
网站访问突然变慢,甚至间断出现“服务器太忙”的异常。
后经过分析,发现造成这一问题的原因是:
1、yahoo搜索引擎爬网。
2、有网友使用机器人程序往数据库疯狂的新建记录!
  回复  引用  查看    

#3楼 2006-07-04 15:16 笑望人生      

请注意您使用的Sql Server 2005 的版本,尤其是Sql Server 2005 的Express 版或 Developer 版,他们都有性能限制,据我所知他们都有5个并发连接的限制。

如果使用了上诉两中版本,对于Asp.Net这样的并发连接数量很多的情况下,网站访问变慢就是正常的事情了。
  回复  引用  查看    

#4楼 2006-07-04 15:35 AlphaWu      

我想dudu用的肯定不会是Sql Server 2005 的Express 版或 Developer
呵呵、至少应该是Ent版本
我的Server用的就是Sql 2005、只知道它很占内存、我一般在线300人左右、、SQL 内存大概1.5G、CPU都很正常

建议dudu分析一下日志、看看是不是有很多蜘蛛
  回复  引用  查看    

#5楼 2006-07-04 15:36 第一控制.NET      

确实偶尔速度会变慢。这里至少也是sql2005标准版吧。难道这就要开始负载均衡了?   回复  引用  查看    

#6楼 2006-07-04 15:48 .progame[未注册用户]

我觉得有两点需要做的:
1、去日历的无效链接去除 防止搜索引擎爬虫去爬 可能为翻到N年之后
2、对很多多页显示去除 如评论 日志的 几百页的显示 这个人工是不会去翻 但搜索引擎会 虽然用了高效的分页算法 但对数据库仍然是一个很大的压力
  回复  引用    

#7楼 2006-07-04 16:20 萧远山      

可以试试ADO2.0中的连接池.同时SQL2005里有新的分页技术,也可以试试   回复  引用  查看    

#8楼 2006-07-04 16:29 Bear.sTaR{R}      

今天是感觉特别忙,继续支持园子。

希望dudu可以早点解决问题!!!
  回复  引用  查看    

#9楼 2006-07-04 16:36 .progame[未注册用户]

我的想法是 避免去查询大数据量并分页 可以通过archive category去查到需要的数据
  回复  引用    

#10楼 2006-07-04 17:09 鞠强_方枪枪[未注册用户]

CPU持续100%,一般这么来处理:
0、查看eventvwr,是否有error或者warning。.net部分是否有CLR被recycled等信息。
1、打开performance monitor(start-run-perfmon),建立一个新的trace,然后抓memory/logical disk/phisical disk/process/processor/system/server,这些counters要全部的,这样也简单点。这个东西可以在server restart之后,立刻启动,到你忍受不了的系统性能时候为止(建议4个小时左右,在访问高峰期)。然后分析这些counters,是否达到或者超过了阈值。具体阈值,你可以看perfmon自己的help,或者压缩.blg文件发给我,我帮你看。对于是否是爬网造成的,可以看counters或者分析下面抓到的dump来判断。
2、如果是w3wp或者inetinfo或者dllhost等占用CPU持续很高,可以用adplus按照hang模式来抓。格式如:adplus -hang -p 1234 -o c:\dumps,或者,直接等到CPU持续几分钟一直100%之后,用adplus来抓。然后用windbg来分析,load sos.dll之后,用!runaway命令来找到CPU执行时间最长的几个thread,然后分别kb,或者!dumpstack,或者!clrstack。当然,直接用debugdiag分析也可以。不过根据我的经验,效果好像很差,没什么能分析出来。

-- 晕,没有登录,提示我:姓名与注册用户同名, 如果你是注册用户, 请先登录; 如果你是非注册用户,为了方便区分, 请更改名称。
  回复  引用    

#11楼 2006-07-04 17:09 产品[未注册用户]

SQL 2005本身有Bug,某些记录查询会死机, 我正在下载sp1, 希望能解决   回复  引用    

#12楼 2006-07-04 17:11 鞠强_方枪枪[未注册用户]

对上面兄弟的回复提个建议,是否网爬,是否分页,是否NLB等,都需要我们分析抓到的真实数据后才能判断。否则,这么猜下去,是很难找到真正的原因的。对于这种问题或者crash或者memory leak等,看performance monitor,抓dump,除此没有真正有效的办法的。   回复  引用    

#13楼 2006-07-04 17:13 鞠强_方枪枪[未注册用户]

当然,再补充一下,像上面“产品”说的,首先把系统打到最新的补丁,呵呵(大部分情况可以,偶尔会出现更恶劣的问题)。   回复  引用    

#14楼 2006-07-04 17:19 产品[未注册用户]

这个Bug是我用程序证实的, 而且随机出现,我2个多月才出现一次, 我的存储过程只对出错的记录,不出结果, 而且如果使用参数批处理,该查询正常, 如果是用存储过程,和直接输入字符串,就不行.
我是C/S程序,B/S可能超时了,但在执行期间CPU占用率一直是100%
建议装sp1试试看,我正在下
  回复  引用    

#15楼 2006-07-04 17:23 鞠强_方枪枪[未注册用户]

ooh, sorry,没有看到dudu说的db server也是100%。
那么,上面的步骤0、1依然适合。步骤2就免掉了。
如果看上面的0、1结果,配置没有问题,那么用profiler来抓trace。同样的,也是在高峰期来抓,抓sql和存储过程即可。如果怀疑有死锁,你可以从msdn上找一个自动抓死锁的sp来跑。或者dbcc traceon(1204,3605,-1)来记录到sql自己的log中。
抓好trace后,分析同类的、I/O贼大贼大的语句,这些必须要优化。I/O很大胆是偶尔执行一次,可以暂时不优化。

之所以补充这个,是因为很多hang的情况,是因为biz layer等待db transaction的完成。如果db有性能问题,那么web等待的长,对外表现,就是high cpu。
我们项目曾经碰到过一次类似情况,最终看dump,是因为某些代码里面对于db conn没有close,导致conn pool用光,然后web等待可用conn,然后client等待web响应,造成客户端无相应症状。这个问题我曾经写过blog,在http://juqiang.spaces.msn.com上面http://juqiang.cnblogs.com是否有,就忘记了。

希望dudu同时抓trace和dump以及performance counters,这样能排除的快一些。
  回复  引用    

#16楼 2006-07-04 17:23 产品[未注册用户]

最严重的是这个Bug可以将客户端Management Studio 挂死, 挺恐怖的   回复  引用    

#17楼 2006-07-04 17:25 鞠强_方枪枪[未注册用户]

修正一下

那么,上面的步骤0、1依然适合。步骤2就免掉了。

修改为:
那么,上面的步骤0、1依然适合。在db server上 步骤2就免掉了。
  回复  引用    

#18楼 2006-07-04 17:26       

1、中毒了。也有可能的,最近是发毒日!杀毒软件最吃CPU了且最霸道。-优先Check
2、另之前建议的COM+技术值得考虑(内存数据库、多线程等)-治本
3、IIS6.0配置优化-治标
a.去除不必要的Log-LOG文件的记录时间也很可观
b.应用程序池划分:如前台、后台,并设置不同的“请求队列限制”
c.很多参数可以根据CPU、内存、数据库连接方式、瞬间访问量等进行优化
4、硬盘空间CHECK,系统盘至少要有4G空间 Free!,空休时间一定要进行碎片整理!
*Asp.net 大量使用系统盘的空间作优化;特别要注意,数据库所在的分区的空间更要足够,增量方式应设为按1G增长(SQL2000升级特别要注意)。数据库更应定期收缩,优化表的索引和重新索引。

以上供参考
  回复  引用  查看    

#19楼 2006-07-04 18:05 产品[未注册用户]

以下是我的查询, 复杂了一点,这句查询直接将我的management studio挂死了
select PONO,LocationNo FinalContainerNo,TempContainerNo,
'' Filler1,'' GrossWeight,'' GrossVolume,
cast(sum(Amount) as decimal(17,2)) FOBAmount,
'' SealNo,'' DevanningCode,minDuedate DueDate,'' Filler2,'O' VanningPlant,'01' RecordCode
from
(

select tia.PONO,tia.LocationNo,container.TempContainerNo,tia.Amount,d.minDueDate
from T_Invoice_Attached tia
join VW_PO_Container container
on tia.PONO=container.PONO and tia.LocationNo=container.ContainerNO
left join (

Select tl.PONO,tl.TempContainerno,tm.Containerno,min(Duedates) minDueDate
from t_label tl
Join fn_getDueDateByPO(N'DT6FT25','') on tl.PartsCode=PartsNo and Tl.Ran=RanNo
join t_masterlabel tm on tl.pono=tm.pono and tl.master_labelno=tm.key_mlabelno
where tl.pono=N'DT6FT25' and tm.containerno is not null
Group by tl.PONO,tl.TempContainerno,tm.Containerno


) d on tia.PONO=d.PONO and tia.LocationNo=d.Containerno
where tia.PONO=N'DT6FT25'
and tia.InvoiceType='2'
and tia.LocationNo in
(
select distinct ContainerNo
from T_Invoice_Sales
where PONO=N'DT6FT25'
)
) container
group by PONO,LocationNo,TempContainerNo,minDuedate
  回复  引用    

#20楼[楼主] 2006-07-04 18:12 dudu      

@笑望人生
你从哪可以查到不同版本的Sql Server 2005的性能限制?
如果是并发连接的限制引起的,那出现问题时不应该出现数据库服务器CPU占用100%。
  回复  引用  查看    

#21楼 2006-07-04 18:17 dotexter[未注册用户]

好像dottext都有些性能问题.只有访问量一多.就马上出项瓶颈.文章打开空白,程序速度很慢.这些可能是dottext程序的bug.至今还不明白问题出在哪.   回复  引用    

#22楼 2006-07-04 18:29 dazhou

还是垃圾回收的问题。

我这几天也遇到同样的问题了,我使用了大量的CACHE来减少数据库操作,IISRESET后很好,但运行一段时间后,回收不及时,造成很大影响。
  回复  引用    

#23楼[楼主] 2006-07-04 18:54 dudu      

@萧远山
我准备先使用SQL2005中新的分页技术修改所有分页查询的存储过程。

@.progame
有些地方还是需要分页的。

@产品
“SQL 2005本身有Bug,某些记录查询会死机, 我正在下载sp1, 希望能解决”
博客园的数据库服务器已经安装了SQL 2005 SP1。
  回复  引用  查看    

#24楼[楼主] 2006-07-04 19:00 dudu      

@鞠强_方枪枪
谢谢你的建议!
你查一下是不是有某些查询执行时间过长。
  回复  引用  查看    

#25楼 2006-07-04 19:00 产品[未注册用户]

下载了,还是没有用
只能想办法改写查询了,想办法绕过了,
看来数据库还是要用Oracle也是有点道理的,Oracle处理复杂的查询还是比较牛的
  回复  引用    

#26楼 2006-07-04 21:48 笑望人生      

@dudu

不好意思,我不记得在哪里看到这个限制了。
不但是有这个限制,还有不支持多处理器,内存只能用1G,数据库大小限制为4
G等。
  回复  引用  查看    

#27楼[楼主] 2006-07-04 22:07 dudu      

@笑望人生
这是Express 版的限制。
  回复  引用  查看    

#28楼 2006-07-04 23:54 鞠强_方枪枪[未注册用户]

对于"产品"兄的sql,最直接的办法,就是
set statistics io on
set statistics time on
然后,ctrl+k,然后ctrl+e

看execution result,最大的I/O一定要注意,估计要超过5w的。
然后看execution plan,索引怎么走的?I/O最大的,索引为什么那么走?

这些确定后,基本上可以优化。然后,抓perfmon counters,然后抓dump,一步步来,别急,dudu老大!
  回复  引用    

#29楼 2006-07-04 23:57 鞠强_方枪枪[未注册用户]

1、left jon是否必须需要?
2、最后面的in字句,如有可能,更改为a.id=b.id and (...)这种方式。一般来讲,前者的worktable(在sql中太大)理论上可以变为没有的。一般经验,I/O可以降低到1000倍左右(3个数量级吧!)
  回复  引用    

#30楼 2006-07-05 02:05 Hussar      

2、有网友使用机器人程序往数据库疯狂的新建记录!
应该是这个问题吧
好像是一种博客搬家工具,上次CSDN就让他给搞翻了。
  回复  引用  查看    

#31楼 2006-07-05 09:10 大力      

1、找一个IIS监控软件,当CPU达到最大峰时打开这个监控,这样可以看出大概那个页面有问题,也可以看到什么人在访问什么页面。
2、检查IIS的W3SVC日志,如果某天日志大小异常,那么检查它。
  回复  引用  查看    

#32楼 2006-07-05 10:57 LOCKE      

不知道博客圆现在是不是静态页面机制~如果没有,做一个动态缓存机制,页面访问时候检查对应的路径有没有页面,有页面则直接输出,没有则生成静态页面!以后发生任何修改则激活事件重新生成一次!   回复  引用  查看    

#33楼 2006-07-05 11:05 里德王      

嗯,遇到过一模一样的问题。

解决办法的重新安装WINDOWS SERVER 2003

将内存由原来的2GB加到到4GB

之后服务器平安运行到现在已经半年多了,呵呵。

从任务管理器看,内存占用保持在3GB多点水平。我感觉就是之前内存太小不够用。不知道博客园的服务器内存是多少。
  回复  引用  查看    

#34楼[楼主] 2006-07-05 11:25 dudu      

@LOCKE
没有静态页面,用的是ASP.NET的页面缓存。

@里德王
WEB服务器与数据库服务器内存都是2G,数据库服务器的内存占用已经超过2G。
  回复  引用  查看    

#35楼 2006-07-05 12:53 sm160.com      

我觉得DUDU升级太快了,呵呵,技术人员都喜欢赶新鲜....

每一次升级都会引起一连串的问题...如果是商业网站,这可是大...

幸好这是技术类型的网站,不然这样整肯定很危险啊.

网站的稳定任何时候都是最重要的,因此建议DUDU在本地没有通过详细的测试和压力测试前,最好不要急急忙忙的升级...

现在发现留言好像有时也不正常了...
  回复  引用  查看    

#36楼[楼主] 2006-07-05 12:58 dudu      

@sm160.com
已经升级好几个月了。
留言有什么问题?我这里没发现过留言有问题,也没有其他人反映过留言问题。
  回复  引用  查看    

#37楼 2006-07-05 13:10 LOCKE      

个人觉得有必要建立一个缓存静态页面的机制,因为静态和动态的处理速度和对资源消耗差太远了!
或许现在简单的方法是用Squid做一个反向代理,现在基本上大站都这么做的,估计能省不少资源~
  回复  引用  查看    

#38楼 2006-07-05 17:08 jillzhang      

@LOCKE
好像Squid还不能安装在windows上吧,不清楚,只是搜索了下,如果能,望指教
  回复  引用  查看    

#39楼 2006-07-05 17:20 里德王      

@dudu
微软的网站上有这样一篇文章
https://www.microsoft.com/china/msdn/library/data/sqlserver/05TSQLEnhance.mspx?mfr=true">https://www.microsoft.com/china/msdn/library/data/sqlserver/05TSQLEnhance.mspx?mfr=true

里面谈到了SQL SERVER 2005的分页技术,其中有这样一段话:
----------传说中的分割线----------
用更一般的术语表达就是,给定 @pagenum 变量中的页号和 @pagesize 变量中的页大小,以下查询返回属于预期页的行:

DECLARE @pagenum AS INT, @pagesize AS INT
SET @pagenum = 2
SET @pagesize = 3
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY score DESC, speaker) AS rownum,
speaker, track, score
FROM SpeakerStats) AS D
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
ORDER BY score DESC, speaker

上述方法对于您只对行的一个特定页感兴趣的特定请求而言已经足够了。但是,当用户发出多个请求时,该方法就不能满足需要了,因为该查询的每个调用都需要您对表进行完整扫描,以便计算行号。当用户可能反复请求不同的页时,为了更有效地进行分页,请首先用所有基础表行(包括计算得到的行号)填充一个临时表,并且对包含这些行号的列进行索引:

SELECT ROW_NUMBER() OVER(ORDER BY score DESC, speaker) AS rownum, *
INTO #SpeakerStatsRN
FROM SpeakerStats
CREATE UNIQUE CLUSTERED INDEX idx_uc_rownum ON #SpeakerStatsRN(rownum)

然后,对于所请求的每个页,发出以下查询:

SELECT rownum, speaker, track, score
FROM #SpeakerStatsRN
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
ORDER BY score DESC, speaker

只有属于预期页的行才会被扫描。
----------传说中的分割线----------
而经过我实际测试,在有200W条记录的数据表上使用这个函数,性能相当不理想,需要好几秒才能完成查询。除非像文中说的那样,再造一个临时表。

dudu不妨再测试一下。

目前我认为最好的分页方法还是使用MAX()函数的那个存储过程。至少在SQL SERVER 2005下不用再拼SQL语句了,因为TOP已经支持参数了不是么。
  回复  引用  查看    

#40楼[楼主] 2006-07-05 17:45 dudu      

谢谢你的建议!
博客园本来采用的是通过中间表进行分页。
正打算改为SQL Server 2005的分页技术,现在看来要慎重。
目前在执行分页查询时需要好几秒,数据库中的记录有40W条左右。
  回复  引用  查看    

#41楼 2006-07-05 19:07 Lostinet      

我的分页缓存方案
收集条件,整理出hashcode
select id from table where .. order by ...
得出ids[]
用hashcode来缓存ids[]
把ids[]分页,得出分页了的pageids[]
查看缓存,看看那些id没有缓存,得出unloadids
select * from table where id in ..unloadids.join..
把新选择回来的记录逐一用id缓存掉。

QueryParameter p=..
int hashcode=CalcHashCode(p);
int[] ids=(int[])queryCache[hashcode];
if(ids==null)
{
ids=SelectIdentities(p);
queryCache[hashcode]=ids;
}
int[] pageids=GetPagedIds(ids,pageindex,pagesize);
Record[] rds=new Record[pageids.Length];
List<int> unloadids=new List<int>();
for(int i=0;i<pageids.Length;i++)
{
Record r=(Record)recordCache[pageids[i]];
if(r!=null)
{
rds[i]=r;
}
else
{
unloadids.Add(pageids[i]);
}
}
if(unloadids.Length!=0)
{
//可根据数量优化
Dictionary<int,Record> dict=SelectRecords(unloadids);
for(int i=0;i<pageids.Length;i++)
{
if(rds[i]==null)
{
Record r=dict[pageids[i]];
rds[i]=r;
recordCache[pageids[i]]=r;
}
}
}
return rds;


  回复  引用  查看    

#42楼 2006-07-06 03:59 wy_rover[未注册用户]

唉!我现在对微软平台(互联网应用)不报太大希望,性能,集群都是一大问题,相比来说lamp平台要好的多,博客园要商业化,不知道dudu,怎么应付大量的请求   回复  引用    

#43楼[楼主] 2006-07-06 10:32 dudu      

@Lostinet
谢谢!很好的方案!
以前没想过这种方式,总是存储过程上进行优化。
  回复  引用  查看    

#44楼[楼主] 2006-07-06 10:36 dudu      

从这两天的情况来看,搜索引擎爬网的可能性比较大,准备先写代码分析一下。   回复  引用  查看    

#45楼[楼主] 2006-07-06 11:27 dudu      

刚才又出现问题,IIS的同时连接数达到了3400多,谁在疯狂爬网?我要把他找出来。   回复  引用  查看    

#46楼 2006-07-06 11:29 LOCKE      

squid 好像有for windows版,windows上做反向代理有别的软件,具体忘了!呵呵~不过觉得像博客圆这种网站,必须要找到一定的静态缓存机制,网站中9成的资料很多时候都是不变得,如果全部用动态处理很浪费~   回复  引用  查看    

#47楼 2006-07-06 12:51 大海      

其实爬网不爬网,不是关键,由于爬网出现问题,其实也是网站的问题。
如果网站经不起爬网,那么网站也不够健壮,你说呢?
  回复  引用  查看    

#48楼[楼主] 2006-07-06 14:43 dudu      

@大海
这里涉及成本问题,如果这么多连接果真是用户访问流量带来的,当然值得去从软件和硬件上解决问题,但如果是某些恶意软件爬网引起的,同时发起成千上百的连接,而且这样的连接比同样连接数的用户带来更大的性能压力,对于这样的问题,直接拒绝爬网是一个更合理的选择。
  回复  引用  查看    

#49楼[楼主] 2006-07-06 14:51 dudu      

以前博客园遇到过这样的问题,http://dudu.cnblogs.com/archive/2005/10/27/262825.aspx">http://dudu.cnblogs.com/archive/2005/10/27/262825.aspx   回复  引用  查看    

#50楼 2006-07-06 15:47 TerryLee      

Dudu,看看这篇对你有没有帮助

http://ysearchblog.cn/2006/07/yahoo_slurp.html">http://ysearchblog.cn/2006/07/yahoo_slurp.html

如何控制Yahoo! Slurp蜘蛛的抓取频度(车东)
  回复  引用  查看    

#51楼[楼主] 2006-07-06 16:43 dudu      

@TerryLee
谢谢!已经根据这篇文章进行了设置。
  回复  引用  查看    

#52楼 2006-07-10 18:57 顾非[未注册用户]

博客园是不是还在用aspnetforum的底子做的, 或是自行开发的。 使用asp.net做大流量网站一定要大量使用cache, 这个比静态网页还要好。 CommunityServer是个很好的例子, 他们声称做了两年多的 R&D, 对performance, scalability 颇有心得, 不妨参考CS2.0的设计。

无论怎样, asp.net的做法是绝对不能象PHP/MySQL那样的主要以数据库query为主的, 那样的话也失去使用asp.net/mssql的意义了, 正好是扬短避长。
  回复  引用    

#53楼 2006-11-07 09:28 cnlamar@hotmail.com[未注册用户]

lostinet老哥,你MSN貌似换了...现在用的啥?

你这个方法,多年前在你论坛就见你实现过,我现在也比较频繁的如此使用,但是对于如何在分布环境中更理想更透明的去实现他,我一直有些疑虑,希望能再向你讨教讨教~~嘿嘿
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 442371





相关文章:

相关链接:

导航

公告

人生的真正价值在于从何种程度与何种意义上摆脱自我!
明天继续更新评论功能
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

与我联系

搜索

 

常用链接

留言簿

随笔分类

随笔档案

新闻分类

相册

HJ

朋友的博客

网站收藏

小组

友情链接

最新随笔

最新评论

阅读排行榜

评论排行榜

60天内阅读排行