2013-04-05 12 views
9

Czy ktoś mógłby mi powiedzieć, dlaczego następujące rzeczy mogą się zdarzyć:dziwne spowolnienie C++ ALLOCS

Mam 2 komputery:

  1. mój komp roboczego
  2. Server

utrzymuję C++ program (msvc 2005 C++ compiled), który działa zbyt wolno tylko na serwerze, , ale nie na moim komputerze.

Przeprowadziłem pomiary (GetThreadTimes i tak dalej) i mogę zdecydowanie powiedzieć, że wąskie miejsce - jego przydział pamięci (nowy/malloc). I dzieje się to tylko na serwerze!

mogę twierdzić, że dzieje się z powodu fragmentacji pamięci z powodu 1st instancji serwera w czasie programu działa dobrze, jego czas rozpoczęcia tracąc na ALLOCS dopiero po danych załaduj ponownie do pamięci (1-1,5 mln ALLOCS/zwalnia).

byłby tak będę zaskoczony, jeśli widzę to samo zachowanie z powodu fragmentacji pamięci na obu komputerach (mój komp i serwer) ale co ja widzę to: 1). na moje przydziały kompilacji zajmuje ~ 5% czasu (nie dokładny, ale coś w tym stylu) 2). na serwerze te alokacje trwają ~ 75% czasu

jak to może się stać? Co może spowolnić przydziały C++ na komputerze serwera, tymczasem jego OK dla mojej stacji roboczej. Gdzie może być różnica? Prawdopodobnie jest to coś związanego z funkcjami zarządzania pamięcią na poziomie OS? , ponieważ menedżer poziomu C++ jest taki sam w obu przypadkach.

Oto dwie konfiguracje:

1). Mój komputer (gdzie ALLOCS wziąć ~ 5%):

OS Name:     Microsoft Windows 7 Enterprise 
OS Version:    6.1.7600 N/A Build 7600 
OS Manufacturer:   Microsoft Corporation 
OS Configuration:   Member Workstation 
OS Build Type:    Multiprocessor Free 
Registered Owner:   Windows User 
Original Install Date:  16/09/2011, 19:37:43 
System Boot Time:   05/04/2013, 11:58:11 
System Model:    7304A58 
System Type:    x64-based PC 
Processor(s):    1 Processor(s) Installed. 
          [01]: Intel64 Family 6 Model 23 Stepping 10 GenuineIntel ~2642 Mhz 
Windows Directory:   C:\Windows 
System Directory:   C:\Windows\system32 
Boot Device:    \Device\HarddiskVolume2 
System Locale:    ru;Russian 
Input Locale:    en-us;English (United States) 
Total Physical Memory:  4,061 MB 
Available Physical Memory: 872 MB 
Virtual Memory: Max Size: 8,121 MB 
Virtual Memory: Available: 4,579 MB 
Virtual Memory: In Use: 3,542 MB 
Page File Location(s):  C:\pagefile.sys 

2). Serwer (gdzie alloki zajmują ~ 75%):

OS Name:     Microsoft(R) Windows(R) Server 2003, Enterprise Edition 
OS Version:    5.2.3790 Service Pack 2 Build 3790 
OS Manufacturer:   Microsoft Corporation 
OS Configuration:   Member Server 
OS Build Type:    Multiprocessor Free 
Original Install Date:  11/12/2008, 01:22:57 
System Up Time:   1 Days, 8 Hours, 35 Minutes, 52 Seconds 
System Manufacturer:  HP 
System Model:    ProLiant BL685c G5 
System Type:    X86-based PC 
Processor(s):    4 Processor(s) Installed. 
          [01]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz 
          [02]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz 
          [03]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz 
          [04]: x86 Family 16 Model 2 Stepping 3 AuthenticAMD ~2210 Mhz 
Windows Directory:   C:\WINNT 
System Directory:   C:\WINNT\system32 
Boot Device:    \Device\HarddiskVolume1 
Total Physical Memory:  65,534 MB 
Available Physical Memory: 61,284 MB 
Page File: Max Size:  97,696 MB 
Page File: Available:  93,445 MB 
Page File: In Use:   4,251 MB 
Page File Location(s):  C:\pagefile.sys 
          D:\pagefile1\pagefile.sys 
          D:\pagefile2\pagefile.sys 
          D:\pagefile3\pagefile.sys 
          D:\pagefile4\pagefile.sys 
          D:\pagefile5\pagefile.sys 
          D:\pagefile6\pagefile.sys 
          D:\pagefile7\pagefile.sys 

Będziemy wdzięczni za wyjaśnienie tej kwestii.

+0

Czy używasz tego samego zestawu danych na obu komputerach? – nneonneo

+0

nie, ale porównywalne. moje kompilacje mają ~ 260 000 pozycji w pracy płynnie, serwer comp przeżywa trudności w ~ 350 000 i więcej przedmiotów zaczyna nawet ciężko pracować nawet przy obciążeniu 1 100 000 przedmiotów. –

Odpowiedz

4

Problem może polegać na tym, że funkcje pamięci wykorzystują tylko jeden muteks do blokowania pamięci w celu przydzielania i zwalniania.

+2

MSVC++ 2005 nie jest dokładnie najnowszą wersją, ani Serwerem 2003. Komputer z systemem Windows 7 ma domyślnie włączoną stertę niskiej fragmentacji. Jest to zatem dość wiarygodna odpowiedź. Oczekuję, że nowsze wersje będą działać znacznie lepiej z maszynami z rdzeniem 4x4. Aby obejść ten problem, spróbuj użyć innego przydziału, np. [jemalloc] (http://www.canonware.com/jemalloc) – MSalters

+3

Interesujące. I cytując z tego wątku (http://stackoverflow.com/questions/4859263/can-multithreading-speed-up-memory-allocation)- "... Funkcje sterty OS będą działać raczej dobrze, jeśli sterty o niskiej fragmentacji są włączone , który jest domyślnie od czasu Windows Vista (w systemie Windows XP może być włączony przez aplikację za pomocą prostego wywołania funkcji HeapSetInformation()).A przy włączonym LFH wydajność stosu Windows jest porównywalna z najszybszymi dostępnymi innymi alokatorami " – SChepurin

+0

dzięki, rozważymy jemalloc, prawdopodobnie to pomoże, ale nie jestem pewien, czy zostanie on zaakceptowany przez mojego szefa :) –

Powiązane problemy