Makermod G_Alloc bug

Forum concernant ce jeu et les serveurs que j'héberge. (ce sous-forum remplace conseiljedi.com)
Post Reply
User avatar
Corran Horn
Posts: 26
Joined: Wed May 23, 2007 1:43 am

Makermod G_Alloc bug

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

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?
Last edited by Gamall on Mon May 28, 2007 8:42 pm, edited 1 time in total.
Reason: split topic

User avatar
Gamall
Hic sunt dracones
Posts: 4145
Joined: Fri May 26, 2006 11:09 pm
Contact:

Re: {Support} Serveur dédié Linux

Post by Gamall » Sun May 27, 2007 9:23 pm

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
{<§ Gamall Wednesday Ida §>}
{ Mods and Programs - Mods TES-IV Oblivion }

User avatar
Corran Horn
Posts: 26
Joined: Wed May 23, 2007 1:43 am

Re: {Support} Serveur dédié Linux

Post by Corran Horn » Sun May 27, 2007 10:49 pm

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:

User avatar
Gamall
Hic sunt dracones
Posts: 4145
Joined: Fri May 26, 2006 11:09 pm
Contact:

Re: {Support} Serveur dédié Linux

Post by Gamall » Sun May 27, 2007 11:31 pm

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 :?
{<§ Gamall Wednesday Ida §>}
{ Mods and Programs - Mods TES-IV Oblivion }

User avatar
Corran Horn
Posts: 26
Joined: Wed May 23, 2007 1:43 am

Re: Makermod G_Alloc bug

Post by Corran Horn » Mon May 28, 2007 12:41 am

OK, merci. J'vais contacter toast, voir s'il peut améliorer ça.

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

::merci

User avatar
Gamall
Hic sunt dracones
Posts: 4145
Joined: Fri May 26, 2006 11:09 pm
Contact:

Re: Makermod G_Alloc bug

Post by Gamall » Mon May 28, 2007 1:01 am

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
{<§ Gamall Wednesday Ida §>}
{ Mods and Programs - Mods TES-IV Oblivion }

User avatar
Corran Horn
Posts: 26
Joined: Wed May 23, 2007 1:43 am

Re: Makermod G_Alloc bug

Post by Corran Horn » Tue May 29, 2007 8:42 pm

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.

User avatar
Gamall
Hic sunt dracones
Posts: 4145
Joined: Fri May 26, 2006 11:09 pm
Contact:

Re: Makermod G_Alloc bug

Post by Gamall » Tue May 29, 2007 9:26 pm

- 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
{<§ Gamall Wednesday Ida §>}
{ Mods and Programs - Mods TES-IV Oblivion }

User avatar
Corran Horn
Posts: 26
Joined: Wed May 23, 2007 1:43 am

Re: Makermod G_Alloc bug

Post by Corran Horn » Tue May 29, 2007 10:28 pm

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.

User avatar
Gamall
Hic sunt dracones
Posts: 4145
Joined: Fri May 26, 2006 11:09 pm
Contact:

Re: Makermod G_Alloc bug

Post by Gamall » Tue May 29, 2007 10:37 pm

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.
{<§ Gamall Wednesday Ida §>}
{ Mods and Programs - Mods TES-IV Oblivion }

Post Reply

Who is online

Users browsing this forum: No registered users and 118 guests