Page 1 of 1

Makermod G_Alloc bug

Posted: Sun May 27, 2007 9:01 pm
by Corran Horn

Code: Select all

***ERROR: G_Alloc: failed on allocation of 39 bits***
ShutdownGame
--------------------------------------------------------
DROPPED
J'ai ce bug, lorsque le serveur Makermod (sur Windows, celui-ci) bug. As-tu une idée d'où ça vient?

Re: {Support} Serveur dédié Linux

Posted: Sun May 27, 2007 9:23 pm
by Gamall
C'est nécéssairement un bug de makermod, qui gère mal sa mémoire.

Tu devrais le signaler aux devs de makermod.

Une façon de regler le problème serait sans doute de doubler la taille de la mémoire:

Code: Select all

#define POOLSIZE    (256 * 1024) 
faire passer à 512...

Un truc qui est vraiment pas cool, c'est que quand on regarde le code de G_Alloc...

Code: Select all

static char        memoryPool[POOLSIZE];
static int        allocPoint;

void *G_Alloc( int size ) {
    char    *p;

    if ( g_debugAlloc.integer ) {
        G_Printf( "G_Alloc of %i bytes (%i left)\n", size, POOLSIZE - allocPoint - ( ( size + 31 ) & ~31 ) );
    }

    if ( allocPoint + size > POOLSIZE ) {
      G_Error( "G_Alloc: failed on allocation of %i bytes\n", size ); // bk010103 - was %u, but is signed
        return NULL;
    }

    p = &memoryPool[allocPoint];

    allocPoint += ( size + 31 ) & ~31;

    return p;
}
 
cherchez l'erreur 8|

Il y a moyen d'allouer de la mémoire, mais pas de la "désallouer" (ça se dit en français, ça ? :?)

Donc, à vue de nez, je suppose que ce type d'erreur arrive fatalement tôt ou tard... surtout que d'après ce que j'ai compris makermod permet de créer plein d'objets dans le jeu ? Donc il doit faire un bon usage de cette fonction (même si je ne sais pas exatement quel type d'objet du jeu nécéssite ce type d'allocation)

Enfin bref:

soit modifier G_Alloc pour pouvoir récupérer de la mémoire (dev)
soit augmenter la mémoire et reculer l'échéance (dev)
soit redémarrer le serv plus souvent pour désengorger toute la mémoire. (toi)

Dis-moi quand-même dans quelles circonstances tu as ce bug, exactement ?

editPS: Je diviserai le topic après, ça n'a plus rien à voir avec ton serv linux, là :lol

Re: {Support} Serveur dédié Linux

Posted: Sun May 27, 2007 10:49 pm
by Corran Horn
N'importe quand. C'est même pas au chargement de scripts très volumineux, ou autres.

C'est après un certain temps d'utilisation, ça plante. :snif
Enfin bref:

soit modifier G_Alloc pour pouvoir récupérer de la mémoire (dev)
soit augmenter la mémoire et reculer l'échéance (dev)
Comment, et où ? :huh:

Re: {Support} Serveur dédié Linux

Posted: Sun May 27, 2007 11:31 pm
by Gamall
Corran Horn wrote:C'est après un certain temps d'utilisation, ça plante. s:snif s:snif
C'est bien ce que je pensais :)
Gamall wrote:Il y a moyen d'allouer de la mémoire, mais pas de la "désallouer" [...]Donc, à vue de nez, je suppose que ce type d'erreur arrive fatalement tôt ou tard...
Corran Horn wrote:Comment, et où ?
J'ai mis "(dev)" sur les deux premieres solutions pour indiquer que c'est aux devs de makermod de le faire. Personne ne peut le faire à leur place. Cf les deux premières lignes de mon dernier post ;)

Toi, tout ce que tu peux faire c'est :
Gamall wrote:soit redémarrer le serv plus souvent pour désengorger toute la mémoire. (toi)
Tiens, d'ailleurs, en regardant le code il y a une fonction sympa (que je ne connaissais pas) qui permet de savoir où tu en es:

Code: Select all

void Svcmd_GameMem_f( void ) {
    G_Printf( "Game memory status: %i out of %i bytes allocated\n", allocPoint, POOLSIZE );
}

-------------

