성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>소켓 모니터링 기능으로 본 ASP.NET의 소켓 풀링 기능</div><br /> <br /> 지난 글에서 WebDev.****.exe에서 ASP.NET을 호스팅 했을 때, WCF 서비스 호출에 대한 소켓 모니터링 결과를 보여드렸는데요. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 소켓 모니터링 기능으로 본 WCF의 WSDualHttpBinding 성능 부하 ; <a target='_tab' href='/2/0/878'>http://www.sysnet.pe.kr/2/0/878</a> </pre> <br /> 재미있게도 동일한 aspx 웹 페이지를 IIS에서 호스팅하면 다음과 같은 식으로 소켓 모니터링이 되는 것을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > UUID: 1c35550b8e491d3d(2032624314947804477) 서버 시간: 11:59:29 391(1275706769391) 에이전트: LA1 애플리케이션: /CallToAsmxService.aspx(-1436277220) 클라이언트 아이디: 6b90b0fec4e457b(484430597936006523) 클라이언트 IP: 127.0.0.1 사용자 아이디: 호출 시간: 11:59:47 039 종료 시간: 11:59:51 930 응답 시간: 4,891 CPU 시간: 94 SQL 시간: 0 Fetch 시간: 0 TX 시간: 0 ... [중간생략] ... [0009][11:59:48 181][ 1][ 0] BasicHttpBinding == http://localhost:19448/WCFs/WcfJennifer.svc/addrBasicHttpBinding [0010][11:59:48 186][ 5][ 0] <b style='COLOR: blue'>SOCKET[addr=127.0.0.1,port=80,localport=3808]</b> [0012][11:59:49 775][ 1][ 0] WSHttpBinding == http://localhost:19448/WCFs/WcfJennifer.svc/addrWsHttpBinding [0015][11:59:50 811][ 1][ 0] WSDualHttpBinding == http://localhost:19448/WCFs/WcfJennifer.svc/addrWsDualHttpBinding [0016][11:59:50 816][ 5][ 0] WSDualHttpBinding Method Calling [0021][11:59:51 360][ 500][ 0] WSDualHttpBinding Closing [0026][11:59:51 924][ 39][ 0] WSDualHttpBinding Closed ... [중간생략] ... </pre> <br /> 사실, 위의 경우도 운이 좋은 경우이고 여러 번 호출되다 보면 SOCKET 메시지 조차도 나오지 않습니다. 처음엔, 이 결과에 적지 않게 당황했습니다. 혹시 제니퍼의 모니터링 기능이 잘못 구현된 것인지? 아니면 닷넷 모니터링 기능 자체가 불안정한가? 라는 가정들이 올라왔기 때문입니다.<br /> <br /> 원인을 좀 더 명확하게 하기 위해, 모니터링 코드 자체에 Receive/Send 메서드에도 진단 코드를 넣고 다시 돌려 보았습니다. 오호~~~ 코드는 아무런 이상이 없었다는 것이 밝혀졌습니다. (참고로, 아래의 출력은 제니퍼의 기능과는 무관합니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > BasicHttpBinding == http://win2003x86:80/WCFs/WcfJennifer.svc/addrBasicHttpBinding <b style='COLOR: blue'>Connect</b> Send - 222 bytes Receive - (Total) <b style='COLOR: blue'>1007</b> bytes Receive - (Total) <b style='COLOR: blue'>1032</b> bytes WSHttpBinding == http://win2003x86:80/WCFs/WcfJennifer.svc/addrWsHttpBinding Send - 169 bytes Receive - (Total) <b style='COLOR: blue'>1459</b> bytes Receive - (Total) <b style='COLOR: blue'>1484</b> bytes WSDualHttpBinding == http://win2003x86:80/WCFs/WcfJennifer.svc/addrWsDualHttpBinding WSDualHttpBinding Method Calling Send - 173 bytes Receive - (Total) <b style='COLOR: blue'>2157</b> bytes Receive - (Total) <b style='COLOR: blue'>2182</b> bytes Send - 174 bytes Receive - (Total) <b style='COLOR: blue'>2366</b> bytes Receive - (Total) <b style='COLOR: blue'>2391</b> bytes WSDualHttpBinding Closing Send - 173 bytes Receive - (Total) <b style='COLOR: blue'>2784</b> bytes Receive - (Total) <b style='COLOR: blue'>2809</b> bytes Send - 173 bytes Receive - (Total) <b style='COLOR: blue'>3202</b> bytes Receive - (Total) <b style='COLOR: blue'>3227</b> bytes WSDualHttpBinding Closed </pre> <br /> 최초 Socket.Connect 호출 이후에 Socket.Receive 함수의 호출로 받은 입력 값들의 바이트 수가 누적되는 것을 확인할 수 있는데요.<br /> <br /> 바로, 최초 호출 시에만 Socket.Connect 메서드가 호출되고 이후의 WCF 연결들은 새롭게 열지 않고 이전에 열어둔 소켓을 재활용하기 때문입니다. 이것은 ProcessRequest 범위를 넘어서 aspx 호출 간에도 재사용이 이뤄집니다.<br /> <br /> 재미있는 점은, 이런 소켓 풀링이 WCF 연결 자원에서만 이루어지는 것이 아니고, ASMX 프록시 클래스, HttpWebRequest 레벨을 모두 포함해서 같이 공유가 된다는 것입니다. Socket.Open/Close를 직접 호출하는 것은 소켓 풀링이 안되는 것으로 봐서 Socket을 감싼 어느 레벨 이상의 클래스가 자동으로 소켓 풀링을 해주는 것으로 보입니다.<br /> <br /> 정리해 보면, IIS에서 호스팅 될 때는 소켓 풀링이 적용되고, WebDev.****.exe에서는 소켓 풀링이 안된다는 것!<br /> </div>
첨부파일
스팸 방지용 인증 번호
1386
(왼쪽의 숫자를 입력해야 합니다.)