2010-02-20 2 views
4

Windows 2003 서버에 배포하는 소프트웨어를 구축했습니다. 이 소프트웨어는 지속적으로 서비스로 실행되며 Windows 중요도 상자에 나와있는 유일한 응용 프로그램입니다. 시간의 일부분은 인터넷에서 데이터를 가져 오는 것이고, 일부는 데이터에서 계산을하는 것입니다. 그것은 멀티 스레드입니다 - 나는 약 4-20 스레드의 스레드 풀을 사용합니다.최적의 CPU 사용률 임계 값

나는 모든 세부 사항을 설명하지는 않겠지 만, 풀에서 더 많은 스레드를 사용할 수있게되면 더 많은 동시 작업이 발생하고 CPU 사용이 증가한다고 말하면 충분합니다. (대역폭과 같은 다른 리소스에 대한 수요가 그렇듯이 나에게 관심이 없다. 나는 충분하다.)

내 질문은 이것이다. 나는 CPU를 최대한 활용하여 내 돈을 위해 최선을 다해야 하는가? ? 직관적으로, 나는 100 % CPU에서 실행하는 것이 타당하지 않다고 생각한다; 심지어 95 %의 CPU도 높은 것처럼 보입니다. OS가 할 일을 수행하는 데 많은 공간을주지는 않는 것처럼 말입니다. 나는 최고의 균형을 식별하는 올바른 방법을 모른다. 나는 측정하고 측정 할 수있을 것 같았고 아마도 최고 처리량이 90 % 또는 91 %의 CPU 평균 사용률에서 달성된다는 것을 알았지 만 ...

엄지 손가락의 좋은 규칙이 있는지 궁금합니다. 이것에 관해서??? 테스트에서 모든 종류의 워크로드가 고려 될 것이라고 가정하고 싶지는 않습니다. 차라리 조금은 안전하게 플레이 하겠지만 안전하지는 않습니다 (아니면 하드웨어가 부족합니다).

무엇이 좋습니다? Windows에서 멀티 스레드, 혼합로드 (일부 I/O, 일부 CPU) 응용 프로그램에 대한 스마트하고 성능 중심적인 활용 규칙은 무엇입니까?

답변

2

그래, 나는 100 % 그렇게 모든 시간을 실행중인 프로세스를보고 싶지 않을 것이다 그래서 탈곡한다 건의 할 것입니다. 나는 스파이크/임시 프로세스에 대한 사용률과 공간 사이의 균형을 유지하기 위해 항상 80 %를 목표로 삼았습니다.

과거에 사용한 접근법은 풀 크기를 천천히 늘리거나 (CPU 및 IO와 같은 다른 제약 조건 모두에서) 영향을 측정하는 것입니다. 갑자기 IO가 병목.

1

스레드에 우선 순위를 부여하면 운영 체제가 나머지 작업을 수행하고 작업을 수행하는 데 필요한주기를 단축합니다. Server 2003 (및 대부분의 서버 OS)은 이 매우에 매우 좋으므로 직접 시도하고 관리 할 필요가 없습니다.

+2

스레드는 보통 우선 순위를 주면 OS가 동일하게 작동합니다. 당신이 원하지 않는 것은 우선 순위를 부여하는 것입니다. –

3

중요성의 아무것도 없다는 가정하에 있지만 OS가 컴퓨터에서 실행 :

그리고 당신의 부하가 일정, 당신은 다른 모든 CPU의 낭비, 100 %의 CPU 사용률을 목표로한다. OS가 스레드를 처리하여 실제로 실행할 수 있음을 기억하십시오. 제대로 동작하는 프로그램으로 OS를 굶기는 것은 어렵습니다.

로드가 가변적인데 피크를 예상하는 경우 고려해야 할 사항은 정확히로드가 어떻게 달라질 것이며 얼마나 많은 CPU가 필요한지 잘 모르는 경우 CPU 사용률이 80 %라고 말하는 것이 좋습니다. 이 경우 정확한 숫자를 목표로 삼을 수 있습니다.

4

CPU 사용률이 나는 중요하지한다/집약적 인 워크로드 O를, 당신은 처리량 걱정, 그래서 사용해보십시오 hill climbing approach 기본적으로/주입 작업자 스레드 및 트랙 완료 진행 상황을 제거 프로그램하려고 ...

당신이 만약 스레드를 추가하면 다른 스레드를 추가하는 데 도움이됩니다. 당신이 실을 시도하면 아파요.

결국 안정화 될 것입니다.

.NET 기반 응용 프로그램 인 경우 힐 클라이밍이 .NET 4 스레드 풀에 추가되었습니다.

는 UPDATE : 당신이 원하는 경우

언덕 등반 처리량을 극대화 제어 이론 기반의 접근 방식, 당신은 시행 착오를 호출 할 수 있지만, 사운드 접근 방식입니다. 오버 헤드와 대기 시간이 매우 다양하기 때문에 일반적으로 여기에 따라야 할 좋은 '경험칙'이 없습니다. 일반화하기가 실제로 불가능합니다. CPU 사용이 아닌 처리량/스레드 완료율이 처리량 &에 있어야합니다.예를 들어, 거친 동기화 또는 세분화 된 동기화로 코어를 쉽게 쉽게 페치 할 수 있지만 실제로 처리량에는 차이가 없습니다.

.NET 4와 관련하여 Parallel.For 또는 Parallel.ForEach로 문제의 프레임을 다시 작성할 수 있다면 스레드 풀은 처리량을 최대화하기 위해 스레드 수를 조정하므로 이에 대해 걱정할 필요가 없습니다.

-Rick

+0

나는 암벽 등반 접근법을 호소하지만, 나는 엄밀히 말하면, 재판과 잘못이 아니라 엄지 법칙을 찾고있다. 내가 필요하다면 내가 할 수 있다고 말했다. – kvista

+0

@ user277617 : 그는 .NET 4 스레드 풀이 자동으로 시행 착오를한다고 말했습니다. 당신이 있으면 아주 재미 있어요. –

0

또한 목표 CPU 사용률에 대한 일반적인 원칙으로 80 %를 사용했습니다. 다른 사람들이 언급했듯이, 이것은 산발적 인 스파이크에 대한 여지를 남겨두고 CPU에서의 쓰레기를 피하는 데 도움이 될 것입니다. 여기

이 문제에 웹 로직 승무원에서 조금 (오래된하지만 여전히 관련) 조언입니다 : http://docs.oracle.com/cd/E13222_01/wls/docs92/perform/basics.html#wp1132942

당신은 당신의 부하가 매우 심지어 당신이 좀 더 그 대상을 밀어 수있는 예측하지만,하지 않는 느낌이 경우 사용자 기반은 예외적으로주기적인 느린 응답에 매우 견디며 프로젝트 예산은 엄청나 다. 위험한 이동을 시도하면서 시스템에 더 많은 리소스를 추가하는 것을 권장합니다 (CPU 추가, 코어가있는 CPU 사용 등). 기존 플랫폼에서 10 %의 CPU 사용률을 추가로 압박하십시오.

관련 문제