if (Q_stricmp (cmd, "game_memory") == 0) {
        Svcmd_GameMem_f();
        return qtrue;
    }
 
Fais

Code: Select all

RCON game_memory
pour savoir combien de place il te reste. S'il ne reste pas grand-chose, ça ne va pas tarder à planter. Essaye de faire ça très souvent pour voir quel type d'action bouffe le plus de mem.

Pour info un serveur base ou japlus n'utilise quasiment rien de toute cette mémoire :?

Re: Makermod G_Alloc bug

Posted: Mon May 28, 2007 12:41 am
by Corran Horn
OK, merci. J'vais contacter toast, voir s'il peut améliorer ça.

Pour le "/rcon game_memory", j'vais essayer :D

::merci

Re: Makermod G_Alloc bug

Posted: Mon May 28, 2007 1:01 am
by Gamall
Oh, pendant que j'y pense, je viens de remarquer ces lignes :

Code: Select all

if ( g_debugAlloc.integer ) {
        G_Printf( "G_Alloc of %i bytes (%i left)\n", size, POOLSIZE - allocPoint - ( ( size + 31 ) & ~31 ) );
    } 
Ajoute la ligne

Code: Select all

set g_debugAlloc 1
à ton cfg, et tu verras dans les logs du serveur (logs console, pas logs g_log) à chaque fois que de la mémoire est allouée :) C'est encore mieux que le Rcon :P

Re: Makermod G_Alloc bug

Posted: Tue May 29, 2007 8:42 pm
by Corran Horn
Tu saurais faire, pour Windows, un script qui, soit:

- Rebooterais lorsque game_memory = 500 bytes (par exemple), soit
- Rebooterais tous les X minutes ?

Merci d'avance.

Re: Makermod G_Alloc bug

Posted: Tue May 29, 2007 9:26 pm
by Gamall
- Rebooterais lorsque game_memory = 500 bytes (par exemple), soit
Pas possible avec un batch, il faudrait écrire un programme pour ça. C'est faisable (même facile), mais comme ce n'est pas du tout le type de programme que j'écris habituellement, il faudrait que je passe une demi-journée à apprendre à utiliser des fonctions dont moi, je n'ai pas besoin, avant même de commencer à écrire le prog.

Donc je ne le ferai pas. Sauf si tu me payes pour ça :lol
Corran Horn wrote:- Rebooterais tous les X minutes ?
Sous linux, c'est hyper-fastoche de faire ce genre de script, tant que chaque serv est sur un compte utilisateur distinct. Sinon c'est moins fastoche (faut se traîner les PID). De toutes façons une bonne gestion c'est 1 user <=> 1 serv. Utilise la commande sleep <secondes>. Un truc du genre

Code: Select all

Xstop.sh
Xstart<serv approprié>.sh
sleep 600
Mais note que ça coupe le serv brutalement, même s'il y a 20 personnes dessus.

Sous windows, ça doit être faisable aussi, il y a certainement une commande batch équivalente à sleep. Mais de tête, je ne sais pas. De toutes façons, même pb, ça coupe le serv brutalement.

Ceci dit, il n'y a absolument pas besoin de faire des scripts pour regler ton problème: mets une timelimit courte sur ta map: le map_restart influe aussi sur la mémoire. Comme je n'ai pas de serv makermod je ne peux pas vérifier à quel point. Utilise la commande que j'ai signalée dans mon post précédent pour voir ce qui influe là dessus.

Bon, je retourne voir mon film, moi :lol

Re: Makermod G_Alloc bug

Posted: Tue May 29, 2007 10:28 pm
by Corran Horn
Il y a moyen de faire une commande style "svsay Le serveur va rebooter dans 30 secondes; wait X, map_Restart" ?

A la place du timelimit? xD
Ou quelque chose du genre, histoire que les joueurs puissent sauvegarder à temps leurs créations.

Re: Makermod G_Alloc bug

Posted: Tue May 29, 2007 10:37 pm
by Gamall
Oui, il y a moyen.

Un truc du genre

Code: Select all

set nextmap "vstr X"
set _X "set nextmap vstr X"

set X "svsay Le serveur va rebooter dans 30 secondes; wait <selon la puissance de l'ordi>; map_restart; vstr _X"
devrait marcher. Je pense.