2015-01-04 2 views
1

액터 모델 및 zeromq를 사용하는 응용 프로그램을 확장하는 데 문제가 있습니다. 간단히 말해서 : 소켓을 통해 통신하는 수천 개의 스레드를 생성하려고합니다. Erlang 형식의 메시지 전달과 관련이있는 것과 유사합니다. 멀티 코어/퍼포먼스의 이유로이 작업을 수행하지는 않지만 이런 식으로 프레임을 작성하면 매우 깨끗한 코드를 얻을 수 있기 때문입니다.ZeroMQ 및 액터 모델

zmq 개발자가 달성하고자하는 것처럼 철학적 관점에서 보았습니다. http://zeromq.org/whitepapers:multithreading-magic

그러나 실제적인 제한이있는 것처럼 보입니다. 1024 inproc 소켓에서 "ZMQError : 너무 많은 열린 파일"오류가 발생하기 시작합니다. TCP는 나에게 전형적인 "어설 션 실패 : fds.size() < = FD_SETSIZE"충돌을 제공합니다.

Inproc 소켓에이 제한이있는 이유는 무엇입니까? 작동 시키려면 항목을 그룹화하여 소켓을 공유해야했습니다. 더 좋은 방법이 있습니까?

zmq는 이러한 종류의 작업에 잘못된 도구입니까? 즉, 액터 메시지 전달 라이브러리보다 네트워크 라이브러리가 더 많습니다.

+1

ulimit을 통해 fst limut의 수를 늘려보십시오. –

+0

** inproc ** 제한은이 자원 설명자 테이블의 OS/커널 크기 조정에서 비롯됩니다. ** ZeroMQ **는 액터 기반 시스템에서 가치있는 훌륭한 프레임 워크입니다. 커널 조정과 ZMQ-IO- 쓰레드 내부를 한 번 더 자세히 살펴볼 필요가 있습니다. – user3666197

+0

불행히도, Windows에서 실행되어야합니다 :/제한을 변경할 수 있기를 바랍니다. 저는 ZeroMQ를 정말 좋아합니다. 특히 복잡한 응용 프로그램 동작을 상태를 공유하지 않는 구성 요소로 분리 할 수있게 해주는 방식입니다. 따라서이 제한은 다소 성가신 일입니다. – janto

답변

0

ZMQ는 inproc 연결의 "자원 단위"로 파일 설명자를 사용합니다. OS가 설정 한 파일 설명자에는 제한이 있습니다. 성능에 미치는 영향에 대해서는 알지 못하지만 수정할 수 있어야합니다 (빠른 Google 검색을 사용하여 Windows에 대한 몇 가지 잠재적 인 방법을 찾았습니다).

같은 제한이없는 Windows 기본 코드가 아닌 새 파일을 여는 시스템간에 이식 가능한 C 코드를 사용하는 ZMQ 라이브러리와 관련이있는 것으로 보입니다.