구매할 메모리 양을 어떻게 추정합니까?


10

Windows 2008 R2에서 실행되는 사용자 지정 서버 응용 프로그램이 있습니다. 많은 사용자 지정 터미널을 지원하는 .Net으로 작성된 자체 개발 Windows 서비스입니다. 라이브 서버와 비슷한 사양의 테스트 시스템이 있고 실제 시스템의 합리적인 근사값을 생성하는 데 사용할 수있는 클라이언트 시뮬레이터 세트가 있습니다. 12,000 개를 지원할 수 있어야하며 현재 서버에 메모리가 부족합니다 (페이징이 지붕을 통과 함).

내 계획은 시뮬레이터 100 개만 시작하고 메모리 사용량을 측정 한 다음 100 개 이상의 측정 메모리를 다시 시작하고 페이징이 시작될 때까지 반복합니다 (실제로 3 개 이상의 데이터 포인트가 필요합니다). 100 개의 시뮬레이터에 필요한 추가 메모리 양과 필요한 메모리 양을 투영 할 수 있습니다. 서버가 취할 2Tb ($ 150,000 상당)의 전체 구매를 피하기 위해 대략 +/- 30Gb 만 필요합니다. 내 질문은 이것이 합리적인 방법인지, 그렇다면 실제로 사용되는 메모리 양을 제공하기 위해 어떤 성능 카운터를 모니터링 할 것입니까?

나는 특히 Working Set, Private Bytes, Committed, Shared, Virtual과 다른 모든 메모리 용어의 차이점으로 인해 혼란에 빠진 메모리에 대해 이야기하고 있습니다. CPU, IO 및 네트워킹을 스스로 모니터링 할 수 있다고 생각합니다. 내가 주목 한 또 다른 점은 .Net Cache가 사용 가능한 항목에 따라 메모리 사용량을 조정하여 추세를 파악하기 어렵다는 것입니다.


나는 2 개의 데이터 포인트를 기반으로 메모리 사용량을 투영하는 것에 정말로 주의를 기울였습니다. 메모리 사용량 (및 그 문제에 대한 I / O)이 선형으로 확장 될 것이라는 심각한 의문이 생길 것입니다. 그럴 수도 있지만 큰 숫자로 이동할 때 비선형으로 향하는 경향이 있습니다. 성능이 문제가 될 때까지 (페이징, I / O 채도 등) 소규모에서 대규모로 진행하는 여러 데이터 포인트로 테스트하고 프로젝트를 진행했습니다. 기계를 점진적으로 업그레이드하고 더 큰 고객 번호로 시뮬레이션을 계속할 수 있다면 곡선 모양에 대한 느낌이들 때까지 그렇게 할 것입니다.
Evan Anderson

또한 이것이 무엇인지 조금 더 잘 이해할 필요가 있습니다. 웹인가요? aspx? PHP? 집에서 만든 것? 배치 작업? asp.net의 동작은 상자에서 실행되는 많은 exe와 다릅니다. 시스템이 사용자 당 사용하는 것에 대한 기본 아이디어가 필요합니다. 그림-그리고 오래된 봉투. 이러한 수치를 얻는 방법은 시스템 작동 방식에 따라 다릅니다.
이안 머피

@Evan. 항상 두 개 이상의 데이터 포인트를 사용하려고했습니다.
마틴 브라운

@Ian : "시스템이 사용자 당 사용하는 것에 대한 몇 가지 기본 아이디어"는 실제로 내가 찾으려고하는 것입니다. 이것을 알고 있다면 질문 할 필요가 없습니다. 다른 요점을 다루기 위해 질문을 업데이트했습니다.
Martin Brown

답변:


8

솔직히? 나는 하지 않습니다 .
실제 워크로드를 볼 수있는 서버를 지정할 때 합리적으로 감당할 수있는만큼 많은 RAM을 사용합니다 (시스템은 CPU 또는 디스크 제한보다 RAM 제약이있을 가능성이 높습니다). 버스).

당신은 당신이 제안하는 것 같은 응용 프로그램이 기본 부하 테스트를 사용할 수 있습니다 얼마나 많은 RAM 파악하려면 좋은 시작이지만, 당신이 이미있는 경우 생산에이 시스템을 (그것은 당신처럼 소리) 및 생산 시스템이 스와핑 당신의 작업이 쉬워집니다 : 사용중인 스왑 공간을 파악 하십시오 -> 최소 2 배의 RAM을 추가 하십시오 (시스템의 DIMM 크기 제약 조건에 맞게 반올림).

