Потребление ресурсов плагинами

ratyaga0988

Участник
Сообщения
1
Реакции
0
Операционная система
Linux
На сервере стоит sourcemod
Можно ли как-то отследить какие плагины сколько кушаю ресурсов сервера ?
Сервер Ubuntu
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
помню как утечки памяти отслеживать (делать несколько дампов хэндлов и сравнивать), а вот нагрузку на проц - хз
 

DarkerZ

Участник
Сообщения
394
Реакции
175
sm prof start, затем через карту/ минут 30, sm prof stop, sm prof dump vprof... Был отдельный плагин здесь на форуме, который облегчал это дело. profiler или debug назывался от Kruzya
Сообщения автоматически склеены:


Сообщения автоматически склеены:

помню как утечки памяти отслеживать (делать несколько дампов хэндлов и сравнивать), а вот нагрузку на проц - хз
в prof ведь есть время выполнения и ещё кучу всего, просто применяешь сортировку
 

Вложения

  • Profiler.sp
    1.2 КБ · Просмотры: 15

DENZEL519

Работаю с AI !
Сообщения
417
Реакции
198
@ratyaga0988, Может сработает)

Описание работы плагина "Монитор производительности плагинов"

Плагин предназначен для мониторинга производительности плагинов на сервере SourceMod. Он собирает данные о загрузке CPU, количестве сущностей и других метриках, анализирует их и выводит отчеты в логи. Это помогает администраторам выявлять проблемные плагины, утечки памяти или неожиданную нагрузку на сервер.


1. Принцип работы

Плагин работает в несколько этапов:

1.1. Сбор данных (дамп)

  • Автоматически (по таймеру, каждые 30 секунд) или вручную (по команде sm_perfmon_dump) создается "снимок" текущего состояния плагинов.
  • Для каждого плагина записываются:
    • Имя файла (например, adminmenu.smx).
    • Количество сущностей, связанных с плагином.
    • Нагрузка CPU (время выполнения тестовой операции в миллисекундах).

1.2. Хранение данных

  • Последние 3 снимка сохраняются в памяти (круговой буфер g_hPluginSnapshots).
  • Это позволяет сравнивать изменения между замерами.

1.3. Анализ данных

  • Плагин сравнивает последние замеры и ищет:
    • Резкий рост числа сущностей (возможная утечка).
    • Увеличение нагрузки CPU (более чем на 50%).
  • Формируется ТОП-3 плагинов:
    • По количеству сущностей.
    • По потреблению CPU.

1.4. Логирование

  • Все отчеты выводятся:
    • В стандартный лог SourceMod (для мгновенного просмотра).
    • В отдельный файл addons/sourcemod/logs/perfmon.log (если включено в настройках).

2. Пример работы

2.1. Автоматический мониторинг

  1. Каждые 30 секунд плагин делает замер.
  2. Если обнаруживается аномалия (например, у плагина zombiereloaded.smx число сущностей выросло с 50 до 100), в лог пишется:
    C-подобный:
    ВНИМАНИЕ: Рост сущностей в zombiereloaded.smx: +50 (было 50, стало 100)
  3. В конце формируется ТОП:
    C-подобный:
    --- Топ по сущностям ---
    1. zombiereloaded.smx (100 сущностей)
    2. adminmenu.smx (30 сущностей)
    3. sourcebans.smx (15 сущностей)
    
    --- Топ по CPU ---
    1. myfunplugin.smx (5.250 мс)
    2. zombiereloaded.smx (3.100 мс)
    3. adminmenu.smx (1.750 мс)

2.2. Ручной вызов

Администратор может в любой момент ввести в консоль: sm_perfmon_dump и получить актуальный снимок производительности.


3. Настройки

Плагин имеет два параметра в cfg/sourcemod/plugin_performance_monitor.cfg:

  • sm_perfmon_enable 1 — включить/выключить мониторинг (1/0).
  • sm_perfmon_logfile 1 — записывать логи в отдельный файл (1/0).

