[Off] LAG excessivo no servidor [nгo й DDoS, e muito menos DoS]
#1

Olб! Recentemente, o Cidade Social RPG (RPG criado do zero) vem sofrendo bastante LAG do nada; de inнcio, eu achei que fosse a nossa mitigaзгo, mas segundo a prуpria empresa em que hospedamos (One Cloud Service), ninguйm estб atacando (vale citar que a proteзгo anti DDOS da empresa й excelente).

Pensei tambйm ser algum exploit, entгo eu adicionei no server.cfg as linhas: messageholelimit e ackslimit.

Porйm, mesmo assim, o LAG comeзou (logo apуs um jogador ter saнdo do servidor, DETALHE: foi DO NADA, pois houve saнda / entrada de jogadores no servidor antes deste em questгo).

Eu reiniciei o servidor e, para a minha surpresa, o LAG havia parado (foi aн que eu percebi que o LAG causado nгo era por um exploit).

Eu deduzi entгo que teria sido a minha include de salvamento, que havia sido atualizada hб pouco... Antes, eu estava usando variбveis globais para tudo, exemplo: new File:bCini7_Archive_File; no inнcio da include, e nгo apenas nas funзхes em que ela й utilizada.

Isto poderia ter acarretado em algo? Em um loop infinito, ou algo deste tipo?

Vale citar que eu jб mudei tudo e jб fiz mais algumas mudanзas (na prуpria include bCini7), sendo que a include atual estб desta forma:

pawn Код:
// Include bCini7

#define bCini7_Open fopen
#define bCini7_Exists fexist
#define bCini7_Write fwrite
#define bCini7_Read fread
#define bCini7_Close fclose

#define bCini7_Create(%0) if(!bCini7_Exists(%0)) bCini7_Close(bCini7_Open(%0,io_write)) && bCini7_OpenArchive(%0)
#define bCini7_Delete(%0) if(bCini7_Exists(%0)) fremove(%0)

// Variables

stock bCini7_Archive_Name[64] = "null",bCini7_Archive_Line[100][64],bCini7_Archive_Value[100][64],bCini7_Lines_Archive = 1,bCini7_Line_ID,bool:bCini7_Archive_Is_Used,bCini7_File_Var[64];

// Definitions

stock bCini7_Archive_Format_2[128];

#define bCini7_SetInt(%0,%1,%2) format(bCini7_Archive_Format_2,128,"%d",%2) && bCini7_SetText(%0,%1,bCini7_Archive_Format_2)
#define bCini7_SetFloat(%0,%1,%2) format(bCini7_Archive_Format_2,128,"%.2f",%2) && bCini7_SetText(%0,%1,bCini7_Archive_Format_2)

#define bCini7_Log(%0,%1) new File:bCini7_File_Open_2 = bCini7_Open(%0,io_append); bCini7_Write(bCini7_File_Open_2,%1) && bCini7_Close(bCini7_File_Open_2)

// Used functions

