2011-11-09 3 views
3

우리 시스템에는 개인 및 공용 큐의 여러 MSMQ 큐가 있습니다. 때로는 대기열에서 읽는 Windows 서비스가 중단되므로 메시지가 해당 대기열에 작성됩니다. 대기열이 특정 크기 (아마도 60,000 개의 메시지)가되면 해당 서버의 모든 대기열이 작동을 멈추고 불충분 한 자원에 대한 오류가 발생합니다.MSMQ에 저장할 수있는 메시지 수를 늘리는 방법

제 질문은 큐가 실제로 백그라운드에서 어떻게 작동하는지, 메시지를 RAM 또는 하드 드라이브에 저장하는 것입니까? 서버에서 RAM이 부족하면 리소스가 부족하여 충돌이 발생합니까? 하드 드라이브에 할당 된 공간을 사용하는 경우 허용되는 크기를 늘릴 수있는 방법이 있습니까? RAM을 사용하는 경우 서버에 RAM을 추가하면 허용되는 크기가 커질 수 있습니까?

서비스가 중단 될 때 서비스를 수정하는 동안 해당 대기열에 100K 또는 200K 메시지를 저장할 수 있는지 확인해야합니다. 메시지가 우리 업무에 중요하기 때문입니다.

+0

60,000 개의 메시지는 간단한 양이기 때문에 시작하기 전에 서버의 커널 메모리가 이미 부족해야합니다. RAM을 추가하면 커널 메모리를 최대화 할 수있는 충분한 RAM을 갖춘 최신 머신이되므로 도움이되지 않습니다. 대신 커널 메모리 돼지를 식별하고 제거해야합니다. 잘 구성된 시스템은 수백만 개의 메시지를 처리 ​​할 수 ​​있습니다. –

답변

2

여기에 귀하의 질문에 대한 답변을 제공하는 MSDN 문서가 있습니다 (아래의 John이 지적한 바와 같이 Windows Server 2000에만 적용되므로 대부분의 사람들이 무시해야합니다) : Resource management in MSMQ applications. 구체적으로는

MSMQ 1.0 및 MSMQ 2.0의 경우 한 컴퓨터에 저장할 수있는 메시지의 합계 크기는 컴퓨터의 RAM 크기 나 하드 디스크의 크기에 국한되지 않고 양 운영 체제에서 MSMQ 서비스에 제공되는 가상 주소 공간 (이 제한은 MSMQ 3.0에서 해제되었습니다). x86 시스템의 각 프로세스에는 가상 4GB의 주소 지정 가능 메모리가 할당됩니다. 2GB는 커널 모드에서 사용하도록 예약되었으며 사용자 모드에서는 2GB입니다. MSMQ 대기열 관리자는 사용자 모드에서 작동하므로 주소 지정이 가능한 2GB의 가상 주소 공간이 있습니다. 각 메시지의 데이터는 RAM에 저장되며 시스템의 페이징 파일 또는 메모리 매핑 된 파일에 의해 백업됩니다. MSMQ는 메모리 매핑 파일을 사용하여 고속 및 복구 가능한 메시지를 모두 저장합니다. 2GB의 주소 지정 가능한 메모리로 제한되므로 디스크에 2GB의 메시지 만 저장할 수 있습니다. MSMQ 코드와 내부 데이터 구조에 사용되는 메모리와 메시지 파일을 디스크에 저장하기위한 파일 할당을 고려할 때 디스크에 저장할 수있는 메시지의 크기는 1.4GB에서 1.6GB 사이가됩니다.

참고 MSMQ 서비스에서 3GB 튜닝을 활성화하면 1.6GB의이 제한을 약 2.6GB로 높일 수 있습니다. 3GB 튜닝을 활성화하는 방법에 대한 자세한 내용은 Q171793을 참조하십시오.

편집 : 튜닝 링크가 끊어진 것 같습니다. 나는 그것이 here를 가리켜 야한다고 믿습니다.

MSMQ의 이후 버전에 대해서는 John이 a blog post의 문제에 대해 설명합니다. 메시지

이 하나의

최대 밖으로 작동하는 간단하지 않습니다.My Insufficient Resources 게시물에서 우리는 각 메시지가 인덱싱을 위해 75 바이트의 커널 메모리를 필요로한다는 것을 알고 있습니다. 예를 들어 2 백만 개의 메시지에는 약 150MB가 필요합니다. 따라서 RAM을 추가하는 것만으로도 충분할 것으로 보입니다. 하지만 32 비트 및 64 비트 메모리 아키텍처를 비교해 본 결과, 64 비트 플랫폼으로 이동해야만 투자를 활용할 수 있습니다. 32 비트 컴퓨터는 450MB의 페이지 된 풀 메모리 장착 된 RAM의 양에 상관없이

그러나 10 억 개의 MSMQ 메시지를 수용하는 데 필요한 페이지 된 풀 메모리를 생성하는 데 필요한 RAM 양을 계산하려면 디자인 사양을 검토해야합니다.

+0

링크가 끊어졌습니다. – Justin

+0

튜닝에 대한 링크가 손상된 것 같습니다. 불행히도이 기사에서 직접 언급 한 내용입니다./그 문제에 관해 훨씬 더 자세하게 다른 유용한 문서를 찾았습니다 : http://blogs.msdn.com/b/johnbreakwell/archive/2006/09/18/insufficient-resources-run -away-run-away.aspx – Rohland

+2

그 블로그 기사보다 더 낫습니다. "MSMQ의 한계는 무엇입니까?"매번 매달리기가 있다면 ... " http://blogs.msdn.com/b/johnbreakwell/ archive/2008/02/29/what-are-msmq-s-limits-if-i-had-a-fading-for-every-time.aspx –

0

심층적 인 대답은 확실하지 않지만 표면적 수준에서는 트랜잭션 캐시가 메시지를 디스크에 저장하는 반면 비 트랜잭션 큐는 메시지를 메모리에 저장합니다. 요한은 아래의 상태로

UPDATE

, 모든 메시지는 내구성 또는 비 내구성 큐의 사용 여부 디스크에 개최됩니다.

+1

올바르지 않습니다. 모든 메시지는 디스크에 기록됩니다. 트랜잭션 및 복구 가능한 메시지는 다시 부팅 한 후에 복구 할 수있는 방식으로 디스크에 기록됩니다. Express 메시지는 재부팅 후에 없어집니다. http://blogs.msdn.com/b/johnbreakwell/archive/2008/04/04/why-are-my-express-messages-being-written-to-disk.aspx –

+1

감사합니다. 비 직관적 인 것처럼 보일 지 모르겠지만 제품에 대한 귀하의 배경을 분명히 말씀드립니다. –

+1

네, 그렇습니다. 원래 건축가 중 한 명이 저를 고쳐주기까지 몇 년 동안 사람들에게 잘못된 것을 말하고있었습니다. –

관련 문제