Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 3개 있습니다.)

제니퍼 닷넷 적용 사례 (1) - DB Connection Pooling을 사용하지 않았을 때의 성능 저하를 알려주다.

'제니퍼 닷넷' 제품이 출시된지 이제 1년 반 정도 지나가는 것 같은데요. 가끔씩, 적용 사례를 정리해서 블로그에 올려야 겠다고 생각은 했는데 이상하게 잘 안되더군요. ^^ 나이가 들은 걸까요? 사실, 집에 오면 공부하는 시간마저도 줄어든 것 같아서 회사 제품에 대한 글을 쓰는 여유가 도통 나질 않았습니다. (한마디로, 핑계죠... ^^)

게다가 '사례'를 쓴 다는 것에 어려운 점이 있긴 합니다. 왜냐하면, 보안상 고객사들의 운영중인 화면을 갈무리하는 것을 허가받기가 쉽지 않고, 대개의 경우 설치 시점부터 '제니퍼' 회사의 '채널사'에 속한 기술 엔지니어들이 담당하기 때문에 제가 아예 관여되지 않는 경우도 많기 때문입니다.

그래도 종종 고객사들의 실 서버 운영자들이 느끼는 고충을 이해하기 위해 기술 엔지니어와 함께 동행해서 고객사에 방문한 적도 있고, 기술 엔지니어 수준에서 알 수 없는 어려운 문제가 발생한 경우 제가 나서기도 하기 때문에 - 그나마 쌓인 경험으로 '제니퍼 닷넷 적용 사례'에 대해서 가끔씩 이렇게 써볼까 합니다. ^^

오늘은 그 첫번째로, DB Connection Pooling 옵션과 관련해서 겪었던 사례를 소개해 드리겠습니다.

(참고로, 이 글에 나온 모든 갈무리 화면은 실제 고객사의 화면이 아니고 제가 임의로 그와 비슷하게 구성한 화면입니다.)




A 고객사를 처음 방문했을 때, 여러 팀이 각각 개별 웹 서비스 시스템을 맡아서 개발하고 있었습니다. '제니퍼 닷넷'을 설치해서 모니터링을 시작하자 유독 한 팀의 웹 서비스 성능이 낮다는 것이 눈에 보였습니다.

제니퍼 닷넷의 콘솔 화면에서 제공되는 X-View에서 아래와 같은 식의 응답 시간이 늦은 점들이 보였고,

[그림 1: X-View 화면 - 가로축은 요청 시간, 세로축은 해당 요청을 처리하는 데 걸린 시간을 의미]
jennifer_connection_pooling_demo_1.png

위의 점들에 대응되는 요청을 상세 보기로 확인하니 다음과 같이 SqlConnection 생성 시에 매번 시간이 걸리는 것을 확인할 수 있었습니다.

jennifer_connection_pooling_demo_2.png

위의 데모 이미지에서는 16ms를 보여줬지만 실제 고객사의 서버에서는 약 200ms의 시간이 꾸준히 지연되었고, 한 화면에 10번 이상의 연결 개체를 생성하는 것이 나타났으므로 순수하게 DB 연결 개체 생성에만 2초 이상의 시간이 지연된 것이었습니다.

재미있는 것은, 그 팀에서만 Connection Pooling 을 false로 잡아놓았다는 것.




B 고객사는 해외 업체였습니다. 역시 제니퍼 닷넷을 설치하고 X-View 화면을 띄워놨는데, 전체 X-View의 점들이 공통적으로 2초 이상의 처리 시간을 나타내고 있었습니다. 상세 보기로 확인하니 이번에도 Connection Pooling이 false로 설정되어 있었는데, 더욱 재미있는 것은 Connection Close를 하지 않아서 여기저기서 Connection Leak이 있음을 알 수 있었습니다.

jennifer_connection_pooling_demo_3.png

위의 결과로 재미있는 시나리오가 유추되었는데요. 즉, 개발사는 개발해 둔 웹 애플리케이션이 가끔씩 DB 연결에 문제가 있었음을 알았지만 그 원인을 파악하기 보다는(또는 못했거나) Pooling을 false로 하는 임시 조치를 취했고 그대로 납품이 되어 운영된 것이었습니다. 그로 인해 해당 웹 애플리케이션을 사용하는 모든 사용자들은 요청을 한번 보낼 때마다 2초 이상의 지연시간을 감내해야만 했습니다.




어떠세요? 위의 사례만으로 봐도, APM 도구가 어느 정도의 '품질을 만족하는 기준'으로도 사용될 수 있지 않을까요? ^^

위의 글을 읽고, '아직도 저런 초보적인 오류를 발생시키는 경우가 있을까?'라며 생각하는 분들이 계실텐데요. 제 블로그를 방문하며 공부하시는 분들이라면 대부분 그렇지 않겠지만, 의외로 반대의 개발자들도 많습니다.

