Problйmes de lags [MySQL]
#1

Salut a tous. Voila, je voulais vous demander votre aide pour regler un soucis de lags sur mon serveur.
Quand on est 5-10 co, tout ce passe bien, mais une fois passй le cap des 20 connectйs le serveur subit d'йnormes lags et зa devient injouable.

Je sais pas si c'йtait un DDOS ou quoi. Mais je pense que le problйme vient des requetes MySQL pour le saveaccounts.
J'ai mis la fonction SaveAccounts(playerid); а chaque dйconnexion du joueur. Et un Timer qui l'appel toutes les 15 minutes.
Dans ma bdd, chaque Ligne а 68 colonnes, pour caser toutes les donnйes.

J'ai fait le code SaveAccounts il y a 1 an et demi, je venais d'apprendre le MySQL, donc je comprends que vous le trouviez baclй, et c'est pour зa que je pense qu'il est la cause du soucis.

pawn Code:
(( Nouveau code plus bas ))
Le fait que la fonctoin soit appelй la deconnexion du joueur pourrait кtre la cause de lags du serveur vu que quand quelqu'un dйco, зa sauvegarde le compte de tous les joueurs.
Je ne sais pas si le soucis vient du code qui, je pense, peut-кtre amйliorй avec un seul mysql_query en bas de tous les format(
A la dйconnexion d'un joueur, la fonction utilise la boucle et procиde au SaveAccounts de tous les joueurs. Je pense que je ferai une fonction qui sauvegarderai seulement pour le joueur qui deconnecte (Sans la boucle for, spйcialement pour le OnPlayerDisconnect).

Vous en pensez quoi ? Quel est la cause des lags ? Comment rйgler le soucis ? Comment sauvegarder les donnйs sans risques de pertes, et ceux de maniиre а ne pas faire lag le serveur ?
C'est assez urgent x)
Reply
#2

Utilise des requиtes threaded dйjа

Puis dis si зa change ou pas
Reply
#3

Si je ne me trompe pas, ta fonction sauvegarde juste le compte du joueur qui vient de se dйconnecter "MAX_PLAYERS" fois.

Quote:
Originally Posted by Sam'
View Post
Le fait que la fonctoin soit appelй la deconnexion du joueur pourrait кtre la cause de lags du serveur vu que quand quelqu'un dйco, зa sauvegarde le compte de tous les joueurs.
Pourquoi UPDATE tous les comptes des joueurs а chaque fois qu'un joueur se dйconnecte ? (mкme si ce n'est pas le cas avec ton script)
Je pense plutфt qu'il faut sauvegarder juste le compte de celui qui vient de se dйconnecter.
Et vu que ta fonction est appelйe aussi toutes les 15 minutes, il vaut mieux que tu crйes un Timer par joueur dиs sa connection.
Reply
#4

(idйe peut-кtre nulle)

Essayes de faire les sauvegardes une par une. Tu met des boolйennes pour savoir si une sauvegarde est en cours, ce qui йviterai la saturation (serai plus long, mais plus safe).
Aprиs, c'est qu'une idйe.
Reply
#5

Aussi tu met MAX_PLAYERS, donc зa lance une boucle de 500 (ou 1000?) chaque dйco d'un joueur
Reply
#6

Quote:
Originally Posted by ANDREX
View Post
Si je ne me trompe pas, ta fonction sauvegarde juste le compte du joueur qui vient de se dйconnecter "MAX_PLAYERS" fois.


Pourquoi UPDATE tous les comptes des joueurs а chaque fois qu'un joueur se dйconnecte ? (mкme si ce n'est pas le cas avec ton script)
Je pense plutфt qu'il faut sauvegarder juste le compte de celui qui vient de se dйconnecter.
Et vu que ta fonction est appelйe aussi toutes les 15 minutes, il vaut mieux que tu crйes un Timer par joueur dиs sa connection.
Vrai que dans le script plus haut cela sauvegarde juste le compte du joueur individuellement qui ce dйconnecte vu que j'ai utilisй PlayerInfo[playerid] au lieu de [i] (Erreur de l'йpoque x) ) Mais alors, le bug viendrait d'ou ?


