2012-05-04 3 views
1

소켓을 사용하여 내 응용 프로그램의 네트워크 코드를 작성했습니다. 필자는 Windows PC에서 라이브러리를 테스트했으며 매우 빠릅니다. 그것은 많은 작은 "패킷"(패킷을 보내면 작업을 보내는 것을 의미합니다. 스트리밍중인 TCP를 사용하고 있습니다)이든 작은 크기의 데이터 든, 몇 가지 큰 것에서는 완벽하게 작동합니다.Monotouch에서 ThreadPool 스레드 수를 늘리시겠습니까?

코드를 iPhone 용 테스트 앱으로 옮겼습니다. 시험을 보니, 다시 좋은 속도. 약 3 초 안에 2 대의 휴대 전화 사이에서 약 5MB가 wifi로 전송됩니다.

Im 스레드 풀 스레드에서 동기 Socket.Send() 작업을 사용하고 수신을 위해 ReceiveAsync()를 사용합니다. (BeginReceive() 스타일도 시도했지만 동일하게 동작합니다.)

그러나 일단 코드를 내 앱으로 옮기면 문제가 발생하기 시작합니다. 일반적인 문제는 수신 앱이 일관되게 수신합니다. 호스트 전화에서 여러 개의 "패킷"데이터를 보낼 수 있으며, 수신하는쪽에 표시되기 전에 즉각적으로 몇 초에서 10 분 정도 걸릴 수 있습니다.이 문제는 2 주 동안 발생했습니다. 지금은 (저녁/주말) 그리고 그것을 재현하기 위해 할 수있는 일을 정확히 이해하려고 노력하면서 테스트를 거쳤지 만 결코 두 번 반복하지는 않습니다.

현재 스레드 풀 스레드가 고갈되고 있습니다. 내가 사용했습니다

ThreadPool.SetMaxThreads() 

스레드 수를 대폭 증가 시키지만 차이는 없습니다. 마치 SocketAsyncEventArgs의 완료 콜백에서 작업 할 스레드를 얻을 수 없기 때문에 마치 거기에 있습니다. 내 코드를 살펴보고 정기적 인 작업을 수행하는 루프가있는 쓰레드를 사용해야하는 것은 아니었던 것을 리팩토링했지만 문제는 여전히 남아 있습니다.

나는 이걸 어디로 돌릴 지 전혀 모른다. Im는 Monotouch (아마 그 사람을 비난하려고 노력하는 Im가 아니라)에서 그 버그를 원한다.

게시 할 코드가 확실하지 않아 네트워크 코드가 자체적으로 테스트되었으며 정상적으로 작동합니다. 나는 어떤 종류의 누출이 있었는지 확인하기 위해 1,000,000 건의 송수신을 테스트했지만 문제가없는 것으로 판명되었습니다.

데이터가 수신자에게 전달되는 것처럼 보이지만 콜백은 전화가 걸려 오면 몇 분 정도 지연 될 수 있습니다.

왜 이런 일이 일어날 지 알 수 있습니까?

감사합니다.

+1

풀 스레드 수를 늘리는 것이 올바른 방법이 아닙니다. 실제로 상황을 현저하게 악화 시키거나 시스템 전체를 죽일 수 있습니다 (스택에 너무 많은 메모리가 사용됨). 첫 번째 생각은'SendAsync'입니다. 두 번째 생각은 필요할 경우 소수의 작성기 스레드에서 처리 할 수있는 보내는 메시지 큐를 갖는 것입니다. 몇 명의 고객을 여기서 지원합니까? (또한 버그 인 경우 MonoTouch가 아니라 Mono의 버그입니다.) –

+0

예, 실감이 증가하는 것은 나쁜 생각이었습니다. 내일 SendAsync를 사용하여 도움이되는지 확인해 보겠습니다. 나는 문제가 실제로 보내는 쪽보다는받는쪽에 있다고 생각한다. 보내기가 성공적으로 완료되었지만 수신이 콜백에 몇 분 (또는 몇 초) 걸릴 수 있습니다. 클라이언트에 관해서는, 나는 아마 그것을 10 - 12 최대 클라이언트 – Dermot

+1

naggle enabled ('Socket.NoDelay')? (물론, 당신은 너무 작은 패킷을 쓰지 않도록해야합니다) –

답변

2

내 문제는 GKSession을 초기화하여 발생했습니다. Monotouch/Mono의 버그가 수정 되었으면합니다. 네트워크 기능을 모두 활성화해야합니다. GKSession을 비활성화하면 소켓 코드가 자유롭게 흐릅니다.

+0

귀하의 분석은 아주 좋은 접근 방법을 통해 입증되었습니다. +1 –

+0

bugzilla.xamarin.com에서이 문제에 대한 버그를 열었습니까 ?? 그렇지 않으면 버그이므로 수정이 가능합니다. – dalexsoto

+0

예. 버그를 보여주는 예제 응용 프로그램과 함께 제출되었습니다. – Dermot

관련 문제