그리고, 여기서 웹 응용 프로그램을 개발하는 측의 입장을 이해할 필요도 있습니다. 외주 업체는 자사의 개발자 뿐만 아니라 서로 다른 수준의 프리랜서 개발자들도 영입하는 것이 보통이고, 가끔은 팀 간의 공통적으로 사용하는 '개발 프레임워크' 없이 개발을 시작하거나, 또는 '개발 프레임워크'에 헛점이 있어 초급 개발자가 실수할 수 있는 구멍이 있는 경우 위와 같은 상황은 의외로 쉽게 발생할 수 있습니다.

게다가, 제대로 개발된 웹 사이트가 납품되었다고 해도 때로는 지속적으로 업데이트 해나가는 과정에서 서로 다른 외주 업체를 고용하는 상황일 수 있는데, 그런 경우에도 역시 '관리'가 점점 더 느슨하게 될 수 있습니다.

바로 그런 경우에, 제니퍼 닷넷과 같은 APM 도구가 도움이 될 수 있답니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2011-09-05 06시31분
ㅎㅎ 제니퍼가 유용 할 수 있겠네요.
저도 비슷한 경우가 있었어요~ 프로그램을 납품을 했는데 특정 부분에서 속도 저하가 있다고 해서 코드를 봤는데.
개발당시 테스트 한다고 loop를 돌린 부분이 들어 가 있었어요 ㅎㅎ
문우영

1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13488정성태12/18/20232109오류 유형: 884. HTTP 500.0 - 명령행에서 실행한 ASP.NET Core 응용 프로그램을 실행하는 방법
13487정성태12/16/20232413개발 환경 구성: 696. C# - 리눅스용 AOT 빌드를 docker에서 수행 [1]
13486정성태12/15/20232227개발 환경 구성: 695. Nuget config 파일에 값 설정/삭제 방법
13485정성태12/15/20232121오류 유형: 883. dotnet build/restore - error : Root element is missing
13484정성태12/14/20232200개발 환경 구성: 694. Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법
13483정성태12/14/20232330닷넷: 2184. C# - 하나의 resource 파일을 여러 프로그램에서 (AOT 시에도) 사용하는 방법파일 다운로드1
13482정성태12/13/20233002닷넷: 2183. C# - eFriend Expert OCX 예제를 .NET Core/5+ Console App에서 사용하는 방법 [2]파일 다운로드1
13481정성태12/13/20232309개발 환경 구성: 693. msbuild - .NET Core/5+ 프로젝트에서 resgen을 이용한 리소스 파일 생성 방법파일 다운로드1
13480정성태12/12/20232698개발 환경 구성: 692. Windows WSL 2 + Chrome 웹 브라우저 설치
13479정성태12/11/20232368개발 환경 구성: 691. WSL 2 (Ubuntu) + nginx 환경 설정
13477정성태12/8/20232616닷넷: 2182. C# - .NET 7부터 추가된 Int128, UInt128 [1]파일 다운로드1
13476정성태12/8/20232308닷넷: 2181. C# - .NET 8 JsonStringEnumConverter의 AOT를 위한 개선파일 다운로드1
13475정성태12/7/20232399닷넷: 2180. .NET 8 - 함수 포인터에 대한 Reflection 정보 조회파일 다운로드1
13474정성태12/6/20232225개발 환경 구성: 690. 닷넷 코어/5+ 버전의 ilasm/ildasm 실행 파일 구하는 방법 - 두 번째 이야기
13473정성태12/5/20232488닷넷: 2179. C# - 값 형식(Blittable)을 메모리 복사를 이용해 바이트 배열로 직렬화/역직렬화파일 다운로드1
13472정성태12/4/20232248C/C++: 164. Visual C++ - InterlockedCompareExchange128 사용 방법
13471정성태12/4/20232346Copilot - To enable GitHub Copilot, authorize this extension using GitHub's device flow
13470정성태12/2/20232673닷넷: 2178. C# - .NET 8부터 COM Interop에 대한 자동 소스 코드 생성 도입파일 다운로드1
13469정성태12/1/20232437닷넷: 2177. C# - (Interop DLL 없이) CoClass를 이용한 COM 개체 생성 방법파일 다운로드1
13468정성태12/1/20232332닷넷: 2176. C# - .NET Core/5+부터 달라진 RCW(Runtime Callable Wrapper) 대응 방식파일 다운로드1
13467정성태11/30/20232430오류 유형: 882. C# - Unhandled exception. System.Runtime.InteropServices.COMException (0x800080A5)파일 다운로드1
13466정성태11/29/20232605닷넷: 2175. C# - DllImport 메서드의 AOT 지원을 위한 LibraryImport 옵션
13465정성태11/28/20232344개발 환경 구성: 689. MSBuild - CopyToOutputDirectory가 "dotnet publish" 시에는 적용되지 않는 문제파일 다운로드1
13464정성태11/28/20232485닷넷: 2174. C# - .NET 7부터 UnmanagedCallersOnly 함수 export 기능을 AOT 빌드에 통합파일 다운로드1
13463정성태11/27/20232400오류 유형: 881. Visual Studio - NU1605: Warning As Error: Detected package downgrade
13462정성태11/27/20232413오류 유형: 880. Visual Studio - error CS0246: The type or namespace name '...' could not be found
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...