query governor cost limit과 sp_MStran_ddlrepl

공장이야기 2009/06/25 16:32 posted by 최적화기

쿼리의 예상 비용이 특정값 이상인 경우에 쿼리가 수행되지 못하도록 할 수 있을까? 라는 목적으로 만들어진 것이 바로 query governor cost limit 구성옵션이다. UI에서는 "커리 관리자를 사용하여 장기 실행 쿼리방지"라는 이름으로 설정할 수 있으며, 기본값은 0 (제한없음) 이다. 이전 버전에도 있던 구성옵션이므로 새로울 것은 없지만 이 값을 설정 후에 문제가 되는 경우가 있어서 이글을 통해 소개하고자 한다.

문제

SQL Server 2005의 복제 article을 대상으로 ddl문을 수행하면 8649 오류가 발생하며 실패함.

메시지 8649, 수준 17, 상태 1, 프로시저 sp_MStran_ddlrepl, 줄 40
이 쿼리의 예상 비용(1275)이 구성 임계값 150을(를) 초과하여 쿼리가 취소되었습니다. 시스템 관리자에게 문의하십시오.

오류 메시지를 통해, sp_MStran_ddlrepl내의 특정 statement 수준에서 예상비용 1275가 나왔고 query governor cost limit은 150으로 설정되어 있었기 때문에 문제가 발생한 것을 알 수 있다.

해결

ddl문은 관리자에 의해서 발생하게 되므로, 다음과 같이 수행 session 단위로 query_governor_cost_limit를 설정하게되면 문제없이 쿼리가 수행됨

실행 예) “쿼리 관리자를 사용하여 장기 실행 쿼리 방지” = 150인 상태에서 다음과 같이 ddl문 수행.

set query_governor_cost_limit 1300
go
reconfigure with override
go
--ddl문
alter table t1 add c7 nvarchar(100)
go
set query_governor_cost_limit 0;
go
reconfigure with override
go

추가 정보

복제 article에 ddl문이 수행되면 호출되는 sp_MStran_ddlrepl내에서 다음 구문의 예상 하위 트리 비용이 1274인 것을 확인함. XML data를 처리하는 과정에서 발생한 것으로, 시스템 저장 프로시저의 임의 수정이 불가능하여 이 구문의 비용을 낮출 수는 없는 상태임.

select @object_name  = event_instance.value('ObjectName[1]', 'sysname')
        ,@object_owner = event_instance.value('SchemaName[1]', 'sysname')
        ,@objecttype = event_instance.value('ObjectType[1]', 'varchar(32)')
        ,@encrypted = event_instance.value('(TSQLCommand/SetOptions/@ENCRYPTED)[1]', 'nvarchar(32)')
        ,@pass_through_scripts = event_instance.value('(TSQLCommand/CommandText)[1]', 'nvarchar(max)')
        ,@targetobject = event_instance.value('TargetObjectName[1]', 'nvarchar(512)')
    FROM       @EventData.nodes('/EVENT_INSTANCE') as R(event_instance)

참조

SQL Server 2005 온라인 설명서(2008년 11월)query governor cost limit 옵션
http://msdn.microsoft.com/ko-kr/library/ms190419(SQL.90).aspx

HTH,
한기환

NUMA와 Affinity Mask

공장이야기 2009/05/13 18:25 posted by 최적화기

TechNet 세미나에서 위 두개 주제로 혼선이 있어서 바로 잡습니다.

SQL 2005부터는 NUMA aware하기 때문에 구성된 H/W NUMA를 자동으로 인식합니다. 즉, SQL Server에서 명시적으로 NUMA를 구성할 필요가 없습니다. NUMA가 구성된 경우 각 노드와 CPU 구성 정도는 ERRORLOG에 노드명과 함께 기록됩니다.

6개의 노드로 구성된 NUMA가 ERRORLOG에 기록된 예)