4. Для чего полезен этот плагин?

  • Поиск утечек сущностей
    Если у плагина постоянно растет число сущностей — это может быть ошибкой (например, он не удаляет объекты после использования).
  • Выявление "тяжелых" плагинов
    Плагины с высокой нагрузкой CPU могут вызывать лаги на сервере.
  • Сравнение производительности
    Можно отслеживать, как изменения в плагинах влияют на сервер (например, после обновления).

5. Пример вывода в лог

C-подобный:
[PerfMon] === Анализ производительности ===
ВНИМАНИЕ: Рост сущностей в zombiereloaded.smx: +50 (было 50, стало 100)
ВНИМАНИЕ: Рост нагрузки CPU в myfunplugin.smx: +75.5%
--- Топ по сущностям ---
1. zombiereloaded.smx (100 сущностей)
2. adminmenu.smx (30 сущностей)
3. sourcebans.smx (15 сущностей)
--- Топ по CPU ---
1. myfunplugin.smx (5.250 мс)
2. zombiereloaded.smx (3.100 мс)
3. adminmenu.smx (1.750 мс)
[PerfMon] === Отчет завершен ===

Плагин не тестил, нет возможности( 😔
 

Вложения

  • plugin_performance_monitor.sp
    9.1 КБ · Просмотры: 4
  • plugin_performance_monitor.smx
    8.4 КБ · Просмотры: 2
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@DENZEL519, что эта функция может определить по тысяче запросов названия одного плагина (которое потом никак не используется)?
C-подобный:
float MeasureCpuUsage(Handle hPluginToMeasure)
{
    Handle hProfiler = CreateProfiler();
    StartProfiling(hProfiler);
    
    char sBuffer[256];
    for (int i = 0; i < 1000; i++)
    {
        GetPluginFilename(hPluginToMeasure, sBuffer, sizeof(sBuffer));
    }
    
    StopProfiling(hProfiler);
    float fTime = GetProfilerTime(hProfiler);
    CloseHandle(hProfiler);
    
    return fTime;
}
А вот это в плагине не нужно от слова "совсем":
C-подобный:
public void OnPluginEnd()
{
    for (int i = 0; i < MAX_DUMPS; i++)
    {
        if (g_hPluginSnapshots[i] != null)
        {
            delete g_hPluginSnapshots[i];
        }
    }
}
Просто потому что не имеет никакого смысла удалять то, что соурсмод удаляет сам автоматически.
 

DENZEL519

Работаю с AI !
Сообщения
417
Реакции
198
@DENZEL519, что эта функция может определить по тысяче запросов названия одного плагина (которое потом никак не используется)?
C-подобный:
float MeasureCpuUsage(Handle hPluginToMeasure)
{
    Handle hProfiler = CreateProfiler();
    StartProfiling(hProfiler);
  
    char sBuffer[256];
    for (int i = 0; i < 1000; i++)
    {
        GetPluginFilename(hPluginToMeasure, sBuffer, sizeof(sBuffer));
    }
  
    StopProfiling(hProfiler);
    float fTime = GetProfilerTime(hProfiler);
    CloseHandle(hProfiler);
  
    return fTime;
}
А вот это в плагине не нужно от слова "совсем":
C-подобный:
public void OnPluginEnd()
{
    for (int i = 0; i < MAX_DUMPS; i++)
    {
        if (g_hPluginSnapshots[i] != null)
        {
            delete g_hPluginSnapshots[i];
        }
    }
}
Просто потому что не имеет никакого смысла удалять то, что соурсмод удаляет сам автоматически.
Ну как хорошо что есть такие как ты) Которые смогут подправить и скинуть нормальную версию плагина)
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@DENZEL519, емнип, у меня есть только плагин постоянного мониторинга утечки памяти и зависания плагинов.
Не помню только кто автор и вносил ли я исправления (нужно поискать исходник на винтах).
Сообщения автоматически склеены:

Вот, нашёл:
Таки вносил исправления.
 
Последнее редактирование:
Сверху Снизу