2009-02-26 76 views
2

好的,所以我有一個非常大的多線程非託管C++應用程序(服務器)在Windows 2003服務器上運行。它爲20-50個併發用戶提供會話,執行各種業務邏輯......有時,由於用戶在客戶端中打開大量窗口,因此可能會使用大量內存,例如對象/會話緩存(每個窗口都有一個單獨的服務器會話)非託管的VC++應用程序在Windows服務器上的內存消耗

我們經常看到消耗超過5-600 MB的物理內存和5-600 MB的虛擬內存。一旦達到這一點,我們似乎開始'出的內存'錯誤

現在我知道Windows會在感覺到需要釋放物理內存時啓動頁面錯誤,並且win32應用程序通常只能分配高達4GB的內存,實際上只有2GB可用於'user-m'應用程序的實際使用ode'的地址空間,甚至更少的後其他庫加載後...我不確定'用戶模式'的內存使用情況是什麼在任務管理器上報告...

因此無論如何我的真正的問題是:

如何找出我的應用程序有多少用戶模式內存以及在任何給定時間使用了多少(最好來自應用程序之外,即某些窗口管理工具)?

查看Process Explorer和網站後,它看起來像'虛擬大小'值是應用程序有權訪問多少內存的值。

+0

啊,我忘了補充,我們有2 GB內存的服務器,這在VMware虛擬機託管之一。 – uzbones 2009-02-26 02:43:48

回答

5

聽起來像是Process Explorer, a free utility from Microsoft SysInternals情況:

alt text http://i.technet.microsoft.com/bb896653.ProcessExplorer(en-us,MSDN.10).jpg

說明:

沒有想過哪個程序有 特定文件或目錄打開?現在你可以找到 。 Process Explorer 向您顯示有關哪些 句柄和DLL進程已打開 或加載的信息。

Process Explorer顯示屏包含兩個子窗口的 。頂部窗口 總是顯示當前 活動的進程,包括姓名及其所屬賬戶 的列表,而在底部 窗口中顯示的 信息取決於 的Process Explorer所處的模式:如果是在 處理模式中,您將看到在頂部 窗口中所選進程已打開的句柄 ;如果Process Explorer 處於DLL模式,您將看到進程 已加載的DLL和 內存映射文件。 Process Explorer也有 一個強大的搜索功能,將 快速顯示哪些進程有 打開特定句柄或加載DLL 。

過程 的獨特功能瀏覽器使其可用於跟蹤 下DLL版本問題或處理 泄漏,並提供洞察 方式Windows和應用程序的工作。


如果您在終端服務器的特定信息方面尋找更多的信息,我一直在關注被釋放工具的測試,我相信會滿足您的需要一個程序員的博客完美。這是一個改進的TSAdmin。他稱之爲TSAdminEx。

請參閱下面的截圖和click here to learn more about it and to get the beta。它是免費軟件,順便說一句。

alt text

+0

進程資源管理器和任務管理器都擅長顯示當前正在使用多少內存,但它們能顯示應用程序可能使用多少內存? – uzbones 2009-02-26 11:38:19

0

您寫道:

當你談論一個 的Win32應用程序可以有多少內存訪問我 沒有看到爲他們專門 稱之爲「用戶模式」記憶選項或至少我 不知道它真的是什麼列。

Have a look at this article(由Process Explorer的創建者Mark Russinovich博士撰寫)。

爲了能夠有效地管理您的Windows系統,您需要了解Windows如何管理物理資源(如CPU和內存)以及邏輯資源(如虛擬內存,句柄和窗口管理器對象)。瞭解這些資源的限制以及如何跟蹤其使用情況,可以將資源使用情況歸因於使用這些資源的應用程序,有效調整特定工作負載的系統大小並識別泄漏資源的應用程序。

3

我知道你最好從應用程序之外詢問,但我一直在搜索如何從我自己的程序中找到這些信息,並偶然發現了你的帖子。所以,這將有利於那些想從獲得這些信息的人在其程序中。

非託管C++

#include <windows.h> 
#include <stdio.h> 
#include <psapi.h> 

void PrintMemoryInfo(DWORD processID) 
{ 
    HANDLE hProcess; 
    PROCESS_MEMORY_COUNTERS pmc; 

    // Print the process identifier. 

    printf("\nProcess ID: %u\n", processID); 

    // Print information about the memory usage of the process. 

    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | 
          PROCESS_VM_READ, 
          FALSE, 
          processID); 
    if (NULL == hProcess) 
     return; 

    if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) 
    { 
     printf("\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount); 
     printf("\tYour app's PEAK MEMORY CONSUMPTION: 0x%08X\n", 
        pmc.PeakWorkingSetSize); 
     printf("\tYour app's CURRENT MEMORY CONSUMPTION: 0x%08X\n", pmc.WorkingSetSize); 
     printf("\tQuotaPeakPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaPeakPagedPoolUsage); 
     printf("\tQuotaPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaPagedPoolUsage); 
     printf("\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaPeakNonPagedPoolUsage); 
     printf("\tQuotaNonPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaNonPagedPoolUsage); 
     printf("\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage); 
     printf("\tPeakPagefileUsage: 0x%08X\n", 
        pmc.PeakPagefileUsage); 
    } 

    CloseHandle(hProcess); 
} 

int main() 
{ 
    PrintMemoryInfo(GetCurrentProcessId()); 

    return 0; 
} 
相關問題