Multinode configuration: node 0: CPU mask: 0x0000ff0000000000 Active CPU mask: 0x0000ff0000000000. Multinode configuration: node 1: CPU mask: 0x00000000000000ff Active CPU mask: 0x00000000000000ff. Multinode configuration: node 2: CPU mask: 0x000000ff00000000 Active CPU mask: 0x000000ff00000000. Multinode configuration: node 3: CPU mask: 0x000000000000ff00 Active CPU mask: 0x000000000000ff00. Multinode configuration: node 4: CPU mask: 0x0000000000ff0000 Active CPU mask: 0x0000000000ff0000. Multinode configuration: node 5: CPU mask: 0x00000000ff000000 Active CPU mask: 0x00000000ff000000.

Affinity Mask는 CPU Affinity Mask라고도 하며 현재 SQL instance에서 사용할 수 있는 CPU를 제한할 수 있게 해줍니다. 이 기능은 NUMA와 상관없이 사용 가능합니다. 문제점을 지적해 주신 분들께 감사드립니다. :)

감사합니다.
한기환

[TechNet]기술 세미나/5월13일

공장이야기 2009/05/11 14:20 posted by 최적화기

경제 위기 덕(?)에 오랜만에 공개 세미나를 진행하게 되었습니다.

  • 일시 : 2009년 5월 13일(수) 13:00~17:30
  • 장소 : 한국마이크로소프트 5층 세미나실 (포스코센터 서관)
  • Agenda
    • 13:00~13:30 등록
    • 13:30~14:20 SQL Server 2008 진단 서비스 소개 by 안재훈
    • 14:30~15:20 SQL Server 2008 BI 구축 사례 by 이권일
    • 15:30~15:20 SQL Server 2008 성능 튜닝 툴 by 한기환
    • 16:30~17:30 SQL Server 2008 트러블슈팅 Case Study by 한기환
  • 사전등록 : http://technet.microsoft.com/ko-kr/dd701201.aspx

총 4개의 세션 중 2개를 진행할 예정입니다. 주제는 개괄적으로 성능 튜닝 툴과 case study로 나갔는데요. ERRORLOG의 이해와 ERRORLOG를 이용한 트러블 슈팅 case에 초점을 맞추어 진행할 것입니다.

감사합니다.
한기환

Q. 배포 에이전트의 troubleshooting을 위해 verbose모드에서 output 파일을 받았는데, 다음과 같이  깨져보입니다. 제대로 볼 수 있는 방법이 있나요?

--default로 받았을 때.
2 0 0 6 - 1 1 - 1 5   0 7 : 1 9 : 5 9 . 6 5 7   M i c r o s o f t   S Q L   S e r v e r   羈i? 斤t?회? 9 . 0 0 . 2 0 4 7 . 0 0 
2 0 0 6 - 1 1 - 1 5   0 7 : 1 9 : 5 9 . 6 5 7   C o p y r i g h t   ( C )   2 0 0 5   M i c r o s o f t   C o r p o r a t i o n 
2 0 0 6 - 1 1 - 1 5   0 7 : 1 9 : 5 9 . 6 5 7   M i c r o s o f t   S Q L   S e r v e r   忖 ? 斤t?회?   r e p l m e r g 
2 0 0 6 - 1 1 - 1 5   0 7 : 1 9 : 5 9 . 6 5 7   
2 0 0 6 - 1 1 - 1 5   0 7 : 1 9 : 5 9 . 6 5 7   쑲%?
________________________________________
? ^털? 쇋@? 읽꽽ㅒ謚
________________________________________
?? U T C   堡
________________________________________
??? \胴?늣꿜? 
2 0 0 6 - 1 1 - 1 5   0 7 : 1 9 : 5 9 . 6 5 7   Ю㈕먉  읠 ? 斤t?회? 阿 ? 읊?  ?

A. Unicode 파일의 경우 파일의 처음 두 바이트가 0xFFFE로 시작해야 하는데 output으로 생성된 파일은 Unicode 파일을 표시하는 0xFFFE가 없습니다. 하지만, 실제 내용은 Unicode이기 때문에 Text Editor로 열면 ANSI Code 기준으로 열게 되어 깨져 보이게 됩니다.

