2013-04-05 3 views
9

Может кто-то пожалуйста, скажите мне, почему следующие вещи могут случиться:странное замедление между выделенными C++

У меня есть 2 компьютера:

  1. мой рабочий комп
  2. Сервер

Я поддерживаю Программа C++ (msvc 2005 C++ скомпилирована), которая работает слишком медленно только на сервере, , но не на моем компьютере.

Я провел измерения (GetThreadTimes и т. Д.) и мог определенно сказать, что узкое место - его распределение памяти (new/malloc). И это происходит только на сервере!

я мог бы утверждать, что это происходит из-за фрагментации памяти из-за 1-го времени экземпляра сервера программы работает отлично, его начало терять время на только после того, как между выделенными данными перезагрузки снова в память (1-1.5 млн ALLOCS/высвобождает).

я не был бы так удивлен, если я вижу такое же поведение, благодаря памяти фрагментации на обоих компьютерах (мой комп и сервер) , но то, что я вижу: 1). на мои ассигнования в команде занимает ~ 5% времени (не точно, а что-то вроде этого) 2). на сервере эти распределения занимают ~ 75% времени

как это могло случиться? Что может замедлить выделение C++ на сервере сервера, пока что его ОК для моей рабочей станции. Где может быть разница? Возможно, что-то связано с функциями управления памятью на уровне OS? , потому что менеджер уровня C++ одинаковый в обоих случаях.

Здесь обе конфигурации:

1). Мой компьютер (где ассигнования занимают ~ 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). Сервер (где allocs принимают ~ 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 

Будет благодарен за разъяснение этой проблемы.

+0

Используете ли вы один и тот же набор данных на обеих машинах? – nneonneo

+0

нет, но сопоставив. мой comp имеет ~ 260 000 предметов на работах плавно, сервер comp испытывает трудности на ~ 350 000 и больше предметов, даже начинает работать даже во время загрузки 1 100 000 предметов. –

ответ

4

Проблема может заключаться в том, что функции памяти используют только один мьютекс для блокировки памяти для выделения и освобождения.

+2

MSVC++ 2005 - это не совсем новая версия, и не является сервером 2003. У машины Windows 7 по умолчанию включена куча низкой фрагментации. Поэтому это вполне правдоподобный ответ. Я бы ожидал, что более новые версии будут работать намного лучше с 4x4 основными машинами. В качестве обходного пути попробуйте другой распределитель, такой как, например, [jemalloc] (http://www.canonware.com/jemalloc) – MSalters

+3

Интересно. И цитирование из этого потока (http://stackoverflow.com/questions/4859263/can-multithreading-speed-up-memory-allocation)- «... Функции кучи ОС будут выполняться достаточно хорошо, если кучка с низкой фрагментацией включена , который он по умолчанию с Windows Vista (в Windows XP он может быть включен приложением с простым вызовом HeapSetInformation()).И с включенным LFH производительность кучи Windows сопоставима с самыми быстрыми доступными другими распределителями » – SChepurin

+0

спасибо, рассмотрит jemalloc, возможно, это поможет, но не уверен, что он будет принят моим начальником :) –