대략적인 숫자를 얻고 외삽을하기 위해 부하 테스트를 수행하는 경우 몇 가지 사항을 고려해야합니다.

  1. 메모리 곡선은 아마도 두 개의 별개의 세그먼트가 될 것입니다
    (프레임 워크 / 공유 라이브러리가 캐시 될 때 초기 급격한 증가, 각 새로운 앱의 공유 할 수없는 코드가 메모리에 저장 될 때 약간 덜 가파른 곡선)

  2. 디스크 및 공유 라이브러리 캐싱 및 OS에는 여전히 사용 가능한 RAM이 필요합니다.
    (이것은 앱이 필요로하는 것에 적어도 몇 기가 있어야합니다)

  3. 모든 소프트웨어는 메모리를 누수 (적어도 모든 실제 소프트웨어는 수행)하므로 테스트에서이를 확인하고 누수를 처리 할 공간이 있는지 확인하십시오.

  4. 서버 수명 동안 부하가 증가 할 수 있습니다. 그에 따라 계획하십시오.
    (용량 계획 번호가 충분하지 않으면 오늘의 작업량을 두 배로 늘리고 처리 계획을 세우십시오).

  5. 현재 너무 많은 RAM을 구입하는 것이 내일 환경이 떨어지는 것보다 저렴합니다.

    • 첫 번째 추론 : 필요한 것보다 약간 큰 서버를 구입하면 회사를 계속 운영하는 선임 관리자입니다. 당신은 크게 무시되고 감사하지 않을 것입니다.
    • 두 번째 추론 : 기계의 크기가 작고 문제가있는 경우 500 %의 성장을 기대할 수없는 무능한 부푼이며 모든 사람들이 당신을 미워합니다.

나는 추론을 승인한다.
mfinni


고마워 우리는이 시스템을 실제로 운영하고 있지만 현재는 아주 작은 시험을 지원하고있어 좋은 평가를받을 수 없습니다.
Martin Brown

0

고마워, 업데이트는 적어도 모든 사람에게 단서를 제공합니다. 2Tb의 메모리를 고려한다는 것은 일반적인 설정과 다른 야구장에서 놀고 있다는 것을 의미합니다. 큰 시스템. 얼마나 많은 열이 방출 될지 생각하는 것을 싫어합니다.

내부 서버 프로세스와 메모리 부족 (페이징을 시작하는 수준을 말하지 않음)을 감안할 때 서버 프로세스가 더 많은 양의 메모리를 사용하기 전에 가능성을 제거하고 싶습니다. 더욱이. 이 문제가 발생하면 수행 한 작업에 아무런 영향을 미치지 않으며 어느 시점에서 시스템이 중지됩니다.

나는 무슨 일이 일어나고 있는지 ... 창과 함께 제공되는 것에 대한 기본적인 개요 이상을 제공하는 데 사용할 수있는 일반적인 도구를 모른다. 서비스 프로세스 자체는 블랙 박스이며 개발자 팀은 모니터링 도구를 제공해야합니다.

봉투 계산의 빠른 뒤로 :

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

이것은 일반적인 .net exe 작업 세트의 범위를 벗어나지 않습니다.

서비스에 여러 스레드가 있습니까? 그들이 각 연결에 대해 스레드를 시작하면 그들이 어떻게하는지 볼 가치가 있습니다. Microsoft의 ProcExp.exe를 사용하면 여러 스레드가 있고 해당 스레드가 무엇을 소비하는지 쉽게 확인할 수 있습니다. .net에 대해서는 모르지만 win32 카운터를 제공합니다.

페이징을 시작하기 전에 테스트를 수행 할 때 메모리 양과 연결 수를 표시 할 수 있습니까?

그렇다면 서버 프로세스에 메모리 누수 문제가 있는지 확인하는 방법은 무엇입니까? 각 세션이 연결될 때마다 더 많은 메모리를 축적하거나 메모리를 누적하여 여유 공간을 확보하지 못할 수 있습니다.

당신이 할 수있는 일은-페이징을 유발하지 않는 많은 세션을 선택하고 그 수의 연결을 시뮬레이션합니다. -몇 시간 동안 시뮬레이션을 실행하고 perfmon을 사용하여 기본 메모리 카운터를 봅니다. -간단히 연결하고 연결을 끊는 세션으로이 테스트를 반복하십시오.

서비스가 각 세션에서 점점 더 많은 메모리를 소비하는지 또는 열린 세션으로 인해 메모리 사용량이 증가하는지 확인하는 아이디어입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.