방법1. 설정할때, Notepad 빈 페이지를 하나 띄우고 “유니코드” 인코딩 형태로 미리 output 파일을 생성해 놓으면 됩니다. 유니코드 파일에 유니코드 문제가 씌여지므로, 텍스트 편집기로 열었을 때에도 정상으로 보이게 됩니다.

--유니코드로 미리 만들어 놓고 받았을 때.
2006-11-15 10:33:14.557 Microsoft SQL Server 병합 에이전트 9.00.2047.00
2006-11-15 10:33:14.573 Copyright (C) 2005 Microsoft Corporation
2006-11-15 10:33:14.573 Microsoft SQL Server 복제 에이전트: replmerg
2006-11-15 10:33:14.573
2006-11-15 10:33:14.573 출력 줄 앞에 붙은 타임스탬프가 UTC 시간으로 표시됩니다.
2006-11-15 10:33:14.573 사용자 지정 에이전트 매개 변수 값:

방법2. 생성된 파일을 Hexa 코드 편집이 가능한 Editor로 Open한 후, 처음 두바이트에 0xFFFE를 추가하여 저장해 주면 정상적으로 Open하여 볼 수 있습니다.

추가정보
디버깅을 위해서 배포 에이전트에 verbose level을 설정하여 output 파일 수집

             --배포 에이전트의 명령줄에추가된 구문
             -Output C:\ReplOutput.txt -OutputVerboseLevel 2

참조
How to enable replication agents for logging to output files in SQL Server
http://support.microsoft.com/?id=312292

감사합니다.
한기환

[4/21]Microsoft Partner 대상 세미나

공장이야기 2009/04/22 20:46 posted by 최적화기

SQL Server 2008의 Activity Monitor, MDW를 위주로 2시간 동안 세미나를 진행하였습니다. 바쁜 와중에도 참석하여 기술적인 욕심을 채우려는 분들에게 박수를 보냅니다. MDW를 이용한 Baseline 작성과 트러블슈팅에 대해 이해할 수 있는 자리가 되었기를 희망합니다.

PPT에는 진행상의 흐름만 담겨 있으므로 게시하지 않고, demo에 사용한 custom collection set생성은 다음 script를 참조하세요.

/*
스크립트를 이용하여 사용자 collection set 생성하기

생성 순서 - MDW는 이미 설정되어 있어야 함.
1. collection set 생성
2. Collector type 지정
3. Collection item 생성
4. 생성된 collection set 시작
*/
Begin Transaction
Begin Try
Declare @collection_set_id_1 int
Declare @collection_set_uid_2 uniqueidentifier

--collection set설정
--Every_1min 이라는 일정은 미리 설정되어 있어야 함 (SQL Server 에이전트-Jobs의 오른 마우스 클릭 후 "일정 관리"에서 설정)
EXEC [msdb].[dbo].[sp_syscollector_create_collection_set]
    @name=N'LongRunningQuerys',
    @collection_mode=1,
    @description=N'Desc of LongRunningQuerys',
    @logging_level=0,
    @days_until_expiration=180,
    @schedule_name=N'Every_1min',
    @collection_set_id=@collection_set_id_1 OUTPUT,
    @collection_set_uid=@collection_set_uid_2 OUTPUT

--Item에 사용할 collector type확인. 여기서는 'Generic T-SQL Query Collector Type'로 설정
Declare @collector_type_uid_3 uniqueidentifier
Select @collector_type_uid_3 = collector_type_uid
  From [msdb].[dbo].[syscollector_collector_types] Where name = N'Generic T-SQL Query Collector Type';

--Collector type에 맞는 item설정.parameter에는 쿼리가 입력되고, 그 중 <OutputTable>에는 MDW에 생성될 테이블명이 들어간다.
Declare @collection_item_id_4 int
EXEC [msdb].[dbo].[sp_syscollector_create_collection_item]
    @name=N'Get LongRunningQuerys more than 1m',
    @parameters=N'<ns:TSQLQueryCollector xmlns:ns="DataCollectorType"><Query><Value>
