Сервер проседает через каждые 5 минут из-за плагина.

Статус
В этой теме нельзя размещать новые ответы.

diller110

Добрая душа
Сообщения
353
Реакции
278
Тут всё итак ясно:
Нет же) Я говорил что 150к вызовов PreThink плагина Abner Duel грузят чуть больше чем 1 вызов CMD_Rank плагина Rankme, что очень странно в отношении rankme. Функцию посмотрел, но ничего не нашел.

@daniel228, отпишись, проблема еще актуальна? Что если заблочить только эту команду?
 
Последнее редактирование:

Danyas

Участник
Сообщения
2,173
Реакции
1,072
в rankme идет запрос в базу при получении места в топе, если хочешь его оставить - оптимизируй базу.
 

daniel228

Участник
Сообщения
47
Реакции
3
Нет же) Я говорил что 150к вызовов PreThink плагина Abner Duel грузят чуть больше чем 1 вызов CMD_Rank плагина Rankme, что очень странно в отношении rankme. Функцию посмотрел, но ничего не нашел.

@daniel228, отпишись, проблема еще актуальна? Что если заблочить только эту команду?
Актуальна, зачем её блочить?
в rankme идет запрос в базу при получении места в топе, если хочешь его оставить - оптимизируй базу.
Как её оптимизировать?!
 

diller110

Добрая душа
Сообщения
353
Реакции
278
@Danyas,
Вот код, здесь SQL_TQuery, и вроде как лагов это вызывать не должно.
C-подобный:
public Action:CMD_Rank(client,args){
    if(!g_bEnabled || client == 0 || !IsClientInGame(client))
        return Plugin_Handled;
    //LogToFile("rankme.debug.log","\"sm_rank\" command called by client %d.",client);
    if(g_aStats[client][KILLS] < g_MinimalKills){
        CPrintToChat(client,"%s %t",MSG,"NotRanked",g_aStats[client][KILLS],g_MinimalKills);
        return Plugin_Handled;
    }
    new String:query[500];
    MakeSelectQuery(query,sizeof(query));
  
    if(g_RankMode == 1)
        Format(query,sizeof(query),"%s ORDER BY score DESC",query);
    else if(g_RankMode == 2){
        if(g_bMysql)
            Format(query,sizeof(query),"%s ORDER BY CAST(kills as DECIMAL)/CAST(Case when deaths=0 then 1 ELSE deaths END as DECIMAL) DESC, score DESC",query);
        else
            Format(query,sizeof(query),"%s ORDER BY CAST(kills as float)/CAST(Case when deaths=0 then 1 ELSE deaths END as float) DESC, score DESC",query);
    }  
      
    SQL_TQuery(g_hStatsDb,SQL_RankCallback,query,client);
    return Plugin_Handled;
}

public SQL_RankCallback(Handle:owner, Handle:hndl, const String:error[], any:client){
    if(hndl == INVALID_HANDLE)
    {
        LogError("[RankMe] Query Fail: %s", error);
        return;
    }
    if(client == 0 || !IsClientInGame(client))
        return;
    //LogToFile("rankme.debug.log","Rank SQL callback called by client %d.",client);
    new i;
  
    g_TotalPlayers =SQL_GetRowCount(hndl);
    new String:Name_receive[MAX_NAME_LENGTH];
    new String:Auth_receive[64];
    new String:Ip_receive[64];
    new Float:kdr;
    new deaths;
    while(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
    {
        i++;
        SQL_FetchString(hndl,2,Name_receive,MAX_NAME_LENGTH*2+1);
        SQL_FetchString(hndl,1,Auth_receive,64);
        SQL_FetchString(hndl,3,Ip_receive,64);
    //    PrintToServer("%d %s %s",i, Name_receive, Auth_receive);
        if((g_RankBy == 1 && StrEqual(Name_receive,g_aClientName[client],false)) || (g_RankBy == 0 && StrEqual(Auth_receive,g_aClientSteam[client],false)) || (g_RankBy == 2 && StrEqual(Ip_receive,g_aClientIp[client],false))){
            deaths=SQL_FetchInt(hndl,6);
          
            if(deaths == 0)
                deaths = 1;
          
            kdr = SQL_FetchFloat(hndl,5)/deaths;
            if(g_bShowRankAll){
                for(new j = 1; j <= MaxClients;j++)
                    if(IsClientInGame(j))
                        CPrintToChat(j,"%s %t",MSG,"IsRankedAt", g_aClientName[client],i,g_TotalPlayers,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],kdr);
            } else {
                CPrintToChat(client,"%s %t",MSG,"IsRankedAt", g_aClientName[client],i,g_TotalPlayers,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],kdr);
            }
            break;
        }
    }
}
Хотя зависит от того сколько получается строк, но так как все они выводятся в чат, не думаю что много.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
@Danyas,
Вот код, здесь SQL_TQuery, и вроде как лагов это вызывать не должно.
C-подобный:
public Action:CMD_Rank(client,args){
    if(!g_bEnabled || client == 0 || !IsClientInGame(client))
        return Plugin_Handled;
    //LogToFile("rankme.debug.log","\"sm_rank\" command called by client %d.",client);
    if(g_aStats[client][KILLS] < g_MinimalKills){
        CPrintToChat(client,"%s %t",MSG,"NotRanked",g_aStats[client][KILLS],g_MinimalKills);
        return Plugin_Handled;
    }
    new String:query[500];
    MakeSelectQuery(query,sizeof(query));
 
    if(g_RankMode == 1)
        Format(query,sizeof(query),"%s ORDER BY score DESC",query);
    else if(g_RankMode == 2){
        if(g_bMysql)
            Format(query,sizeof(query),"%s ORDER BY CAST(kills as DECIMAL)/CAST(Case when deaths=0 then 1 ELSE deaths END as DECIMAL) DESC, score DESC",query);
        else
            Format(query,sizeof(query),"%s ORDER BY CAST(kills as float)/CAST(Case when deaths=0 then 1 ELSE deaths END as float) DESC, score DESC",query);
    } 
     
    SQL_TQuery(g_hStatsDb,SQL_RankCallback,query,client);
    return Plugin_Handled;
}

