none
Получить данные о пуле приложений для ASP.Net Core 3.0 RRS feed

  • Вопрос

  • Подскажите, пож-та, как из веб приложения узнать к какому пулу приложений он относится и получить данные о этом пуле приложений, например объем занимаемой памяти.
    13 января 2020 г. 13:03

Ответы

  • Попробуйте этот метод натравить на все процессы:

    using System;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    
    namespace NetCoreTest
    {
        class Program
        {       
    
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr OpenProcess(
                uint processAccess,
                bool bInheritHandle,
                int processId
            );
    
            [DllImport("kernel32.dll", SetLastError = true)]        
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool CloseHandle(IntPtr hObject);
    
            static uint PROCESS_QUERY_INFORMATION = 0x0400;
    
            public static bool TryOpenProcess(Process proc)
            {
                IntPtr handle = OpenProcess(PROCESS_QUERY_INFORMATION, false, proc.Id);
                if (handle != IntPtr.Zero)
                {
                    CloseHandle(handle);
                    return true;
                }
                else return false;
            }        
        }
    }

    Он должен, при запуске с обычными правами, вернуть true для всех процессов, запущенных от текущего пользователя, и false для системных процессов и процессов других пользователей.

    • Помечено в качестве ответа Liliya Muray 16 января 2020 г. 7:52
    16 января 2020 г. 5:12