select datediff(minute, last_request_start_time, getdate()) / 60 last_request_elapsed_running_time_m,session_id, [host_name],
[status], last_request_end_time, last_request_start_time
from sys.dm_exec_sessions
where last_request_start_time >= last_request_end_time
and status = ''running''
and datediff(minute, last_request_start_time, getdate())>1
</Value><OutputTable>LONGRUNNINGQueries</OutputTable></Query><Databases UseUserDatabases="true" /></ns:TSQLQueryCollector>',
    @collection_item_id=@collection_item_id_4 OUTPUT,
    @collection_set_id=@collection_set_id_1,
    @collector_type_uid=@collector_type_uid_3

Commit Transaction;
End Try
Begin Catch
Rollback Transaction;
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
DECLARE @ErrorNumber INT;
DECLARE @ErrorLine INT;
DECLARE @ErrorProcedure NVARCHAR(200);
SELECT @ErrorLine = ERROR_LINE(),
       @ErrorSeverity = ERROR_SEVERITY(),
       @ErrorState = ERROR_STATE(),
       @ErrorNumber = ERROR_NUMBER(),
       @ErrorMessage = ERROR_MESSAGE(),
       @ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-');
RAISERROR (14684, @ErrorSeverity, 1 , @ErrorNumber, @ErrorSeverity, @ErrorState, @ErrorProcedure, @ErrorLine, @ErrorMessage);
End Catch;
GO

--생성된 collection set 시작하기. 이때 MDW에 custom테이블이 생성된담.
EXEC msdb.dbo.sp_syscollector_start_collection_set @name = 'LongRunningQuerys30s'

--MDW에 수집된 데이터 확인하기. 사용자 collection set은 항상 custom_snapshots 스키마를 갖는다.
SELECT * FROM MDW.custom_snapshots.LONGRUNNINGQueries

/*
수집에 사용된 쿼리는 현재 연결되어 있는 세션 중 아직 request가 끝나지 않고, running상태에 있으면서 1분 이상 수행 중인 세션을 반환한다.
select datediff(minute, last_request_start_time, getdate()) / 60 last_request_elapsed_running_time_m,session_id, [host_name],
[status], last_request_end_time, last_request_start_time
from sys.dm_exec_sessions
where last_request_start_time >= last_request_end_time
and status = 'running'
and datediff(minute, last_request_start_time, getdate())>1

*/

감사합니다.
한기환

CPU, Memory를 많이 사용하는 sample query

공장이야기 2009/04/19 12:19 posted by 최적화기

Q. test용으로 간단히 CPU 또는 Memory를 많이 사용하게 하는 쿼리 좀 작성해 주세요.

A. select와 insert를 많이 수행하는 쿼리는 memory를 많이 사용하게 되고, 연산을 필요로 하는 함수를 자주 호출하게 되면 CPU를 집중적으로 사용하게 됩니다. 다음은 각각에 대한 sample query입니다.

--- 생성 : test database
CREATE DATABASE RSTest
go
USE RSTest
go

--- 생성 : test table
CREATE TABLE RSTestData
(
       ID                int      identity,
       GUID   uniqueidentifier,
       SOMEID         int
)
go

--- table 채워넣기
SET NOCOUNT ON
DECLARE @i int
SET @i = 1
WHILE @i < 300000
BEGIN
       INSERT INTO RSTestData (GUID, SOMEID) SELECT NEWID(), RAND()
       SET @i = @i + 1
END
PRINT('Inserted '+convert(varchar,@i)+ ' rows')
SET NOCOUNT OFF
go