Quote:

Essayes de faire les sauvegardes une par une. Tu met des boolйennes pour savoir si une sauvegarde est en cours, ce qui йviterai la saturation (serai plus long, mais plus safe).

Ca pourrait кtre une bonne idйe, mais puisque je veux sauvegarder le compte de chaque joueur individuellement а sa dйconnexion, je pense que ce ne serait pas utile.


Peut-кtre un problиme de code ? Y'a un moyen de faire un code plus propre ?
Reply
#7

Oh que oui...

Fait ta fonction de sauvegarde pour playerid, et tu peux dans le pire des cas toute les 30 mon faire une boucle sur tous les joueurs connecte et leur faire une sauvegarde en plus de la dйconnexion.

Mais pas des sauvegardes sur MAX_PLAYERS a chaque dйconnexion + toute les 15min.

Nlx
Reply
#8

Quote:
Originally Posted by Noliax8
View Post
Fait ta fonction de sauvegarde pour playerid, et tu peux dans le pire des cas toute les 30 mon faire une boucle sur tous les joueurs connecte et leur faire une sauvegarde en plus de la dйconnexion.
Nlx
C'est une mauvaise idйe de sauvegarder tous les comptes des joueurs connectйs, et il y aura sыrement un coup de lag lors de la sauvegarde.
Reply
#9

Ha mon avis le problиme vient du fait que tu as mis une boucle dans ta fonction, elle serre а rien, si tu la retires sa marcheras mieux je pense

Essaye avec зa

Ta fonction SaveAccounts(playerid) http://pastebin.com/DY36Zrcn

Dans OnPlayerDisconnect tu met donc SaveAccounts(playerid);

est pour ton systиme de sauvegarde des comptes toutes les 15 minutes, tu fait
Code:
for(new i = 0; i < MAX_PLAYERS; i++)
         SaveAccounts(i);
PS: А mon avis revoie ton systиme d'argent en voyant,
Code:
PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
Reply
#10

au lancement du serveur, tu fais un timer avec une boucle foreach qui va sauvegarder les donnйes de TOUS les joueurs, sinon tu fais un SetTimerEx a la connexion du joueur mais sa va multiplier les timers, donc pas trop optimisй , et pour tes requettes mysql, je te conseille de procйder comme sa :
pawn Code:
format(query, sizeof(query), "UPDATE membre SET Mission = %d, Warnings = %d, VirWorld = %d, Fuel = %d, Mask = %d WHERE Login = '%s'", PlayerInfo[playerid][pMissionNr],PlayerInfo[playerid][pWarnings],PlayerInfo[playerid][pVirWorld],PlayerInfo[playerid][pFuel],PlayerInfo[playerid][pMask], playername3) mysql_query(query);
en une ligne, sa va faire un auto-return
Reply
#11

Pour les requкtes threadйes il faut le nouveau plugin R39-2 c'est зa ?
Par quoi sont remplacй les fonctions Mysql_num_rows, Mysql_free_result et plusieurs autres fonctions qui m'empкche de changer de plugin ?
Jpourrais trouver les nouvelles methodes sur le wiki ?

Ramoboss, ok jvais faire comme зa mais on y gagne en vitesse ?
Reply
#12

oui, ecoute, dans OnGameModeInit, tu initialise un timer, tu fais un fonction public, dans cette fonction public, tu fais une boucle for avec MAX_PLAYERS
aprиs la boucle, tu fais ton code de sauvegarde, mais pas avec le playerid, au lieu de playerid, tu fais i
la sa va save les donnйes de tous les JOUEURS connectйes, n'oublie pas de faire une condition si le joueur est connectй en dessous de la boucle for
tu gagnera plus en vitesse que si tu fais un timer qui s'initialise a la connexion/dйconnexion de chaque joueur, un timer pour tous les joueurs, c'est mieux qu'un timer pour chaque joueur
il faut savoir que les timers bouffent ENORMEMENT de ressources !

