2013-04-05 18 views
9

Ai đó có thể xin vui lòng cho tôi biết lý do tại sao những điều sau đây có thể xảy ra:lạ chậm xuống của allocs C++

Tôi có 2 máy tính:

  1. comp làm việc của tôi
  2. server

tôi duy trì Chương trình C++ (msvc 2005 C++ được biên dịch) hoạt động quá chậm chỉ trên máy chủ, nhưng không phải trên comp của tôi.

Tôi đã tiến hành đo (GetThreadTimes và vân vân) và chắc chắn có thể nói rằng địa điểm hẹp - cấp phát bộ nhớ (mới/malloc). Và nó chỉ xảy ra trên máy chủ!

Tôi có thể tuyên bố rằng nó xảy ra do phân mảnh bộ nhớ vì Ví dụ máy chủ lần đầu của chương trình hoạt động tốt, thời gian mất bắt đầu trên allocs chỉ sau khi nạp lại dữ liệu vào bộ nhớ (1-1.5 triệu allocs/giải phóng).

Tôi sẽ không ngạc nhiên nếu tôi thấy cùng một hành vi do bộ nhớ phân mảnh trên cả hai máy tính (máy tính và máy chủ của tôi) nhưng những gì tôi thấy là: 1). trên phân bổ comp của tôi mất ~ 5% thời gian (không chính xác nhưng đôi khi như thế) 2). trên máy chủ, các allocs này mất ~ 75% thời gian

điều này có thể xảy ra như thế nào? Điều gì có thể làm chậm phân bổ C++ trên máy tính Server, trong khi đó là OK cho máy trạm của tôi. Nơi nào có thể khác biệt? Có lẽ một cái gì đó của nó được kết nối với các chức năng quản lý bộ nhớ cấp hệ điều hành? vì trình quản lý cấp C++ giống nhau trong cả hai trường hợp.

Đây là cả hai cấu hình:

1). Máy tính của tôi (nơi allocs mất ~ 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). Máy chủ (trong đó allocs chiếm ~ 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 

Sẽ biết ơn vì đã làm rõ vấn đề này.

+0

Bạn đang sử dụng cùng một tập dữ liệu trên cả hai máy? – nneonneo

+0

không, nhưng có thể so sánh. comp của tôi có ~ 260 000 mục tại các công trình lưu loát, máy chủ comp gặp khó khăn tại ~ 350 000 và nhiều mặt hàng thậm chí nó bắt đầu làm việc chăm chỉ ngay cả khi tải 100 000 000 mục. –

Trả lời

4

Sự cố có thể là các chức năng bộ nhớ chỉ sử dụng một mutex để khóa bộ nhớ để cấp phát và giải phóng.

+2

MSVC++ 2005 không phải là phiên bản mới nhất, cũng không phải là Server 2003. Máy tính Windows 7 có Heap phân mảnh thấp được bật theo mặc định. Điều này do đó là một câu trả lời đáng tin cậy. Tôi hy vọng các phiên bản mới hơn sẽ hoạt động tốt hơn nhiều với các máy lõi 4x4. Để giải quyết sự cố này, hãy thử một trình phân bổ khác, ví dụ: [jemalloc] (http://www.canonware.com/jemalloc) – MSalters

+3

Thú vị. Và trích dẫn từ chuỗi này (http://stackoverflow.com/questions/4859263/can-multithreading-speed-up-memory-allocation)- "... Chức năng heap OS sẽ hoạt động khá tốt nếu heap phân mảnh thấp được bật , theo mặc định, Windows Vista (trên Windows XP có thể được ứng dụng thực hiện bằng một cuộc gọi đơn giản tới HeapSetInformation()).Và với LFH được kích hoạt, hiệu năng của heap Windows có thể so sánh với các trình phân bổ khác nhanh nhất có sẵn " – SChepurin

+0

cảm ơn, sẽ xem xét jemalloc, có lẽ nó sẽ giúp ích, nhưng không chắc chắn rằng nó sẽ được chấp nhận bởi người đứng đầu của tôi :) –