进程数太多可能是连接没有及时释放造成的。 你可以使用sp_who active查看当前活动的进程数是多少。象你说这种服务器,按理说连接数(就是你说的进程数)应该在40以下,活动进程一般不会超过5个(系统进程不算)。如果cpu超过常年100%,肯定是存在不少效率低下的SQL语句(估计是没能利用索引)。建议你使用事件探查器监视那些cpu超过500的SQL语句,看看能否优化。

解决方案 »

  1.   

    的确活动连接很少连接总数130左右,活动连接却20都不到只是不知道怎么让sql server自动释放连接?怎么设置呢?盼复,万分感谢!
      

  2.   

    连接释放只能通过修改程序进行。 如果是asp的程序,应该是可以直接修改源代码的。连接的释放,一般都是把ado的connection对象的连接关闭(好象是close方法),再设置为nothing就可以了。如果你不能修改源代码,那就没什么办法了。不过,你服务器的cpu经常100%的问题,与连接应该没有太大关系。请参考我上次的回复。
      

  3.   

    1. 如果条件许可, 首先把iis和sql server分到两台服务器中, 这样可以避免两者互相影响, 也有利于查找直接的原因.(例如, 由于IIS工作缓慢, 可能会导致不断的向sql发请求, 这样看起来似乎就是sql server的问题)2. 如果要查询是否连接没有释放引起的, 你可以用查询分析器连接到你的数据库服务器, 执行下面的代码:
    select * from master.dbo.sysprocesses
    where spid>50
    and waittype = 0x0000
    and waittime = 0
    and status = 'sleeping'
    and last_batch < dateadd(minute, -10, getdate())
    and login_time < dateadd(minute, -10, getdate())如果这样的进程很多, 则说明连接确实有很多连接没有释放(上面的查询查询出已经超过10分钟都没有做任何动作的连接)
    3. 如果确实是连接没有释放的问题, 你可以硬行释放连接, 不一定要改程序. 在sql server中, 创建一个job, 每10分钟一次, 执行下面的代码来定时检查并释放掉空连接就可以了:
    declare hcforeach cursor global
    for
    select 'kill ' + rtrim(spid) from master.dbo.sysprocesses
    where spid>50
    and waittype = 0x0000
    and waittime = 0
    and status = 'sleeping'
    and last_batch < dateadd(minute, -60, getdate())
    and login_time < dateadd(minute, -60, getdate())
    exec sp_msforeach_worker '?'