2013-07-21 4 views
1

저는 socket.io 기반 서버를 작성 중이므로 the pyramid of doom을 피하고 메모리를 적게 사용하려고합니다. 나는이 클라이언트를 작성했습니다 - http://jsfiddle.net/QUDXU/1/node client-cluster 1000으로 실행됩니다. 그래서 1000 개의 연결이 끊임없이 요청하고 있습니다.Node js는 피라미드의 운명과 메모리가 동시에 증가하지 않도록합니다.

서버 측에서 테스트 한 3 가지 솔루션을 시도했습니다. 내가 할 서버에서 사용하는 RAM의 측면에서 결과 후 한 시간 동안 실행 모든은 다음과 같습니다

  1. 간단한 콜백 - http://jsfiddle.net/DcWmJ/~112메가바이트
  2. Q 모듈 - http://jsfiddle.net/hhsja/1/-850메가바이트 및
  3. 비동기 모듈을 증가 - http://jsfiddle.net/SgemT/ - 1.2GB 이상 증가

서버와 클라이언트가 서로 다른 컴퓨터에 있습니다. (Softlayer 클라우드 인스턴스). 노드 0.10.12 및 Socket.io 0.9.16

왜 이런 일이 발생합니까? 어떻게하면 메모리를 낮게 유지하고 코드를 읽을 수있게 해주는 일종의 라이브러리를 사용할 수 있습니까?

답변

0

문제는 서버 하나가 아니라 클라이언트 스크립트에있는 것처럼 보입니다. 매 1000 초마다 서버에 메시지를 내보내는 프로세스를 실행했습니다. 나는 서버가 모든 요청을 해결하고 그 모든 메모리를 사용하여 매우 바쁜 것으로 생각한다. 나는 그들 각각은 다음과 같이 여러 번 연결하는 프로세서의 수에 비례 프로세스의 수를 산란, this 같은 클라이언트 측을 다시 썼다 :

client = io.connect(selectedEnvironment, { 'force new connection': true, 'reconnect': false }); 

공지 사항 여러 클라이언트를 연결할 수있는 '새 연결을 강제로'플래그 socket.io-client의 동일한 인스턴스를 사용합니다. 내 문제를 해결 한 부분은 요청이 실제로 어떻게 발생했는지입니다. 모든 클라이언트는 1 초가 지나면 이전 요청에 대한 응답을받지 못하고 다른 요청을합니다. 1000 개의 클라이언트를 연결하면 ~ 100MB RSS를 사용하는 서버가 생성됩니다. 나는 또한 매우 우아하고 Q 서버보다 이해하기 쉬운 서버 스크립트에서 async를 사용했다. 나쁜 부분은 내가 서버를 약 2 ~ 3 일 동안 실행했고 메모리는 250MB RSS로 상승했다는 것이다. 이것은, 나는 왜 그런지 모른다.

0

옵션 1. 클러스터 모듈을 사용하여 수시로 작업자를 수시로 종료 할 수 있습니다 (먼저 분리()하십시오). 마스터에서 process.memoryUsage(). rss> 130000000을 확인하고 130MB를 초과하면 작업자를 죽일 수 있습니다. 예 :

옵션 2. NodeJS는 메모리 사용 습관이 거의 ​​없으며 엄격한 정리 작업을 수행하지 않습니다. V8이 최대 메모리 제한에 도달하면 GC 호출이 더욱 공격적입니다. 따라서 node --max-stack-size <amount>을 실행하여 노드 프로세스가 차지할 수있는 최대 메모리를 줄일 수 있습니다. 임베디드 장치에서 노드를 실행할 때이 작업을 수행합니다 (종종 64MB 미만의 RAM을 사용할 수 있음).

옵션 3 메모리를 낮게 유지하려면 가능하면 약한 참조를 사용하십시오 (장기 실행 호출을 제외한 모든 곳에서) https://github.com/TooTallNate/node-weak. 이렇게하면 개체가 더 빨리 가비지 수집됩니다. 모든 것이 작동하는지 확인하기위한 광범위한 테스트가 필요합니다. GL 이걸 사용하는 경우 : https://github.com/TooTallNate/node-weak

+0

첫 번째 옵션은 도움이되지 않습니다. 나는 서버의 메모리 사용에 대해서만 염려한다. 클라이언트는 서버를 테스트하기 위해 생성됩니다. 두 번째 옵션에 대해서, 프로세스가 실제로 더 많은 메모리를 필요로한다면 --max-stack-size로 설정하면 어떨까요? –

+0

프로세스가 더 많은 메모리를 필요로한다면, 프로세스가 그것을 소비하게하십시오. 한계에 도달하면 메모리가 결국 해제됩니다. – randunel

+0

약한 참조가 작동하는 방법을 알려주십시오. – randunel