2009-09-08 2 views
11

저는 C#으로 서버를 개발하고 있습니다. 이 서버는 백업 서비스를위한 데이터 서버의 역할을합니다. 클라이언트는 데이터, 많은 데이터를 지속적으로 보내고, 특히 동일한 TCP 채널에서 최대 5 개의 파일 데이터를 전송합니다. 나는 서버에 데이터를 천천히 보낼 것이다. 나는 고객 대역폭을 죽이고 싶지 않다. 그래서 최대 데이터 전송 속도를 높일 필요가 없으며, 이런 이유 때문에 모든 것을 위해 단일 TCP 채널을 사용할 수있다.Socket.BeginReceive Mono 성능

실제로이 서버는 BeginReceive 메서드를 사용하여 클라이언트에서 데이터를 수집하고 Windows에서는 IOCP를 의미합니다. 내 질문은 : BeginReceive가 linux/freebsd trough mono에서 어떻게 작동할까요? 창문에서, 나는 많은 것들을 읽었고, 잘 수행 할 것이지만,이 소프트웨어, 서버 부분은 리눅스 나 freebsd trough 모노에서 실행될 것입니다. 그리고이 방법들이 어떻게 구현되는지 모르겠습니다!

더 많은 것을 얻으려면 (Begin | End) Receive 메서드에 대한 비동기 상태 개체의 할당을 계속 줄여야합니다. tcp 연결과 BeginReceive 콜백에서 데이터를 복사하기 전에 복사합니다. 내가 얼마나 많은 물음에 EndReceive 반환 값을 알고 있기 때문에 t 데이터를 지우십시오. 버퍼가 8kb로 설정되어 있으므로 최대 8KB의 데이터를 복사 할 수 있습니다. 리소스를 죽이지 않아야합니다.

내 목표는 최대 400/500 접속을 얻는 것입니다. 그렇게 많은 것은 아니지만 서버 (기계)는 LVM + Linux Software Raid Mirror 및 clamav를 사용한 바이러스 백신 검사에서 자체 파일 시스템 (C# 및 이후 C에서 퓨즈를 사용하여 개발 됨)을 통해 파일을 처리합니다. 소프트웨어는 가능한 한 가볍습니다!

편집 : 2GB RAM과 64 비트를 사용하는 Intel Core 2 Duo 2.66+ GHz (3 MB L2 - FSB 1066 MHz)가 될 것입니다.

모노는 epoll (libevent) 또는 kqueue (freebsd)를 사용합니까? 그리고 공연을 극대화하려고 뭔가 특별한 것을해야합니까? 데이터 패킷을받는 리소스를 죽이지 않기 위해 더 많은 것을 할 수 있습니까?

+1

커뮤니티에 오신 것을 환영합니다. – JoshJordan

답변

2

는 나는 조금 늦게 알고,하지만 난 그냥이 질문에 ...

모노는 당신이 필요로하는 연결과 더 많은 수를 처리 할 수 ​​있습니다를 발견했다. 나는 1k 동시 연결 이상으로 xsp2 (Mono ASP.NET 독립 실행 형 서버)를 정기적으로 테스트합니다. 높은로드 상황이 될 경우 ThreadPool에 적합한 스레드 수를 찾을 때까지 MONO_THREADS_PER_CPU를 설정하여 약간 재생해야합니다 .

리눅스에서 모노는 항상 epoll을 사용합니다 (항상 요즘입니다).

+0

답변은 절대로 늦지 않았습니다. :) 정말 고마워요! –

+0

epoll_ctl은 언제 사용합니까?mono의 전체 코드베이스를 통해 grep되었습니다. mono.posix 코드 인 –

+1

@AndriusBentkus의 코드에만 정의되어 있으므로 클래스 라이브러리가 아닌 런타임에 있습니다. https://github.com/mono/ 모노/블롭/마스터/모노/메타 데이터/tpool-epoll.c – Gonzalo

1

모노에 대한 하나의 기능의 성능에 대해 구체적으로 말할 수는 없지만 일반적으로 모노는 요즘 매우 잘 작동합니다. 4-500 연결은 당신이 말한대로,별로 많지는 않습니다. 그래서 당신이 어떤 문제가 있을지 의심 스럽습니다.

이런 종류의 테스트를 설정하는 것은 그리 어렵지 않습니다. 나는 그것이 아마도 당신이 당신의 상황에 대해 결정적인 대답을 얻을 수있는 유일한 방법이라고 생각합니다.

+1

제안 해 주셔서 감사합니다. 데이터를 전송하는 동안 연결 세트를 설정할 수있는 간단한 스트레스 소프트웨어를 작성 했으므로 간단합니다. 3000 개의 동시 연결이있는 Windows에서 내 서버를 테스트하면 내 서버가 약 250 개의 연결을 처리하지만 클라이언트 컴퓨터 (스트레스 소프트웨어를 실행하는 컴퓨터)에 의존한다고 생각합니다. 1 기가비트의 centrino 2ghz가 1GB의 메모리 (= it 시간에 하나의 스레드 만 실행할 수 있음). 몇 가지 수정해야하지만 오늘 오후에 나는이 물건을 리눅스 테스트 머신에서 시험해 볼 것입니다! –