30

현재 ASP.net 2.0 응용 프로그램에서 일부 GUI 테스트를 수행하고 있습니다. RDBMS는 SQL Server 2005입니다. 호스트는 Windows Server 2003/IIS 6.0입니다.ASP.net 응용 프로그램에서 SqlServer 연결 누수를 감지하는 방법?

코드를 공개하지 않는 외부 회사에서 프로그래밍했기 때문에 응용 프로그램의 소스 코드가 없습니다.

IIS를 다시 시작할 때 응용 프로그램이 잘 작동되지만 몇 시간 동안 브라우저를 열고 닫은 후 응용 프로그램이 느려지고 느려지는 것으로 나타났습니다. 이 동작이 프로그래머의 잘못된 연결 연결 관행으로 인한 것인지 궁금합니다. 여기에 데이터베이스의 연결 누출이 의심됩니다.

.Net 가비지 컬렉터가 결국 닫을 것이라고 추측하지만 ... 시간이 좀 걸릴 수 있습니까?

SQL Server Management Studio가 있는데 작업 모니터에서 데이터베이스에 열려있는 연결 수가 많다는 것을 알았습니다. 위에서 말했다되고있어 모든 것을에서

, 여기에 주요 문제에 관한 몇 가지 질문은 다음과 같습니다

  1. 는 SQL에 알 수있는 방법이 연결이있는 경우 Server 2005의 가 기다리고 있기 때문에 개방 연결 풀에서 을 사용하거나 응용 프로그램에서 사용하기 때문에 이 열려있는 경우?

  2. 가 somone에 내가 문제의이 종류를 추적하기 위해 성능 카운터 또는 도구 의 다른 종류를 사용하는 방법을 배울 수있는 좋은 온라인/종이 자원을 알고 있나요?

  3. 성능 카운터가 가장 좋은 솔루션 인 경우, 에서 볼 변수는 무엇입니까?

+0

은 연결 풀링을 사용할 수 있습니까? –

+0

은 기본적으로 사용하도록 설정되어 있지 않습니까? –

+0

예. 비슷한 문제에 직면했을 때 응용 프로그램에서 false로 설정되어있는 것으로 나타났습니다. –

답변

2

web.config에서 연결 문자열을 확인할 수 있습니다 (주로 연결 풀링이 활성화되어 있고 연결 제한이 활성화 된 경우).

또한 IIS 6을 사용하는 경우 별도의 응용 프로그램 풀을 사용하도록 웹 응용 프로그램을 설정하고 메모리 및 프로세스의 재활용 옵션을 설정할 수 있습니다.성능 카운터에 대한

, 당신은 가비지 컬렉터가 실행되는 시간을 확인할 수 있습니다, 당신은 SQL 서버에 액세스 할 수있는 경우

, 당신이 만든 연결을 모니터 할 수있는 방법을 많은 등 응용 프로그램을 사용하여 메모리, (SQL Server의 모든 설치된 인스턴스에 대해 정의 된 성능 카운터가 있습니다).

MSDN Magazine에 몇 가지 기사가있었습니다. 또한 SOS 디버깅 라이브러리를 사용하여 응용 프로그램의 프로세스에 연결하고 수동으로 검사 할 수 있습니다.

그리고 당신은 소스 코드가없는 경우,

@Later 편집 (그들은 디버깅을 위해 매우 유용한 것) 응용 프로그램의 소스를 얻을 수 Reflector를 사용하려고 : 당신은 여기 question을 확인할 수 있습니다

1

연결을보고 활동 시간을보고 연결을 유지하고있는 항목을 찾을 수 있는지 확인해보십시오.

IIS를 다시 시작해야하는 솔루션이라면 응용 프로그램의 메모리 사용량을보고 메모리 누수가 있는지 또는 그 실제 크기가 커지는지를 확인할 수 있습니다.

열린 연결이 문제인 경우 활동 모니터에서 활동이없는 매우 많은 수의 연결이 표시됩니다.

성능 카운터의 경우 "SQL Server : 일반 통계"성능 개체를 살펴볼 수 있습니다.

2

MSDN 참조 (ADO.NET performance counters)는 응용 프로그램을 프로파일 링 할 때 찾을 수있는 항목에 대해 매우 분명합니다. Windows에 내장 된 perfmon 응용 프로그램을 사용하여 카운터를 모니터링 할 수 있습니다.

그 외에도 ADO.NET 연결 풀링에 대해 학습하는 것이 좋습니다. 코드에서 실제로 버그가 의심되는 경우 Red Gate's Reflector (지금은 무료)을 사용하여 MSIL을 C#으로 디스 어셈블합니다.

6

이 문제가 발생하여 SQL Server Profiler가 훌륭한 도구라는 것을 알았습니다. 짧은 테스트 실행에서 사이트를 모니터링하고 연결 풀에서 재사용되지 않는 많은 연결 (sp_who)이 발견되어 방금 열었습니다 SQL Server Profiler를 실행 한 다음 코드에서 작성된 SP에 대한 모든 호출 뒤에 "sp_reset_connection"호출이 있는지 확인하십시오. 새 배치가 시작되기 전에 호출이 없으면 첫 번째 연결이 부족합니다.

+2

프로파일 러에서 누락 된 "sp_reset_connection"을주의 깊게 관찰하는 것이 감사합니다. – Constantin

1

Todd Denlinger는 Sql Server 연결을 감시하고 일정 기간 내에 올바르게 처리되지 않은 것을보고하는 환상적인 클래스 http://www.codeproject.com/KB/database/connectionmonitor.aspx을 작성했습니다. 그것을 귀하의 사이트에 연결하면 누출이 있었는지 알려줍니다.

53

이 문제는 유사한 문제를 일으켰습니다. 이것은 당신이에 마지막으로 실행 된 SQL과 함께 특정 데이터베이스 및 로그인, 에 열려있는 모든 연결입니다 제공 무엇

SELECT S.spid, login_time, last_batch, status, hostname, program_name, cmd, 
(
     select text from sys.dm_exec_sql_text(S.sql_handle) 
) as last_sql 
FROM sys.sysprocesses S 
where dbid > 0 
and DB_NAME(dbid) = '<my_database_name>' 
and loginame = '<my_application_login>' 
order by last_batch asc 

: 나는 SQL Server의 새는 연결을 디버깅 할 수있는 좋은 방법으로 다음과 같은 SQL 함께했다 연결은 해당 sql이 실행 된 시간순으로 정렬됩니다.

연결 풀링 때문에 연결 풀링이 제대로 닫혀 있어도 연결 풀링이 주변에서 계속되므로 연결 누수가 있음을 알려주는 연결이 많다는 사실에 의존 할 수 없습니다 코드에서. 그러나 연결 누설이있는 경우 일부 연결은 "고정"되어 위의 쿼리에 나타나며 "last_batch"타임 스탬프는 절대로 변경되지 않습니다. 다른 연결도 중단되지만 새로운 SQL이 실행될 때마다 "last_batch"타임 스탬프가 업데이트됩니다. 따라서 고정 된 연결이이 쿼리의 맨 위로 이동하게됩니다.

문제의 응용 프로그램 소스 코드를 가지고 있다면 이것이 분리 된 연결에서 실행 된 마지막 SQL을 제공한다는 사실은 디버깅에 매우 중요합니다.

+1

이 쿼리는 매우 유용했습니다. 몇 분 안에 심각한 연결 유출을 정확히 찾아 낼 수있었습니다. 고맙습니다! –

관련 문제