et pour les requettes threadй, je pense qu'il faut prendre une release R3X
mais je peut pas t'aider de ce cotй la, j'utilise la bonne vielle R5 qui m'a toujours йtй fidиle et qui n'a jamais posй de problиme
Reply
#13

Une sauvegarde de TOUS les joueurs chaque XX minutes pourrait causer des lags si le nombre de joueur est grand il me semble non ? Vu le nombre de requкtes Sql que ca demanderait. Sachant que javais mis une boucle for (hors de la fonction, un SaveAccounts(i); ) chaque XX:00, Et le serveur avec 21 co а ce moment a overlaggй (nouveau mot sisi) а 22h00 exactement.

Je pense pas que ce soit une bonne idйe.
Reply
#14

Sam essaye dйjа avec des requиtes threaded et tu verras. Car justement, leur avantage c'est qu'elles ne fonctionnent PAS comme celles que tu utilisent et donc ne feront pas зa.
Reply
#15

Quote:
Originally Posted by ANDREX
View Post
C'est une mauvaise idйe de sauvegarder tous les comptes des joueurs connectйs, et il y aura sыrement un coup de lag lors de la sauvegarde.
Alors il dois faire des sauvegardes rйguliиres en fonctions des actions qu'effectue le joueurs (don d'argent, nouveau level, etc).

Nlx
Reply
#16

@Noliax Je conseille pas зa perso.

Parce que parfois ta des petits malins qui vont par exemple spam une commande pour payer un joueur par exemple avec 1$ donc зa serait encore pire.

Ou encore spam les retraits/dйpots d'argent en banque ou autre.
Reply
#17

Ne jamais sauvegarder tous les joueurs ensemble, sauvegarde au fur et а mesure que tu modifies leurs statistiques, rien de mieux. Sinon, tu surcharges le serveur SQL
Reply
#18

Oui, pour le moment j'ai retirй la sauvegarde de tout les joueurs en mкme temps car je pense qu'elle йtait la cause du soucis. J'ai pour le moment mis la sauvegarde а la deconnexion du joueur. (Quanf le joueut deco, son compte est save)

Par contre pour les requкtes threadйes vouq pouvez repondre а ma question please ?

Quote:
Originally Posted by Sam'
View Post
Pour les requкtes threadйes il faut le nouveau plugin R39-2 c'est зa ?
Par quoi sont remplacй les fonctions Mysql_num_rows, Mysql_free_result et plusieurs autres fonctions qui m'empкche de changer de plugin ?
Jpourrais trouver les nouvelles methodes sur le wiki ?
Reply
#19

Quote:
Originally Posted by anou1
View Post
@Noliax Je conseille pas зa perso.

Parce que parfois ta des petits malins qui vont par exemple spam une commande pour payer un joueur par exemple avec 1$ donc зa serait encore pire.

Ou encore spam les retraits/dйpots d'argent en banque ou autre.
Aprиs tu peux conditionner, si c'est un transfert de 500 au moins par exemple, je sais pas. Tous dйpend aprиs, si tu risque de crash souvent et d'avoir des pertes, ou pas..

Les requetes theader, c'est aprиs la R7 il me semble, R33. Mais qu'elle est la diffйrence entre les deux, les pro svp?
Reply
#20

Aprиs tu peut toujours garder la sauvegarde uniquement a la dйconnexion et de faire une fonction qui appelle la sauvegarde dans des autres stratйgie

Exemple tout con : Le joueur monte dans un vehicule = Sauvegarde
Le joueur meurt : Sauvegarde
Le joueur ouvre son inventaire : Sauvegarde.

etc...

Peut кtre aussi la puissance du serveur qui en est la cause...
Ou du MYSQL distant (qui est trиs lent)
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)