--- 메모리 test를 위해 select와 insert를 많이 수행하는 sp 생성
CREATE PROCEDURE spRSMemoryTest
AS
WHILE 1=1
BEGIN
       INSERT INTO RSTestData (GUID, SOMEID)
       SELECT R1C.R1GUID, R1C.R1SOMEID
       FROM
       (
                 SELECT         R1.ID            as       R1ID    ,
                                R1.GUID                  as       R1GUID          ,
                                R1.SOMEID     as       R1SOMEID,
                                R2.ID            as       R2ID    ,
                                R2.GUID                  as       R2GUID          ,
                                R2.SOMEID     as       R2SOMEID
                 FROM  RSTestData R1 INNER MERGE JOIN RSTestData R2
                 ON      R1.ID = R2.ID
       ) R1C
       INNER MERGE JOIN
       (
                 SELECT         R1.ID            as       R1ID    ,
                                R1.GUID                  as       R1GUID          ,
                                R1.SOMEID     as       R1SOMEID,
                                R2.ID            as       R2ID    ,
                                R2.GUID                  as       R2GUID          ,
                                R2.SOMEID     as       R2SOMEID
                 FROM  RSTestData R1 INNER MERGE JOIN RSTestData R2
                 ON      R1.ID = R2.ID
       ) R2C
       ON R1C.R1ID = R2C.R1ID
END
go

-- CPU를 집중적으로 사용하는 SP생성
CREATE PROCEDURE spRSTestCPU
AS
DECLARE @i   int,
        @a     int,
        @b     uniqueidentifier,
        @c     varchar(1000),
        @d     varchar(1000)
SET @i= 1
while @i<10000000000
BEGIN
       SELECT         @a = RAND(), @b = NEWID(), @c = @@VERSION, @d = @@servername
       SET @i = @i + 1
END
go

참고로, 위 코드는 일반 튜닝 및 테스트 용도로도 잘 활용될 수 있을 것으로 판단하여, Resource Governor를 테스트하기 위해 작성된 LAB에서 발췌하였음.

한기환

Q. MemToLeave에서 가장 큰 연속된 공간(Max Free Block) 확인

A. SQL Server 2000에서는 CSS에서 제공하는 vmstat.exe을 이용하거나 Private Bytes, TotalServer Memory를 이용하여 근사치를 계산해야 했다. SQL Server 2005, 2008에서는 DMV를 이용한 다음 쿼리를 통해 확인할 수 있다.

With VASummary(Size,Reserved,Free) AS
(SELECT
    Size = VaDump.Size,
    Reserved =  SUM(CASE(CONVERT(INT, VaDump.Base)^0)
    WHEN 0 THEN 0 ELSE 1 END),
    Free = SUM(CASE(CONVERT(INT, VaDump.Base)^0)
    WHEN 0 THEN 1 ELSE 0 END)
FROM
(
    SELECT  CONVERT(VARBINARY, SUM(region_size_in_bytes))
    AS Size, region_allocation_base_address AS Base
    FROM sys.dm_os_virtual_address_dump 
    WHERE region_allocation_base_address <> 0x0
    GROUP BY region_allocation_base_address 
UNION  
    SELECT CONVERT(VARBINARY, region_size_in_bytes), region_allocation_base_address
    FROM sys.dm_os_virtual_address_dump
    WHERE region_allocation_base_address  = 0x0
)
AS VaDump
GROUP BY Size)

SELECT SUM(CONVERT(BIGINT,Size)*Free)/1024 AS [Total avail mem, KB] ,CAST(MAX(Size) AS BIGINT)/1024 AS [Max free size, KB] 
FROM VASummary 
WHERE Free <> 0

출처
SQL Server memtoleave, VAS and 64-bit
http://sqlblogcasts.com/blogs/christian/archive/2008/01/07/sql-server-memtoleave-vas-and-64-bit.aspx

추가 정보

유의할 점은, 이 결과 값이 Virtual Address Space에 대한 계산이기 때문에 Physical Memory가 부족한 상태에서는 어떠한 판단의 근거로 삼으면 안된다는 것이다. 예를 들어, Physical Memory 가 64G인 IA64 머신에서 고정 서버 메모리 60G가 설정되어 있다면? 시스템과 다른 프로세스에 의해서도 Physical Memory가 쓰이기 때문에 위 쿼리로 확인한 공간이 많이 있을지라도 MemToLeave공간 부족 오류가 발생할 수 있다.

* MemToLeave가 부족할 때 나타나는 증상들