stock bCini7_SetText(archive[],line[],value[])
{
    if(bCini7_Lines_Archive ^ 100)
    {
        bCini7_Create(archive);
        bCini7_OpenArchive(archive);

        bCini7_Line_ID = GetSVarInt(line);

        if(!bCini7_Line_ID)
        {
            SetSVarInt(line,bCini7_Lines_Archive);

            bCini7_Line_ID = bCini7_Lines_Archive;
            ++bCini7_Lines_Archive;
        }
        strunpack(bCini7_Archive_Line[bCini7_Line_ID],line);
        strunpack(bCini7_Archive_Value[bCini7_Line_ID],value);

        bCini7_Archive_Is_Used = true;
    }
    return 1;
}
stock bCini7_ReadText(archive[],line[])
{
    bCini7_OpenArchive(archive);

    return bCini7_Archive_Value[GetSVarInt(line)];
}
stock bCini7_ReadInt(archive[],line[])
{
    bCini7_OpenArchive(archive);

    return strval(bCini7_Archive_Value[GetSVarInt(line)]);
}
stock Float:bCini7_ReadFloat(archive[],line[])
{
    bCini7_OpenArchive(archive);

    return floatstr(bCini7_Archive_Value[GetSVarInt(line)]);
}
stock bCini7_IsSet(archive[],line[])
{
    bCini7_OpenArchive(archive);

    return GetSVarInt(line);
}
stock bCini7_DeleteSet(archive[],line[])
{
    if(bCini7_Exists(archive)) // Is needed
    {
        bCini7_OpenArchive(archive);
        bCini7_Line_ID = GetSVarInt(line);

        if(bCini7_Line_ID)
        {
            DeleteSVar(bCini7_Archive_Line[bCini7_Line_ID]);

            bCini7_Archive_Line[bCini7_Line_ID][0] = 0;
            bCini7_Archive_Value[bCini7_Line_ID][0] = 0;

            bCini7_Archive_Is_Used = true;
        }
    }
    return 1;
}
stock bCini7_Copy(archive_1[],archive_2[],bool:delete_archive)
{
    if(bCini7_Exists(archive_1))
    {
        if(!bCini7_Exists(archive_2))
        {
            bCini7_OpenArchive(archive_1);

            new bCini7_Archive_Format[128],File:bCini7_File_Open = bCini7_Open(archive_2,io_write);

            for(new bCini7_Var_x; bCini7_Var_x <= bCini7_Lines_Archive; ++bCini7_Var_x)
            {
                format(bCini7_Archive_Format,128,"%s=%s\r\n",bCini7_Archive_Line[bCini7_Var_x],bCini7_Archive_Value[bCini7_Var_x]);

                if(bCini7_Archive_Line[bCini7_Var_x][0])
                {
                    if(bCini7_Archive_Value[bCini7_Var_x][0])
                    {
                        bCini7_Write(bCini7_File_Open,bCini7_Archive_Format);
                    }
                }
            }
            bCini7_Close(bCini7_File_Open);

            if(delete_archive == true)
            {
                bCini7_Delete(archive_1);
            }
        }
    }
    return 1;
}
stock bCini7_ChangeLine(archive[],line[],name[])
{
    if(bCini7_Exists(archive)) // Is needed
    {
        bCini7_OpenArchive(archive);

        bCini7_Line_ID = GetSVarInt(line);
        strunpack(bCini7_Archive_Line[bCini7_Line_ID],name);

        bCini7_Archive_Is_Used = true;
    }
    return 1;
}
// Unused functions

stock bCini7_OpenArchive(archive[])
{
    if(strcmp(bCini7_Archive_Name,archive,false))
    {
        if(bCini7_Exists(archive))
        {
            bCini7_CloseArchive();

            strunpack(bCini7_Archive_Name,archive);

            new File:bCini7_File_Open = bCini7_Open(archive,io_read),bCini7_System_Lines[2];

            while(bCini7_Read(bCini7_File_Open,bCini7_File_Var))
            {
                if(bCini7_File_Var[0])
                {
                    if(bCini7_File_Var[0] >= 255)
                    {
                        strdel(bCini7_File_Var,0,1);
                    }
                    bCini7_System_Lines[0] = strlen(bCini7_File_Var);

                    if(bCini7_File_Var[bCini7_System_Lines[0]-1] == '\r' || bCini7_File_Var[bCini7_System_Lines[0]-1] == '\n')
                    {
                        bCini7_File_Var[bCini7_System_Lines[0]-1] = 0;
                    }
                    if(bCini7_File_Var[bCini7_System_Lines[0]-2] == '\r' || bCini7_File_Var[bCini7_System_Lines[0]-2] == '\n')
                    {
                        bCini7_File_Var[bCini7_System_Lines[0]-2] = 0;
                    }
                    bCini7_System_Lines[1] = strfind(bCini7_File_Var,"=");

                    strmid(bCini7_Archive_Line[bCini7_Lines_Archive],bCini7_File_Var,0,bCini7_System_Lines[1],bCini7_System_Lines[1]+1);
                    strmid(bCini7_Archive_Value[bCini7_Lines_Archive],bCini7_File_Var,bCini7_System_Lines[1]+1,bCini7_System_Lines[0]);

                    SetSVarInt(bCini7_Archive_Line[bCini7_Lines_Archive],bCini7_Lines_Archive);

                    ++bCini7_Lines_Archive;
                }
            }
            bCini7_Close(bCini7_File_Open);
        }
    }
    return 1;
}
bCini7_CloseArchive()
{
    if(!bCini7_Exists(bCini7_Archive_Name) || bCini7_Archive_Is_Used == false)
    {
        for(new bCini7_Var_x; bCini7_Var_x <= bCini7_Lines_Archive; ++bCini7_Var_x)
        {
            DeleteSVar(bCini7_Archive_Line[bCini7_Var_x]);

            bCini7_Archive_Line[bCini7_Var_x][0] = 0;
            bCini7_Archive_Value[bCini7_Var_x][0] = 0;
        }
    }
    else
    {
        new bCini7_Archive_Format[128],File:bCini7_File_Open = bCini7_Open(bCini7_Archive_Name,io_write);

        for(new bCini7_Var_x; bCini7_Var_x <= bCini7_Lines_Archive; ++bCini7_Var_x)
        {
            if(bCini7_Archive_Line[bCini7_Var_x][0])
            {
                if(bCini7_Archive_Value[bCini7_Var_x][0])
                {
                    format(bCini7_Archive_Format,128,"%s=%s\r\n",bCini7_Archive_Line[bCini7_Var_x],bCini7_Archive_Value[bCini7_Var_x]);

                    bCini7_Write(bCini7_File_Open,bCini7_Archive_Format);
                }
            }
            DeleteSVar(bCini7_Archive_Line[bCini7_Var_x]);

            bCini7_Archive_Line[bCini7_Var_x][0] = 0;
            bCini7_Archive_Value[bCini7_Var_x][0] = 0;
        }
        bCini7_Close(bCini7_File_Open);
    }
    bCini7_Archive_Name = "null";
    bCini7_Lines_Archive = 1;
    bCini7_Archive_Is_Used = false;
}
// End of include
Eu irei atualizar aqui se acontecer alguma queda novamente, mas, depois de ter atualizado isto tudo, por favor, me respondam o seguinte: Й possнvel que tenha sido a include antiga?

