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)
13818정성태11/15/20245321Windows: 272. Windows 11 24H2 - sudo 추가
13817정성태11/14/20244952Linux: 106. eBPF / bpf2go - (BPF_MAP_TYPE_HASH) Map을 이용한 전역 변수 구현
13816정성태11/14/20245402닷넷: 2312. C#, C++ - Windows / Linux 환경의 Thread Name 설정파일 다운로드1
13815정성태11/13/20244838Linux: 105. eBPF - bpf2go에서 전역 변수 설정 방법
13814정성태11/13/20245299닷넷: 2311. C# - Windows / Linux 환경에서 Native Thread ID 가져오기파일 다운로드1
13813정성태11/12/20245066닷넷: 2310. .NET의 Rune 타입과 emoji 표현파일 다운로드1
13812정성태11/11/20245285오류 유형: 933. Active Directory - The forest functional level is not supported.
13811정성태11/11/20244875Linux: 104. Linux - COLUMNS 환경변수가 언제나 80으로 설정되는 환경
13810정성태11/10/20245395Linux: 103. eBPF (bpf2go) - Tracepoint를 이용한 트레이스 (BPF_PROG_TYPE_TRACEPOINT)
13809정성태11/10/20245268Windows: 271. 윈도우 서버 2025 마이그레이션
13808정성태11/9/20245286오류 유형: 932. Linux - 커널 업그레이드 후 "error: bad shim signature" 오류 발생
13807정성태11/9/20244996Linux: 102. Linux - 커널 이미지 파일 서명 (Ubuntu 환경)
13806정성태11/8/20244931Windows: 270. 어댑터 상세 정보(Network Connection Details) 창의 내용이 비어 있는 경우
13805정성태11/8/20244764오류 유형: 931. Active Directory의 adprep 또는 복제가 안 되는 경우
13804정성태11/7/20245397Linux: 101. eBPF 함수의 인자를 다루는 방법
13803정성태11/7/20245341닷넷: 2309. C# - .NET Core에서 바뀐 DateTime.Ticks의 정밀도
13802정성태11/6/20245728Windows: 269. GetSystemTimeAsFileTime과 GetSystemTimePreciseAsFileTime의 차이점파일 다운로드1
13801정성태11/5/20245502Linux: 100. eBPF의 2가지 방식 - libbcc와 libbpf(CO-RE)
13800정성태11/3/20246355닷넷: 2308. C# - ICU 라이브러리를 활용한 문자열의 대소문자 변환 [2]파일 다운로드1
13799정성태11/2/20244932개발 환경 구성: 732. 모바일 웹 브라우저에서 유니코드 문자가 표시되지 않는 경우
13798정성태11/2/20245534개발 환경 구성: 731. 유니코드 - 출력 예시 및 폰트 찾기
13797정성태11/1/20245518C/C++: 185. C++ - 문자열의 대소문자를 변환하는 transform + std::tolower/toupper 방식의 문제점파일 다운로드1
13796정성태10/31/20245398C/C++: 184. C++ - ICU dll을 이용하는 예제 코드 (Windows)파일 다운로드1
13795정성태10/31/20245182Windows: 268. Windows - 리눅스 환경처럼 공백으로 끝나는 프롬프트 만들기
13794정성태10/30/20245283닷넷: 2307. C# - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
13793정성태10/28/20245151C/C++: 183. C++ - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...