ASYNC_NETWORK_IO 대기 유형으로 인해 발생하는 느린 쿼리 문제 해결
증상
SQL Server에서 결과 집합을 생성하고 결과를 출력 버퍼에 넣어 클라이언트 애플리케이션에 보내면 클라이언트 애플리케이션은 출력 버퍼에서 결과를 가져옵니다. 클라이언트 애플리케이션이 중지되거나 결과를 충분히 빠르게 가져오지 않는 경우 SQL Server는 클라이언트 애플리케이션이 더 많은 결과를 보내기 전에 모든 결과를 받았다는 승인을 기다려야 합니다. 이 대기는 다음과 같이 ASYNC_NETWORK_IO
표시됩니다. 자세한 내용은 SQL Server에서 ASYNC_NETWORK_IO 대기 이해의 비디오를 참조하세요.
과도한 ASYNC_NETWORK_IO 대기로 인해 두 가지 문제가 발생할 수 있습니다.
총 기간이 길어질 수 있으므로 쿼리 속도가 느려질 수 있습니다.
SQL Server는 클라이언트가 결과를 가져올 때까지 대기하는 경우 획득한 잠금을 해제할 수 없습니다. 잠금이 오랫동안 해제되지 않으면 SQL Server에서 다른 세션이 차단됩니다.
원인 및 해결 방법
다음 섹션에서는 이 대기 유형에 대한 일반적인 원인과 문제를 해결하기 위한 해당 단계를 나열합니다.
큰 결과 집합
일부 애플리케이션 클라이언트는 수천 또는 수백만 개의 행을 요청한 다음 필터, 정렬 및 집계를 적용하여 결과를 처리합니다. 결과 집합이 크면 불필요한 네트워크 사용률 및 클라이언트 애플리케이션 처리가 발생할 수 있습니다.
해결 방법: 애플리케이션 개발자는 SQL Server와 클라이언트 간의 처리 균형을 신중하게 조정해야 합니다. SQL Server에서 필터링 또는 집계를 수행할 수 있으며 최종 결과 집합은 작을 수 있습니다. 클라이언트에 도착하는 결과 집합을 제한합니다. 데이터가 수신되면 데이터, 프레젠테이션 및 서식에 대한 더 많은 계산이 클라이언트 쪽에서 더 적합합니다.
애플리케이션이 결과를 충분히 빠르게 가져오지 않음
클라이언트 애플리케이션이 결과를 충분히 빠르게 가져오지 않고 결과 집합이 수신 ASYNC_NETWORK_IO
되었음을 SQL Server에 알리지 않으면 서버에서 대기가 발생합니다.
ADO.NET 사용하는 방법을 설명하기 위해 기본적으로 DataSet 및 DataTable 은 클라이언트가 액세스하기 전에 모든 행을 완료로 가져옵니다. 그러나 SqlDataReader와 같은 클래스를 사용하면 애플리케이션 개발자가 각 행을 서버에서 가져온 후 수행할 작업을 선택할 수 있습니다. 애플리케이션은 한 번에 한 행을 페치한 다음 비즈니스 요구 사항에 따라 이 행을 처리할 수 있습니다. 예시:
파일에 행을 씁니다.
네트워크를 통해 다른 애플리케이션으로 행을 보냅니다.
잠시 기다리거나 사용자 입력을 기다립니다.
해결 방법: 이 문제를 해결하려면 타이트한 WHILE/FOR 루프를 사용하여 클라이언트가 할 수 있는 한 빨리 모든 결과를 가져옵니다. 즉, 메모리에 결과를 저장한 다음 더 많은 처리를 수행합니다.
클라이언트 애플리케이션 머신이 스트레스를 받고 있습니다(I/O, 메모리 또는 CPU)
가능한 한 빨리 결과를 가져오기 위해 애플리케이션 코드를 개발하더라도 시스템 리소스 문제로 인해 전체 클라이언트 프로세스가 느려질 수 있습니다. 예시:
클라이언트 애플리케이션을 실행하는 컴퓨터에 리소스 제약 조건이 있는 경우 애플리케이션이 신속하게 결과를 가져오지 못할 수 있습니다. 예시:
100% CPU 사용률
메모리 부족(모든 메모리 사용)
느린 I/O(애플리케이션에서 결과 또는 로그를 작성할 수 있습니다).
이러한 리소스 제약 조건으로 인해 들어오는 결과의 처리 속도가 느려지고 SQL Server에서 대기 유형이 발생할 수 있습니다 ASYNC_NETWORK_IO
.
해결 방법: 이 문제를 해결하려면 성능 모니터 같은 도구를 사용하여 애플리케이션을 실행하는 시스템을 진단한 다음 리소스 제약 조건을 제거합니다. 다음 방법 중 하나가 작동할 수 있습니다.
다른 애플리케이션의 실행을 중지합니다.
해당 애플리케이션의 코드 문제를 해결합니다.
애플리케이션이 완전히 튜닝된 경우 시스템의 하드웨어를 업그레이드합니다.
NIC/네트워크
네트워크 또는 NIC(네트워크 인터페이스 카드)가 느리면 네트워크 트래픽이 지연될 수 있으며 결과 가져오기 및 SQL Server와의 통신이 자연스럽게 지연됩니다. 네트워크 지연은 일반적으로 다음 문제로 인해 발생합니다.
네트워크 어댑터 드라이버 문제
네트워크 필터 드라이버 문제
잘못 구성되었거나 잘못된 방화벽
라우터 문제
트래픽으로 인해 과부하된 네트워크(덜 일반적)
해결 방법: 이러한 문제를 진단하려면 네트워크 추적을 수집하고 패킷 재설정 및 재전송을 찾을 수 있습니다. 그런 다음 네트워크 관련 문제를 해결하여 패킷 재설정/재전송을 제거할 수 있습니다.