none
sql_进程池的用户数 RRS feed

  • 问题

  • 目前我从跟踪监视器发现一个问题,服务器的进程数量很多,而且都是处于睡眠状态,大约有600多个睡眠进程,请问大家能告诉我解决这种办法是什么,我不会总是巡检,手动去执行杀掉睡眠进程不,用Agent也好像不够科学把,请问有什么方法 可以设置它的睡眠超时值,这样可以系统自动进行释放进程


    星光总能为我指引方向
    2011年5月6日 3:15

答案

  • 你好,

    手动结束休眠的进程要小心谨慎,因为有些是系统进程。一般情况,当休眠的进程阻止了其他重要的进程,或者有些进程执行的查询是用到一必需的系统资源,我们才会去结束他们。详细信息请参阅:http://msdn.microsoft.com/zh-cn/library/Aa933230

    当你结束一个休眠的进程,你需要确认它是否空闲,或者发生阻塞、死锁。比如,你可以通过下面的查询语句查询并且结束那些已经休眠并且空闲了1个小时以上的进程:

    DECLARE @v_spid INT
     DECLARE c_Users CURSOR
      FAST_FORWARD FOR
      SELECT SPID
      FROM master..sysprocesses (NOLOCK)
      WHERE spid>50 
      AND status='sleeping' 
      AND DATEDIFF(mi,last_batch,GETDATE())>=60
      AND spid<>@@spid
     
    OPEN c_Users
     FETCH NEXT FROM c_Users INTO @v_spid
     WHILE (@@FETCH_STATUS=0)
     BEGIN
      PRINT 'KILLing '+CONVERT(VARCHAR,@v_spid)+'...'
      EXEC('KILL '+@v_spid)
      FETCH NEXT FROM c_Users INTO @v_spid
     END
     
    CLOSE c_Users
    DEALLOCATE c_Users
    
    

     


    Best Regards,
    Stephanie Lv

    2011年5月6日 5:53
  • 没有理解意思能详细一点吗:

     


    星光总能为我指引方向
    As dba, we never kill user session without user request because you don't know what it does in frontend. Connection pooling has
    capacity to close idle connections in the pool, better to configure that way than kill from server side.
    2011年5月6日 13:59
  • 600多个睡眠进程太多了。。。只要稍微再多一点,x86的系统可能无法handle新的连接, 同一rmiao的观点, 这个时候,应该打开SQL profiler, 从client端解决问题。
    2011年5月10日 16:20

全部回复

  • Better to handle this on client side.
    2011年5月6日 4:05
  • 没有理解意思能详细一点吗:

     


    星光总能为我指引方向
    2011年5月6日 5:47
  • 你好,

    手动结束休眠的进程要小心谨慎,因为有些是系统进程。一般情况,当休眠的进程阻止了其他重要的进程,或者有些进程执行的查询是用到一必需的系统资源,我们才会去结束他们。详细信息请参阅:http://msdn.microsoft.com/zh-cn/library/Aa933230

    当你结束一个休眠的进程,你需要确认它是否空闲,或者发生阻塞、死锁。比如,你可以通过下面的查询语句查询并且结束那些已经休眠并且空闲了1个小时以上的进程:

    DECLARE @v_spid INT
     DECLARE c_Users CURSOR
      FAST_FORWARD FOR
      SELECT SPID
      FROM master..sysprocesses (NOLOCK)
      WHERE spid>50 
      AND status='sleeping' 
      AND DATEDIFF(mi,last_batch,GETDATE())>=60
      AND spid<>@@spid
     
    OPEN c_Users
     FETCH NEXT FROM c_Users INTO @v_spid
     WHILE (@@FETCH_STATUS=0)
     BEGIN
      PRINT 'KILLing '+CONVERT(VARCHAR,@v_spid)+'...'
      EXEC('KILL '+@v_spid)
      FETCH NEXT FROM c_Users INTO @v_spid
     END
     
    CLOSE c_Users
    DEALLOCATE c_Users
    
    

     


    Best Regards,
    Stephanie Lv

    2011年5月6日 5:53
  • 辛苦了,你讲解的让我茅塞顿开,惭愧。谢谢了前辈


    星光总能为我指引方向
    2011年5月6日 6:53
  • 没有理解意思能详细一点吗:

     


    星光总能为我指引方向
    As dba, we never kill user session without user request because you don't know what it does in frontend. Connection pooling has
    capacity to close idle connections in the pool, better to configure that way than kill from server side.
    2011年5月6日 13:59
  • 600多个睡眠进程太多了。。。只要稍微再多一点,x86的系统可能无法handle新的连接, 同一rmiao的观点, 这个时候,应该打开SQL profiler, 从client端解决问题。
    2011年5月10日 16:20