1. error 17189
오류: 17189, 심각도: 16, 상태: 1
SQL Server failed with error code 0xc0000000 to spawn a thread to process a new login or connection. Check the SQL Server error log and the Windows event logs for information about possible related problems. [클라이언트: 121.139.219.130]

2. error 18056
오류: 18056, 심각도: 20, 상태: 29
The client was unable to reuse a session with SPID 302, which had been reset for connection pooling. This error may have been caused by an earlier operation failing. Check the error logs for failed operations immediately before this error message.

3. error 17803
오류: 17803, 심각도: 20, 상태: 5
사용할 수 있는 메모리가 부족합니다..
WARNING:  Failed to reserve contiguous memory of Size= 65536.

4. error 512
Non-interface error:  OLE DB provider SQLOLEDB returned an incorrect value for properties changed which should be for schema checking
Error: 512, Severity: 16, State: 1

5. login 실패
SQL Server에서 process_loginread 스레드를 만들 수 없습니다.

6. 백업 실패

7. 기타 ...

한기환

Season of the bike, Benly 50s

그냥재미로 2009/04/11 15:32 posted by 최적화기
 

  A White Benly. This is my lovely bike. The engine is just 49 cc. But, that’s enough for me to feel the speed, wind and freedom. As you can see, this is not a tandem bike. The small size of seat is just for one rider. During riding, I can stop worrying. To ride a bike with shouting is one of my solution to get rid of stress. Do you have your own solution? Don’t hesitate to let me know. / Giwhan Han

Q. SQL Server 2008에서의 성능 문제 해결을 위해 참조할 만한 문서가 있나요?

A. Word 90 page 분량의 다음 (영문)문서 참조하세요. 세미나/스터디 자료로 사용해도 아주 훌륭합니다.

Troubleshooting Performance Problems in SQL Server 2008
http://msdn.microsoft.com/en-us/library/dd672789.aspx

Contents

  • CPU Bottlenecks
  • Memory Bottlenecks
  • I/O Bottlenecks
  • tempdb
  • Slow-Running Queries
  • Extended Events
  • Data Collector and the MDW

참고

SQL Server 2005에서 소개된 다음 문서의 SQL Server 2008용 문서임.

HTH,
한기환

SQL connection과 Netmon

공장이야기 2009/03/14 09:32 posted by 최적화기

Client에서 SQL Server에 원격접속하기위해서는 어쩔 수 없이 Network을 이용한다. 따라서, Network관련 오류가 발생한다면 SQL Server와의 연결에도 장애/오류가 초래될 것이다. 이럴 때에 Netmon을 이용한다면 문제가 어느 쪽에서 유발되었는지를 파악할 수 있어서 원인 파악에 도움을 얻을 수 있다.

문제 확인
원격 client에서 SQL Server의 연결이 간헐적으로 끊기면서 Network 이슈가 의심되는 상황.

증상
General Network Error(GNE)
Timeout 만료
SQL Server를 찾을 수 없다는 오류
Access Denied
7885, 4014 와 같은 network 오류가 ERRORLOG에 남아있는 경우.

오류: 7885
2009-02-03 22:47:44.99 서버          오류: 7885, 심각도: 20, 상태: 1.
2009-02-03 22:47:44.99 서버          Network error 0x2746 occurred while sending data to the client. A common cause for this error is if the client disconnected without reading the entire response from the server. This connection will be terminated.
2009-02-03 22:47:44.99 Server      Closing connection due to unexpected error 7885, severity 25, state 8.
2009-02-03 22:47:49.84 서버          ErrorReportingManager: Error raised, major=40, minor=14, severity=20, attempting to create symptom dump

           Network error 0x2746은 특정 머신에서 강제로 연결을 끊은 경우에 발생함.
           An existing connection was forcibly closed by the remote host.

오류: 4014
2009-02-03 22:38:24.28 서버          오류: 4014, 심각도: 20, 상태: 2.
2009-02-03 22:38:24.28 서버          A fatal error occurred while reading the input stream from the network. The session will be terminated.

 해결 과정
1. 다음 문서를 참조하여 (문제가 발생하는 시점에) client와 server 모두에서 동시에 Netmon trace를 수집한다.