public SQL_RankCallback(Handle:owner, Handle:hndl, const String:error[], any:client){
    if(hndl == INVALID_HANDLE)
    {
        LogError("[RankMe] Query Fail: %s", error);
        return;
    }
    if(client == 0 || !IsClientInGame(client))
        return;
    //LogToFile("rankme.debug.log","Rank SQL callback called by client %d.",client);
    new i;
 
    g_TotalPlayers =SQL_GetRowCount(hndl);
    new String:Name_receive[MAX_NAME_LENGTH];
    new String:Auth_receive[64];
    new String:Ip_receive[64];
    new Float:kdr;
    new deaths;
    while(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
    {
        i++;
        SQL_FetchString(hndl,2,Name_receive,MAX_NAME_LENGTH*2+1);
        SQL_FetchString(hndl,1,Auth_receive,64);
        SQL_FetchString(hndl,3,Ip_receive,64);
    //    PrintToServer("%d %s %s",i, Name_receive, Auth_receive);
        if((g_RankBy == 1 && StrEqual(Name_receive,g_aClientName[client],false)) || (g_RankBy == 0 && StrEqual(Auth_receive,g_aClientSteam[client],false)) || (g_RankBy == 2 && StrEqual(Ip_receive,g_aClientIp[client],false))){
            deaths=SQL_FetchInt(hndl,6);
         
            if(deaths == 0)
                deaths = 1;
         
            kdr = SQL_FetchFloat(hndl,5)/deaths;
            if(g_bShowRankAll){
                for(new j = 1; j <= MaxClients;j++)
                    if(IsClientInGame(j))
                        CPrintToChat(j,"%s %t",MSG,"IsRankedAt", g_aClientName[client],i,g_TotalPlayers,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],kdr);
            } else {
                CPrintToChat(client,"%s %t",MSG,"IsRankedAt", g_aClientName[client],i,g_TotalPlayers,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],kdr);
            }
            break;
        }
    }
}
Хотя зависит от того сколько получается строк, но так как все они выводятся в чат, не думаю что много.

По логике вещей не должно фризить, но результат налиццо.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Оффтоп Если всё так плохо, лучше здесь вообще все переменные в static вывести.
 

Yooki

Добрая душа
Сообщения
473
Реакции
169
Из всех плагинов больше всего грузит этот, вызывается 8 раз за 1 фрейм, т.е. 1024 раз в секунду. По моему плагин не стоит того.

Тоже нагружает но не так сильно

Не сказать что причина лагов именно в дуэли, но грузит тоже.

А вот эта странная штука, при вводе какой-то команды плагина RankMe, происходит просадка. Попробуй, проследи при быстром вводе например биндом. bind v sm_rank
Помоги, пожалуйста)
 

Вложения

  • debug_1498942621.txt
    335.9 КБ · Просмотры: 14

diller110

Добрая душа
Сообщения
353
Реакции
278
@Yooki, Вкратце скажи какие типы лагов тебя беспокоят. Оффтоп
Если верить логам то:
materialadmin.smx::SQL_Callback_QueryBekap 2 2576.699 1288.349
Функция вызывается 2 раза и выполняется 1.3 секунды, не хилый такой фриз получается.
Может БД медленная или далеко располагается?

Остальное в пределах нормы.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,921
  • Команда форума
  • #30
Функция вызывается 2 раза и выполняется 1.3 секунды, не хилый такой фриз получается.
Там идёт получение запросов из локальной БД, и их последующая отправка к удалённой БД. Фриз может быть только если запросов накопилось ну очень много.
SB_Material_Design/database.sp at dev · CrazyHackGUT/SB_Material_Design · GitHub
 

Yooki

Добрая душа
Сообщения
473
Реакции
169
@Yooki, Вкратце скажи какие типы лагов тебя беспокоят. Оффтоп
Если верить логам то:
materialadmin.smx::SQL_Callback_QueryBekap 2 2576.699 1288.349
Функция вызывается 2 раза и выполняется 1.3 секунды, не хилый такой фриз получается.
Может БД медленная или далеко располагается?

Остальное в пределах нормы.
Там идёт получение запросов из локальной БД, и их последующая отправка к удалённой БД. Фриз может быть только если запросов накопилось ну очень много.
SB_Material_Design/database.sp at dev · CrazyHackGUT/SB_Material_Design · GitHub
Уже все работает и никаких фризов, спасибо большое)
 

Черная вдова

Участник
Сообщения
2,795
Реакции
670
Подскажите как самому анализировать полученные данные
sm_debug
Что такое Peak?
Я так понял надо смотреть Profile scopes sorted by time
и чем больше Time+Child - тем хуже
 
Последнее редактирование:

d4Ck

Урегулированный
Сообщения
730
Реакции
562
@Yooki, Вкратце скажи какие типы лагов тебя беспокоят. Оффтоп
Если верить логам то:
materialadmin.smx::SQL_Callback_QueryBekap 2 2576.699 1288.349
Функция вызывается 2 раза и выполняется 1.3 секунды, не хилый такой фриз получается.
Может БД медленная или далеко располагается?

Остальное в пределах нормы.
Здравствуйте, помогите пожалуйста определить причину лагов)))
 

Вложения

  • debug_1501611225.txt
    786.3 КБ · Просмотры: 33
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу