Потребление памяти неуправляемым приложением VC ++ на сервере Windows - PullRequest
2 голосов
/ 26 февраля 2009

ОК, поэтому у меня есть очень большое многопоточное неуправляемое приложение c ++ (сервер), которое работает на сервере Windows 2003. Он обслуживает сеансы для 20-50 одновременно работающих пользователей, выполняющих все виды бизнес-логики ... Иногда он может использовать очень большой объем памяти из-за таких вещей, как кэширование объектов / сеансов из-за того, что пользователи имеют большое количество открытых окон в клиентах (каждое окно имеет отдельный сервер 'сеанс'.

Мы обычно наблюдаем потребление более 5-600 МБ физической памяти и 5-600 МБ виртуальной памяти. Как только мы дошли до этой точки, у нас, похоже, начались ошибки «недостаточно памяти».

Теперь я знаю, что Windows начнет сбои страниц, когда почувствует, что ей необходимо освободить физическую память, а также что приложения win32 обычно могут выделять максимум до 4 ГБ памяти, на самом деле только с 2 ГБ памяти. которые доступны для фактического использования приложением для адресного пространства «пользовательского режима», и даже меньше после загрузки других библиотек ... Я не уверен, что использование памяти «пользовательского режима» - это то, что сообщается на Диспетчер задач ...

Так или иначе, мой реальный вопрос:

Как я могу узнать, сколько памяти пользовательского режима имеет доступ к моему приложению, и сколько было использовано в любой момент времени (предпочтительно снаружи приложения, т.е. какого-то инструмента управления окнами)?

[править] После просмотра Process Explorer и веб-сайта кажется, что значение «Виртуальный размер» - это значение объема памяти, к которому приложение имеет доступ.

Ответы [ 3 ]

5 голосов
/ 26 февраля 2009

Звучит как случай для Process Explorer, бесплатной утилиты от Microsoft SysInternals :

alt text
(источник: microsoft.com )

Описание:

Всегда задавался вопросом, какая программа имеет определенный файл или каталог открыт? Сейчас Вы можете узнать. Process Explorer показывает информацию о которой ручки и процессы DLL открылись или загружен.

Дисплей Process Explorer состоит из двух подоконников. Верхнее окно всегда показывает список текущих активные процессы, включая имена их собственных счетов, тогда как информация отображается внизу окно зависит от режима, который Process Explorer находится в: если он находится в Режим обработки вы увидите ручки что процесс выбран в верхней окно открылось; если Process Explorer находится в режиме DLL, вы увидите библиотеки DLL и отображенные в память файлы, которые процесс загрузил. Process Explorer также имеет мощная возможность поиска, которая будет быстро показать, какие процессы определенные ручки открыты или DLL загружен.

Уникальные возможности процесса Explorer делает его полезным для отслеживания вниз DLL-версии проблемы или справиться утечки, и дать представление о как работают Windows и приложения.


Если вы ищете дополнительную информацию с точки зрения специфической для терминального сервера информации, я следил за блогом программиста, который выпускает бета-версию инструмента, который, как я считаю, будет соответствовать вашим потребностям. Это улучшенный TSAdmin. Он называет это TSAdminEx.

Смотрите скриншот ниже, и нажмите здесь, чтобы узнать больше об этом и получить бета . Это бесплатное программное обеспечение, кстати.

alt text

3 голосов
/ 11 марта 2009

Я знаю, что вы просили предпочтительно из-за пределов приложения, но я искал, как найти такую ​​информацию в моей собственной программе, и наткнулся на ваш пост. Таким образом, это поможет людям, которые хотят получить эту информацию от в рамках их программы.

неуправляемый 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;
}
0 голосов
/ 26 февраля 2009

Вы писали:

Когда вы говорите, сколько памяти Win32 приложение может получить доступ к ним конкретно назовите это памятью «пользовательского режима», которую я не вижу в качестве варианта или, по крайней мере, я не знаю, что это за столбец на самом деле.

Ознакомьтесь с этой статьей (написанной создателем Process Explorer, доктором Марком Руссиновичем).

Чтобы иметь возможность эффективно управлять своими системами Windows, необходимо понимать, как Windows управляет физическими ресурсами, такими как процессоры и память, а также логическими ресурсами, такими как виртуальная память, дескрипторы и объекты оконного менеджера. Знание пределов этих ресурсов и того, как отслеживать их использование, позволяет вам приписывать использование ресурсов приложениям, которые их используют, эффективно определять размер системы для конкретной рабочей нагрузки и определять приложения, которые производят утечку ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...