General network errors (GNEs), Timeout expired, SQL Server not found or Access Denied…
http://blogs.msdn.com/sqlblog/archive/2007/09/06/general-network-errors-gnes-timeout-expired-sql-server-not-found-or-access-denied.aspx

* 다음 명령을 수행하면, 100M 단위로 trace파일이 생성된다. test.cap, test(1).cap, test(2).cap..

NMCap /network * /capture /file test.chn:100M

2. 수집된 trace파일 분석

어느쪽에서건 강제로 연결이 끊긴 경우이므로, reset frame을 찾는 것이 분석의 시작이다. trace파일 크기가 작은 경우엔 GUI tool에서 바로 파일을 열 수도 있지만, 그렇지 않다면 명령으로 reset frame만 분리한 후 GUI tool에서 열어보는 것이 눈의 피로를 덜어 줄 것이다.

다음 명령은 이미 수집된 test.cap, test(1).cap 파일에서 tcp.Port 가 1847이며 Reset = 1인 frame을 걸러낸 후 새 파일(test.Reset.cap)로 저장하는 명령어이다.

NMCap /InputCapture test.cap test(1).cap /capture tcp.Port == 1847 and tcp.Flags.Reset == 1 /file test.Reset.cap

참고) 명령줄에서는 여러개의 조건을 걸때 AND 를 사용한다. GUI tool에서는 && 도 사용 가능하다.

3. 문제를 확인하는 방법

Netmon을 통해 수집된 trace파일을 분선하면 어디에서 reset이 발생되었는지 파악할 수 있다.

Case 1) client에서 server로 가는 frame에 reset 이 있는 경우
client side에서 connection을 reset한 경우임.  client application에 대해 추가 조사가 필요함.

이 경우엔 application에 설정된 timeout이 대표적인 예이다. 이전 frame과의 time 간격을 확인한 후 timeout 시간을 파악할 수 있고, timeout 값을 늘려주는 것이 해결책일 수 있다.

Case 2) server에서 client로 가는 frame에 reset이 있는 경우
Server단에서 연결을 끊는 것이므로, ERRORLOG와 Event log를 통해서 추가 정보를 확인하여 troubleshooting을 계속한다. Server에 설치되어 있는 3rd party application이나 network card driver등의 문제로 인해 발생하는 경우가 있음.

Case 3) reset 이 각 client와 server로 가는 frame 모두에서 발견되는 경우
client와 server사이에 있는 firewall(방화벽)에서 reset을 유발했을 가능성이 큼. 방화벽 설정을 확인하여 해당 SQL port에 예외를 설정하거나 timeout값을 늘려주는 등의 작업이 필요하다.

기타
netmon trace에서 관심을 가지고 보아야 할 항목

Source, Destination, SrcPort, DstPort, Flags

Frame Summary에서 각 frame의 발생 시각을 보려면, Frame Summary의 컬럼에서 오른 마우스 클릭 후 "Choose Columns..." 선택 후 다음 컬럼을 추가한다.

Time And Date (format hh:mm:ss.0)
Time Of Day (format yyyy-mm-dd hh:mm:ss)

참조
The Quick and Easy on Using NMCap to Create Circular Network Traces Based on File Size
http://blogs.technet.com/networking/archive/2008/08/27/the-quick-and-easy-on-using-nmcap-to-create-circular-network-traces-based-on-file-size.aspx
NMCap: the easy way to Automate Capturing
http://blogs.technet.com/netmon/archive/2006/10/24/nmcap-the-easy-way-to-automate-capturing.aspx#3113014
Network Monitor 3에 대한 정보
http://support.microsoft.com/kb/933741
TCP/IP를 통한 세 방향 핸드셰이크에 대한 설명
http://support.microsoft.com/kb/172983
TCP/IP 추적 읽기에 대한 기본 사항
http://support.microsoft.com/kb/169292
Description of Windows 2000 and Windows Server 2003 TCP Features
http://support.microsoft.com/kb/224829

HTH,
한기환