小弟自己一个人做的一个话费充值asp.net网站,数据库是sqlserver2008r2,已经运行了一年多了,订单也是越来越多,从一天几百,到现在一天一万多笔订单,页面访问用户不多,主要都是通过接口提交订单,前段时间不知道为什么,现在运行一段时间(1-2天)后,系统就变的很慢,像蜗牛一样,然后我就先重启了网站,但是没什么用,然后再重启数据库,速度恢复了。请问下高手,这是什么原因啊,或者能告诉怎么去找问题的思路吗?问题非常急,在线等答案,小弟在这里先谢了。
Hello:
补充一下问题,我的数据库和web站点在同一台服务器上,服务器上总共有4个站点,两个后台站点,两个前台站点,前台站点功能其实都差不多,但是一个前台站点订单比较少,每天保持在500哥订单左右,少的站点的订单都是通过页面提交订单。而另一个站点,大多数订单都是通过接口提交订单,一天一万二三千个订单。我服务器的配置是Inter(R) Xeon(TM) CPU 3.20GHz 3.19GHz,3.00GB的内存,140GB(C:30GB,D:106GB)硬盘,还剩可用硬盘空间95GB(C:20GB,D:75GB)。站点文件和数据文件都在D盘。麻烦大侠们在回答时,说的详细点,我服务器知识不是太好,在此先谢了。对了,上次系统变慢的时候,我看了,Avg.Disk Queue Length计数器一直处于100.
一般情况是数据库问题,常用的字段是否有索引,表连接是否比较多
可以使用sql server自带的profler看看系统在干啥
对于常用的内容可以使用缓存memcached,减少数据库使用
而且windows系统的perfmon.exe也可以检测性能
我数据量大(也就100多万条记录 )的表,都在插入时间上建了索引,因为我的查询,都有一个时间范围条件。但是这会有影响吗,慢之前,查询的速度也很快啊!还有我经常用,但是不怎么变的东西,我都放到Session或Application中了。数据库性能监测,我这块没搞过,不太会,那我先去看看你给的地址。
2008我没具体看过,我使用2000的时候发现过这个问题。最有效的办法是扩内存。随着运行时间变长sql server占用的内存会越来越大。
网速很慢的时候,我上服务器看了,我3g的内存,还有将近1G的内存没有呢,CPU才用百分之几。
楼主你不会把一年的数据都存放在一个表中了吧?
看下你的数据库的表是不是很大了?
不是啊,最大的一张表,也就才100多万条数据啊!
@狼队: 如果楼主的程序对表的操作都是插入的话,我想建不建立索引,没有任何的影响。
要建立索引,不然肯定慢,我上次碰到过也是这情况,还有翻页的时候最好是使用存储过程翻页,这样就不会每次都取这么多数据出来,只取一页的出来显示速度快多了
是建立了索引啊,慢之前是挺快的。我翻页用的就是用的存储过程。
应该跟数据量没什么关系,可能是有很多连接没有正常释放、死锁之类的
建议你在代码里加入一些调试(例如输出一些方法的执行时间),先确定是哪个方法耗时比较长,然后再进一步找问题。
点击后台每个菜单,都耗时快一分钟,有的菜单都没有查询,也很慢,觉得莫名其妙。
@狼队: 没有数据库查询也很慢的话,可能是IIS的队列满了(请求量过大),你开始->运行->perfmon看一下队列情况。
@水牛刀刀: 那我慢的时候再看看,但是如果是IIS的队列满了,我重启IIS为什么没有什么作用,但是重启数据库,速度就恢复了啊!
@狼队: IIS队列满了,你重启的话并不会把队列清空,依然会把所有请求处理完。因此你重启iis作用不大。综合你说的状况,我认为是数据库查询比较慢,同时你的网站没有使用异步handler,导致数据库查询操作一直占用着iis的连接池。如果iis队列比较慢,那90%是这个原因。我打赌你的网站里就是直接查询数据库,没有任何异步操作。
索引要建好, 索引 重新生成一下,可能碎片太多,建个作业,每天重新生成。
磁盘空间是否足,不足收缩数据库日志,清理垃圾。
磁盘还有几十个G呢,呵呵!
首先你把服务器换掉,排除下服务器的原因。
然后再去考虑数据库的问题。
服务器不太好换啊,租的,一年6000多呢。
你重启服务器,速度就恢复了,可能是访问的人多了,建立数据库连接次数就多了,而又没有及时的释放连接,
建议你用链接池管理数据库连接,个人观点,不对勿喷!
可能是你臨時數據庫滿了。你觀察一下臨時數據庫的增長。
楼主考虑连接池 以及 检查连接是否及时关闭 清除熟读资源
插入频繁的表,加索引是有代价的,因为每次插入都要更新索引,特别是聚集索引,要做物理级平衡树搬动,那个很慢的。实在不行你得考虑对数据分区,不要都放在一张表上,比如客户A-E放在table A,客户G-K放在table B,但这两张表的结构是完全一样的,当然,这样会带来一些问题,比如查询,可以建立view,利用view的缓存来解决,读总比写快多了。还有一种办法就是做读写分离,基于replication,这种方案网上介绍的蛮多的,你自己搜一下吧。
应该跟这没关系吧,一般运行一两天之后才会很慢!
先优化数据库,不知道你的数据库现在多大了,然后再收缩数据日志,或者清除数据库日志。
怎么优化,麻烦兄弟说清楚点,我data数据库1.5G,日志才400多M。
@狼队: 那你的数据库也不需要优化啊!对了,还有你现在有条件把web服务器和数据库分开吗?分开之后,其实问题就很明显地看出来了。呵呵!