Por favor, responda aqui apenas se tiver uma resposta concreta e fundamentada!

Obrigado a todos.
Reply
#2

Utilize o crashdetect. Acho que seria mais objetivo e eficiente.
Reply
#3

Ini estб ultrapassado. Aprenda algo que pode vir a usar em outras coisas que nгo sу samp (SQL) й utilize algo como SQLite e vera belas mudanзas no servidor.

Se precisar de ajuda pode falar..
Reply
#4

Se quer velocidade... utilize uma versгo do MySQL assнncrona.
Reply
#5

Quote:
Originally Posted by klap
Посмотреть сообщение
Se quer velocidade... utilize uma versгo do MySQL assнncrona.
Nгo digas asneiras estamos a falar de samp e nгo de web, alem do mais na ъltima versгo do samp o SQLite foi atualizado ficando muito mais rбpido que anteriormente. Alйm do mais й nativo nгo precisas de qualquer plugin externo e consegues usar prepared statments. O que amplifica a бrea de desenvolvimento.

A ъnica coisa que muda de relevвncia e que se ele for ligar um servidor a DB do servidor й melhor usar MySQL mesmo assim tambйm й possнvel ligar a uma base de dados SQLite um site.

Ah e a DB MySQL й remota e a SQLite й local tambйm й essa umas das diferenзas
Reply
#6

Quote:
Originally Posted by PT
Посмотреть сообщение
Nгo digas asneiras estamos a falar de samp e nгo de web, alem do mais na ъltima versгo do samp o SQLite foi atualizado ficando muito mais rбpido que anteriormente. Alйm do mais й nativo nгo precisas de qualquer plugin externo e consegues usar prepared statments. O que amplifica a бrea de desenvolvimento.

A ъnica coisa que muda de relevвncia e que se ele for ligar um servidor a DB do servidor й melhor usar MySQL mesmo assim tambйm й possнvel ligar a uma base de dados SQLite um site.

Ah e a DB MySQL й remota e a SQLite й local tambйm й essa umas das diferenзas
asneiras й o que vocк estб falando. da pra notar sua falta total de conhecimento em SQL.

primeiramente quem entende de databases (persistкncia de dados) sabe que nunca arriscaria falar que SQL й mais moderno ou melhor que qualquer outra ferramenta. Primeiro й necessбrio ver a necessidade que a pessoa tem. SQLite, salvamento ficheiro e MySQL sгo para problemas TOTALMENTE diferentes. vocк analisou isso? Nгo. pelos posts que vocк tenta passar algum conhecimento, falho, sobe o assunto vocк parece um fгnboy que levanta a bandeira do SQLite apenas por querer e nгo por necessidade.

segundo, seu argumento de MySQL ter que usar plugin й totalmente falho. Sscanf tambйm й um plugin, entгo й melhor usar format que й nativo? Falho.

SQLite й uma database acoplada e por esse motivo nгo da suporte a acesso a rede ou remoto, ao contrario do que vocк falou. e se vocк estб pensando na soluзгo de usar FTP para acessar o banco remotamente trata-se \de uma gambiarra e mal uso da ferramenta. SQLite tem suas vantagens, como armazenamos locais simples que nгo precisarгo ser acessados por outros dispositivos. O SQLite tambйm nгo й recomendado para queries muito grandes, complexas ou constantes sabe por que? Porque nem tudo sгo flores. O buffer do SQLite usa [b]MUITA[b] memуria.

