>

저희 사이트는 하루의 90 % 동안 정상적으로 작동하며 트래픽이 평소보다 두 배나 많은 피크 시간대에는 모든 것이 크롤링 속도로 느려집니다. 일반적으로 1 초인 페이지로드 시간은 30 초입니다. 오류 로그를 확인하면 연결 풀 문제 일 수 있습니다. 우리는 3 개의 웹 서버를 1 개의 SQL 서버 DB에 연결했습니다. SQL Server는 모든 코어에서 25 % 사용률 미만으로 비행하고 있습니다.

SQL 서버의 User Connections 카운터를 살펴본 결과 피크 기간에는 400 개 이상의 사용자 연결이 있지만 근무 외 시간은 약 120+입니다.

MS가 앱 풀을 다루기 위해 기본 설정을 사용하고 있다고 확신합니다. 앱 풀 문제가 있는지 테스트하기 위해 무엇을 할 수 있습니까? 앱 풀 크기를 1000으로 늘리면 어떤 단점이 있습니까? 어떻게해야합니까?

감사합니다!

  • 답변 # 1

    경험상 SQL Server에서받을 수있는 3 가지 기본 유형의 시간 초과가 있습니다 :

    1) InvalidOperationException  -명령 문자열에 지정된 시간이 초과되기 전에 클라이언트가 자체 풀에서 풀링 된 연결을 가져 오는 데 실패했습니다 (기본값 15 초). 클라이언트 풀의 최대 크기가 초과되었으며 모든 풀링 된 연결이 사용 중이며 시간이 초과되기 전에 계속 사용 중입니다.

    2) SQLException  - 접속 시간 초과. 클라이언트의 연결 풀이 데이터베이스에 대한 새 연결을 작성하지만 명령 문자열에 지정된 시간 종료 전에 데이터베이스가 응답하지 않습니다 (기본값 15 초).

    3) SQLException  -명령 시간 초과. 연결되었지만 SQL 문이 명령을 실행하는 데 걸린 시간이 명령의 CommandTimeout 특성에 지정된 제한 시간을 초과했습니다 (기본값 30 초).


    로드가 추가 될 때까지 서버가 정상적으로 작동하는 상황은 사례 1과 같습니다. 시간 초과가 2 초 정도 걸리는 것으로 나타났습니다.

    이에 대한 해결책은 SQL Server의 최대 스레드를 늘리는 것입니다. 기본값은 0입니다. SQL Server에서 결정합니다. 스레드가 너무 적게 할당되어 자체적으로 제한되는 동안 stout 서버가 리소스 사용이 적은 경우를 보았습니다.

    이 transact-sql을 사용하여 최대 스레드 설정을 늘릴 수 있습니다.

    sp_configure 'max worker threads', 8192
    go
    Reconfigure
    
    

    그런 다음 SQL 서비스를 다시 시작하십시오.

    BTW, 당신은이 명령으로 SQL Server가 현재 얼마나 많은 스레드를 할당했는지 알 수 있습니다 :

    select sum(current_workers_count) from sys.dm_os_schedulers
    
    
    이 스레딩 설정은 많은 연결에서 SQL Server가 수행되는 방식에 큰 차이를 만듭니다. SQL Server의 스레드가 부족하면 SQL Server가 응답하지 않게됩니다.

  • 답변 # 2

    SQL 연결이 올바르게 처리되지 않고 풀로 돌아 오는 것과 관련이있을 수 있습니다. 당신이 SqlConnection.Dispose 를 호출하는지 확인 .

  • 답변 # 3

    SQL 연결 풀이 소진 되었기 때문일 수 있습니다 (앱 풀과 다릅니다). 연결 문자열을 통해 풀 크기를 늘려서 확인할 수 있습니다.

    Integrated Security=SSPI;Initial Catalog=northwind;Max Pool Size=100;
    
    

    그러나 데이터베이스는 들어오는 쿼리 스트림을 따라갈 수 없습니다. 이로 인해 연결이 쿼리가 끝날 때까지 대기합니다. 더 많은 연결을 추가하면 버스트 요청에는 도움이되지만 트래픽이 많이 발생하지는 않습니다.

    지속적인 고부하에서 SQL Server의 성능을 향상시키기위한 몇 가지 제안이 있습니다 :

    문제가 발생한 하드웨어 (특히 SQL Server의 RAM)를 던지십시오.

    SQL Server 프로파일 러를 서버에 연결하고 한 번의 높은로드 기간을 얻은 후 제안 된 색인을 따르십시오

    추적 로그에서 장기 실행 쿼리를 검사하고 T-SQL 개발자와 함께 개선하십시오

    행운, 이것들은 꽤 복잡 할 수 있습니다!

  • 답변 # 4

    이 오류가 발생했을 때 :

    와이즈 비즈

    The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached

    를 사용하고 있었기 때문입니다.   SqlCommand.ExecuteQuery() 대신 메소드 .

    예 : 원래 저장된 절차 전화는 다음과 같습니다.

    SqlCommand.ExecuteNonQuery()
    
    

    위의 코드는 예외를 던진 것입니다. 그러나 ExecuteNonQuery ()를 사용하도록 호출을 변경하면 문제가 해결되었습니다.

    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "InsertSproc";
        cmd.Parameters.AddWithValue("@Value", myValue);
        cmd.Parameters.AddWithValue("@LoggedDate", myDate);
        DatabaseManager.instance.ExecuteQuery(cmd);
    }
    
    

  • 답변 # 5

    Powershell 및 백투백 쿼리 (invoke-sqlcmd와 다른invoke-sqlcmd)에서이 문제가 발생했습니다. 두 쿼리 모두 데이터 수정과 관련이 있습니다. 매개 변수 호출에-connectiontimeout 1을 추가하여 해결되었습니다.

    예 :

    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "InsertSproc";
        cmd.Parameters.AddWithValue("@Value", myValue);
        cmd.Parameters.AddWithValue("@LoggedDate", myDate);
        DatabaseManager.instance.ExecuteNonQuery(cmd);
    }
    
    

    시간 초과 길이는 영향을받는 행 수에 따라 달라질 수 있습니다.

    invoke-sqlcmd "insert into testdb..tab1 (cname) select 'x'" -connectiontimeout 1 invoke-sqlcmd "update testdb..tab1 set ctr=ctr+1 where cname='aaa'"

  • 이전 c# - 프록시 서버 뒤에서 웹 서비스 참조 추가
  • 다음 Jackson을 사용하여 Java 객체를 JSON 문자열로 변환 할 때 중복 Json 속성