Все ответы

  • Речь о пуле IIS?

    Сделаем содержимое сообщества лучше, вместе!

    14 января 2020 г. 13:52
    Модератор
  • Скорее всего, да.
    14 января 2020 г. 14:05
  • Можно использовать Microsoft IIS Administration API например The Application Pool Resource правда нужны будут соответствующие привилегии и настройки. Если у вас AppService в Azure то можно использовать Kudu.

    Сделаем содержимое сообщества лучше, вместе!

    14 января 2020 г. 14:15
    Модератор
  • Это обычный Windows хостинг. Множество клиентов. Мне хотелось бы узнать какой из процессов пулов приложений мой и следить за объемом потребляемой памяти. Естественно средства администрирования мне не доступны, только C# функции.
    14 января 2020 г. 14:23
  • Можно попробовать Process.GetCurrentProcess ну и дальше использовать доступные свойства объекта. В старой версии это не прокатит так как там используются AppDomans, но у вас насколько понял Core 3.0 т.е. .NET Framework исключён.

    Сделаем содержимое сообщества лучше, вместе!

    14 января 2020 г. 14:35
    Модератор
  • Можно попробовать Process.GetCurrentProcess ну и дальше использовать доступные свойства объекта. В старой версии это не прокатит так как там используются AppDomans, но у вас насколько понял Core 3.0 т.е. .NET Framework исключён.
    Это ссылка на текущий процесс, т.е. само веб приложение. Это работает, но как узнать процесс пула?
    14 января 2020 г. 15:55
  • "Это работает, но как узнать процесс пула?" - а какие данные конкретно требуются?

    Сделаем содержимое сообщества лучше, вместе!

    15 января 2020 г. 7:00
    Модератор
  • "Это работает, но как узнать процесс пула?" - а какие данные конкретно требуются?
    Ну стандартные данные по процессу: объем памяти, время старта, потребление ресурсов что-то подобное. Первоочередная задача это потребление памяти пулом.
    15 января 2020 г. 7:49
  • Так если у вас приложение хостится в IIS то физический процесс ОС и есть пул. Для новых версий .NET Core в основно используется "InProcess Model", тут маппинг один к одному. Почитайте тут например.

    Сделаем содержимое сообщества лучше, вместе!

    15 января 2020 г. 8:06
    Модератор
  • Так если у вас приложение хостится в IIS то физический процесс ОС и есть пул. Для новых версий .NET Core в основно используется "InProcess Model", тут маппинг один к одному. Почитайте тут например.
    Статью почитаю... Но у меня параметр "<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
    ". На мои 6 приложений создан один пул приложений.
    15 января 2020 г. 8:32
  • Этот пул используется только в качестве прокси, реально ваше каждое приложение хостится в отдельном физическом процессе dotnet.exe. В старом ASP.NET один физический процесс мог содержать несколько приложений при помощи AppDomains. В случае с "InProcess Model" и пул и приложние находятся в одном физическом процессе. Именно эту модель следуетс использовать для повышения производительности.

    Сделаем содержимое сообщества лучше, вместе!

    15 января 2020 г. 9:36
    Модератор
  • Этот пул используется только в качестве прокси, реально ваше каждое приложение хостится в отдельном физическом процессе dotnet.exe. В старом ASP.NET один физический процесс мог содержать несколько приложений при помощи AppDomains. В случае с "InProcess Model" и пул и приложние находятся в одном физическом процессе. Именно эту модель следуетс использовать для повышения производительности.
    Да, я прочитала статью. Но на хостинге не используется "<AspNetCoreModuleName>AspNetCoreModuleV2</AspNetCoreModuleName>" только "<AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>". Поэтому мне нужно найти в списке процессов с именем "w3wp" мой и узнать объем потребляемой им памяти. Вот как отличить мой от чужих не могу понять, думала есть другие способы узнать сколько памяти потребляет пул другим способом.
    15 января 2020 г. 10:28
  • Это не имеет значения. Если вы используете ASP.NET Core 3.0, то там используется API .NET Standart 2.1, который работает только в .NET Core 3.0/3.1. Отсюда вывод, что у вас код хостится в .NET Core, а не в .NET Framework. Следовательно, по скольку у вас "OutOfProcess Model", то процесс этот dotnet.exe, а не w3wp.exe. А узнать параметры запуска можно используя Process.StartInfo. Но мне непонятно зачем? Ведь у вас есть возможность выполнить код в нужном вам процессе.


    Сделаем содержимое сообщества лучше, вместе!

    15 января 2020 г. 13:22
    Модератор
  • Это не имеет значения. Если вы используете ASP.NET Core 3.0, то там используется API .NET Standart 2.1, который работает только в .NET Core 3.0/3.1. Отсюда вывод, что у вас код хостится в .NET Core, а не в .NET Framework. Следовательно, по скольку у вас "OutOfProcess Model", то процесс этот dotnet.exe, а не w3wp.exe. А узнать параметры запуска можно используя Process.StartInfo. Но мне непонятно зачем? Ведь у вас есть возможность выполнить код в нужном вам процессе.

    Вы правы веб приложение запускается используя dotnet.exe, а пул приложений расположен в w3wp.exe. Я могу узнать имя пользователя от которого запущено веб приложение через константу Environment.UserName. Но как извлечь у процесса w3wp.exe имя пользователя имея только возможности ASP.NET Core 3.0 не могу найти варианта.
    15 января 2020 г. 13:45
  • >Но как извлечь у процесса w3wp.exe имя пользователя имея только возможности ASP.NET Core 3.0 не могу найти варианта. "

    Никак, ASP.NET Core ничего не знает о пользователях Windows. Да и что это даст? Скорее всего, там будет безликая учетная запись службы, типа NETWORK SERVICE. Кроме того, если процесс IIS запускается не под текущим пользователем и у вашего процесса ограниченные привилегии, вы вообще не должны его видеть, разве нет?  А нет, они будут видны при перечислении процессов, но никакого доступа к ним не будет. 

    Зачем вам нужно знать потребление памяти процессом, в котором не запускается только небольшой модуль, перенаправляющий запросы в ASP.NET Core? Из любопытства, или у вас приложение страдает от нехватки памяти?


    • Изменено VadimTagil 16 января 2020 г. 5:13
    16 января 2020 г. 3:46
  • Попробуйте этот метод натравить на все процессы:

    using System;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    
    namespace NetCoreTest
    {
        class Program
        {       
    
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr OpenProcess(
                uint processAccess,
                bool bInheritHandle,
                int processId
            );
    
            [DllImport("kernel32.dll", SetLastError = true)]        
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool CloseHandle(IntPtr hObject);
    
            static uint PROCESS_QUERY_INFORMATION = 0x0400;
    
            public static bool TryOpenProcess(Process proc)
            {
                IntPtr handle = OpenProcess(PROCESS_QUERY_INFORMATION, false, proc.Id);
                if (handle != IntPtr.Zero)
                {
                    CloseHandle(handle);
                    return true;
                }
                else return false;
            }        
        }
    }

    Он должен, при запуске с обычными правами, вернуть true для всех процессов, запущенных от текущего пользователя, и false для системных процессов и процессов других пользователей.

    • Помечено в качестве ответа Liliya Muray 16 января 2020 г. 7:52
    16 января 2020 г. 5:12
  • >Но как извлечь у процесса w3wp.exe имя пользователя имея только возможности ASP.NET Core 3.0 не могу найти варианта. "

    Никак, ASP.NET Core ничего не знает о пользователях Windows. Да и что это даст? Скорее всего, там будет безликая учетная запись службы, типа NETWORK SERVICE. Кроме того, если процесс IIS запускается не под текущим пользователем и у вашего процесса ограниченные привилегии, вы вообще не должны его видеть, разве нет?  А нет, они будут видны при перечислении процессов, но никакого доступа к ним не будет. 

    Зачем вам нужно знать потребление памяти процессом, в котором не запускается только небольшой модуль, перенаправляющий запросы в ASP.NET Core? Из любопытства, или у вас приложение страдает от нехватки памяти?

    Список процессов w3wp.exe я получаю, могу просмотреть объемы памяти и ид сеанса, но вы правы ид сеанса у всех одинаковый.

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

    16 января 2020 г. 7:37
  • Попробуйте этот метод натравить на все процессы. Он должен, при запуске с обычными правами, вернуть true для всех процессов, запущенных от текущего пользователя, и false для системных процессов и процессов других пользователей.

    Да, только один из множества процессов w3wp.exe отвечает true.

    Спасибо!

    16 января 2020 г. 7:52