Como diferente de vocк eu gosto de me basear em argumentos e fontes verнdicas, deixo uma para minhas argumentaзхes sobre SQLite: http://stackoverflow.com/questions/4...-how-to-decide


No caso de SA-MP e armazenamento de contas. Vamos analisar. Normalmente um servidor possui vбrios campos de salvamento como: organizaзгo, casa, veнculo, dinheiro, level, nнvel administrativo, skin, etc... A query sу tende a crescer conforme o servidor vai melhorando.

Tambйm SA-MP tem sistema de update dos dados dos jogadores, quem й frequente. Juntando a frequencia de salvamento mais as queries que tende a ser grandes. Fica уbvio que o custo de memуria tende a crescer no SQLite conforme o servidor cresce. Isso nгo й uma engenharia escalбvel (mas vocк nгo se importa com isso ne PT? Viva SQLite e pronto!!!!) A ferramenta de salvamento mais indicado й sem dъvida o MySQL. Mesmo se a pessoa nгo for fazer qualquer conexгo com ferramentas externas, como por exemplo websites.

E para finalizar, mas um erro seu. MySQL nгo й obrigatoriamente remoto. Muito pelo contrбrio, a maioria dos seu uso й localmente.

Muita gente pode nгo te questionar por nгo ter conhecimento e por vocк ser um membro antigo no fуrum porйm infelizmente vocк mais fala besteira de assuntos que claramente vocк nгo sabe do que informaзгo real mesmo. Se contenha a fala de SA-MP que talvez vocк se dк melhor. abraзos.
Reply
#7

Mais um fan boy de MySQL. Ligam as pequenas coisas do SQLite. Sу para constar eu uso website com ligaзгo ao servidor e a minha DB e SQLite. Nгo pense que por ela ser local estб impossibilitado o acesso. Quanto аs querys duvido que no sa-mp alguйm use uma Query que o SQLite nгo suporte, se atй grandes servidores usam nгo serб um servidor Br com meia dъzia de gatos pingados que nгo podera usar.

Vocк pode falar o que quiser a mim pouco me importa.
Reply
#8

Quote:
Originally Posted by PT
Посмотреть сообщение
Nгo digas asneiras estamos a falar de samp e nгo de web, alem do mais na ъltima versгo do samp o SQLite foi atualizado ficando muito mais rбpido que anteriormente. Alйm do mais й nativo nгo precisas de qualquer plugin externo e consegues usar prepared statments. O que amplifica a бrea de desenvolvimento.

A ъnica coisa que muda de relevвncia e que se ele for ligar um servidor a DB do servidor й melhor usar MySQL mesmo assim tambйm й possнvel ligar a uma base de dados SQLite um site.

Ah e a DB MySQL й remota e a SQLite й local tambйm й essa umas das diferenзas
Sabes que podes usar mysql local ne? '-'

E eu sei que mysql й mais lento que sqllite derivado a ser nativo e bla bla
No entanto eu refirome a ligaзхes assincronas...
Ou seja .. ligacoes com 0 tempo de espera...
Devolve quando tem resultado e nao quando й pedido...
Isso й a soluзгo mais rapida que arranjas...
Deixa de ser fan boy do sql tu xD
A microsoft nao te paga xD

Ps: nunca fiz ligaзгo assнncrona para web...apenas em samp .. java e C#
Nem sei se й possнvel fazelo em php
Reply
#9

Quote:
Originally Posted by klap
Посмотреть сообщение
Sabes que podes usar mysql local ne? '-'

E eu sei que mysql й mais lento que sqllite derivado a ser nativo e bla bla
No entanto eu refirome a ligaзхes assincronas...
Ou seja .. ligacoes com 0 tempo de espera...
Devolve quando tem resultado e nao quando й pedido...
Isso й a soluзгo mais rapida que arranjas...
Deixa de ser fan boy do sql tu xD
A microsoft nao te paga xD

Ps: nunca fiz ligaзгo assнncrona para web...apenas em samp .. java e C#
Nem sei se й possнvel fazelo em php
Tu sim fizeste um comentбrio que vale apena realзar, й verdade tambйm й possнvel ser local й verdade. Quanto a SQL apenas gosto de usar o que й bom... XD. Em SQLite tambйm tens respostas com tempo de espera 0. Tudo depende da Query. O problema й que o pessoal esquece-se que isto й apenas um servidor de sa-mp nгo й nenhum ********.
Reply
#10

- O lag й geral?
- Verificou o consumo que o servidor estб dando para a mбquina?
- Qual as configuraзхes da mбquina?
- Quantos players o servidor estava quando aconteceu isso?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)