>

32GB RAM이있는 서버에는 최대 메모리가 80 % 인 SQL Server 인스턴스가 실행 중입니다.

메모리 사용률이 낮 으면 모든 것이 잘 작동합니다. 아래 스크린 샷을 참조하십시오

그러나 시간이 지남에 따라 3-4 일이 걸리므로 SQL은 전체 RAM (전체의 80 %)을 사용합니다.

3-4 일 동안 서버는 변경되지 않지만 매일 더 많은 RAM을 사용합니다.

최대 한도에 도달하면 전체 성능이 버려지고 웹 사이트에서 쿼리 시간 초과가 발생합니다. 밀리 초 내에 실행 된 동일한 쿼리를 실행하는 데 몇 초가 걸립니다.

이 시점에서 우리는 선택의 여지가 없지만 전체 서버를 다시 시작하면 정상적으로 돌아옵니다. (서비스를 다시 시작하면 작동하지 않습니다)

이것은 일주일 정도 작동하며, 그 후에 다시 시작해야합니다

SQL 서버가 메모리를 해제하지 않는다는 것을 온라인에서 읽었습니다. 그러나 그들은 SQL이 작동하는 방식이지만 성능에는 영향을 미치지 않는다고 언급했습니다. 제 경우에는 성능이 저하됩니다.

메모리 누수가 있습니까? 아니면 저장된 프로세서가 많은 메모리를 소비하고 결코 해제하지 않습니까? 그렇다면 어떻게 디버깅합니까?

  • 답변 # 1

    기본 SQL 서버는 언 캡핑 된 경우 전체 메모리를 소비하고 캡핑 된 경우 사용 가능한 모든 메모리를 사용합니다. 이것은 정상입니다. 또한 SQLSERVER가 상자에서 유일한 응용 프로그램인지 (권장) 확인해야합니다. 모범 사례에 따라

    아래 방법을 사용하여 문제 해결을 시작합니다

    1. 최상위 메모리 소비 쿼리를 찾기 시작하고 쿼리의 메모리 사용량을 줄일 수 있는지 확인하십시오. 메모리 소비 쿼리는 아래 쿼리에서 찾을 수 있습니다.

    SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
    ((CASE qs.statement_end_offset
    WHEN -1 THEN DATALENGTH(qt.TEXT)
    ELSE qs.statement_end_offset
    END - qs.statement_start_offset)/2)+1),
    qs.execution_count,
    qs.total_logical_reads, qs.last_logical_reads,
    qs.total_logical_writes, qs.last_logical_writes,
    qs.total_worker_time,
    qs.last_worker_time,
    qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
    qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
    qs.last_execution_time,
    qp.query_plan
    FROM sys.dm_exec_query_stats qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
    ORDER BY qs.total_logical_reads DESC -- logical reads
    -- ORDER BY qs.total_logical_writes DESC -- logical writes
    -- ORDER BY qs.total_worker_time DESC -- CPU time
    
    

    이제 높은 메모리를 유발하는 쿼리를 찾았으므로 메모리 사용량을 줄일 수 있는지 확인하기 위해 미세 조정해야합니다.

    EX : 부적절한 인덱스로 인해 쿼리가 많은 읽기를 수행하거나 버퍼 풀이 여러 번 플러시되어 IO 장치에 문제가있을 수 있습니다

    2. 메모리를 사용하는 최상위 구성 요소를 찾을 수도 있습니다. 이렇게하면 RAM 사용 방법을 이해할 수 있습니다

    SELECT TOP(20) [type], [name], SUM(single_pages_kb) AS [SPA Mem, Kb] 
    FROM sys.dm_os_memory_clerks 
    GROUP BY [type], [name]  
    ORDER BY SUM(single_pages_kb) DESC;
    
    

    버퍼 풀이 더 많은 메모리를 일관되게 사용한다면 걱정하지 않아도됩니다. 그러나 그것이 cachestore_obcp 인 경우에는 캐시 저장소를 채우는 임시 쿼리가 많을 수 있습니다

    조사의 한 부분이 다른 부분으로 이어 지므로 클릭 솔루션이 없으므로 리드를 기준으로 문제를 해결해야합니다

    측면 참고 : 권장하지 않음 :
    우리의 dev 인스턴스 중 하나가 동일한 문제에 직면 했으므로 모든 튜닝 작업을 수행하는 대신 아래 명령을 실행하여 메모리를 즉시 효과적으로 해제합니다. 그러나 이것은 계획을 플러시하므로 프로덕션 인스턴스에는 전혀 권장되지 않습니다. 캐시에 저장되고 약간의 CPU 압력에 직면 할 수 있습니다

    DBCC FREEPROCCACHE WITH NO_INFOMSGS;
    
    

    참조 :

    sql-server-memory 관련 쿼리

    sql-server-find-most-expensive-queries-using-dmv

  • 답변 # 2

    가장 비싼 쿼리를 찾아야하고 쿼리 코드를 검토해야합니다. 여러 번 쿼리 코드가 효과적으로 최적화되지 않았습니다. 수행해야 할 성능 조정.

  • 이전 php - 웹 후크를 통해 Woocommerce에서 Laravel으로 데이터 보내기
  • 다음 inno setup - tinputquerywizardpage의 콤보 상자