Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Arrêt (ou plantage) d'un serveur

7 réponses
Avatar
d4r0k1n
Bonjour,

J'ai d=E9velopp=E9 un serveur en C (sockets et multithread) pour g=E9rer
des jeux multijoueurs jouable sur le net. Apr=E8s plusieurs tests en
local pour tester sa r=E9sistance, je le met en production (sur un
serveur de chez ovh =E0 base de red-hat pour info).
Le serveur est donc fonctionnelle mais quelques heures plus tard, celui
ci est arr=EAt=E9 brusquement. Je ne peux m=EAme pas savoir si il a
plant=E9 car je n'ai pas d'erreur dans mon fichier de log, et m=EAme en
redirigeant stdin et stderr dans un fichier en lancant le serveur,
celui ci s'arr=EAte au bout d'un moment mais je n'ai pas de message
d'erreur sp=E9cifique. Ce n'est pas un signal SIGTERM qui fait fermer
mon serveur car sinon j'en aurais une trace dans mon fichier de log.
C'est emb=EAtant car je n'ai pas d'info sur ce qui pourrait arr=EAter
(faire planter) mon serveur.
Je l'ai lanc=E9 avec 'gdb' en redirigeant la sortie dans un fichier. Une
fois le serveur arr=EAt=E9 de nouveau (contre mon gr=E9), je regarde la
sortie de gdb et ca s'est arr=EAt=E9 en plein milieu d'une ligne, genre :
"New Thread (LWP 1...." et plus rien, et pas de message d'erreur ou
autre.

Aussi j'aimerais savoir si je pourrais avoir un moyen de conna=EEtre
plus d'informations sur les raisons de cet arr=EAt.
Si vous connaissez un soft ou quelquechose =E0 essayer pour avancer dans
mon probl=E8me, merci d'avance.

7 réponses

Avatar
Harpo
wrote:

Le serveur est donc fonctionnelle mais quelques heures plus tard,
celui ci est arrêté brusquement.


Peut-être un quota ou une limite pour l'utilisateur. Enfin, je dis ça,
c'est juste le premier truc qui me fiens à l'esprit.

--
http://patrick.davalan.free.fr/

Avatar
d4r0k1n
Merci je suis en train de chercher si il y a des limitations au niveau
du nombre de threads ou autre sur les serveurs dédiés OVH.

Mais c'est bien mon serveur (soft) qui plante (ou quitte ?), le serveur
(hard) lui n'a pas de probleme. Ce que je ne comprends, c'est que je ne
récupère pas le moindre message d'erreur ou autre...

Je précise aussi que le serveur (soft) fait des requete SQL via
lmysqlclient dans une thread et ceci toutes les secondes...Mais je ne
peux pas savoir d'où vient la source de mon problème...

Quelqu'un saurait si je peux avoir des chances de capter un message
d'erreur ou autre en lancant mon serveur avec 'gdb' et certaines
options ? Ou encore un autre débuggeur ? Ou un fichier de log qui me
donnerai la moindre information ?
Avatar
Harpo
wrote:

Quelqu'un saurait si je peux avoir des chances de capter un message
d'erreur ou autre en lancant mon serveur avec 'gdb' et certaines
options ? Ou encore un autre débuggeur ?


Essaie strace.

--
http://patrick.davalan.free.fr/

Avatar
d4r0k1n
Merci pour la commande 'strace', je connaissais pas...
Et ca à l'air bien bavard donc j'espère que ca m'avancera...

Merci encore
Avatar
Stan
a écrit dans le message de news:

Bonjour,



Aussi j'aimerais savoir si je pourrais avoir un moyen de connaître
plus d'informations sur les raisons de cet arrêt.
Si vous connaissez un soft ou quelquechose à essayer pour avancer dans
mon problème, merci d'avance.


Est-ce que tout les code erreurs de vos appels systèmes sont bien
logué ou tracé ?

Sinon, l'erreur classique des dev multithread, c'est un deadlock qq part.

En plus des log d'erreurs, vous pouvez aussi logguer le passage dans
certaine fonctions; on est parfois surpris de ce qui nous parait évident à
la lecture
du code est en faite une mauvaise interprétation de notre part.

--
-Stan

Avatar
d4r0k1n

Est-ce que tout les code erreurs de vos appels systèmes sont bien
logué ou tracé ?


Oui, toutes les erreurs des syscalls sont tracées mais justement rien
ne semble anormal dans le fonctionnement du serveur...

Voici la fin des logs de strace :

27246 --- SIGRT_0 (Real-time signal 0) ---
27246 <... rt_sigsuspend resumed> ) = -1 EINTR (Interrupted system
call)
27246 sigreturn() = ? (mask now [])
27246 nanosleep({0, 80000}, NULL) = 0
27246 accept(5, {sin_family¯_INET, sin_port=htons(4013),
sin_addr=inet_addr("81.247.184.62")}}, [16]) = 32
27246 rt_sigprocmask(SIG_SETMASK, NULL, [32], 8) = 0
27246 write(7,
"2403253@P372377277324244410230n710"..., 148) =
148
27246 rt_sigprocmask(SIG_SETMASK, NULL, [32], 8) = 0
27246 rt_sigsuspend([] <unfinished ...>
27246 --- SIGRT_0 (Real-time signal 0) ---
27246 <... rt_sigsuspend resumed> ) = -1 EINTR (Interrupted system
call)
27246 sigreturn() = ? (mask now [])
27246 nanosleep({0, 80000}, NULL) = 0
27246 accept(5, 0xbffffa90, [16]) = ? ERESTARTSYS (To be
restarted)
27246 --- SIGRT_1 (Real-time signal 1) ---
27246 wait4(25436, <unfinished ...>

Dans le man d'accept, il est dit que l'erreur ERESTARTSYS "peut être
rencontrée durant le suivi par un débuggeur" donc je ne suis même
pas sûr que cela avance mon problème...
En tout cas ce message n'est visible qu'à la fin des fichiers de log
de strace.
J'ai regardé sur le net mais je n'ai pas vraiment eu plus
d'informations sur ce type d'erreur.

Suggestions et idées bienvenues...

Avatar
d4r0k1n
Encore une petite question :

Si mon appli à un problème de deadlock (si les mutex ne fonctionnent
pas parfaitement), je peux avoir des clients (threads) qui sont figées
...ou encore une variable globale (partagées) pas "en phase" et si
c'est un pointeur, risquer d'écrire n'importe où ??
Mais dans ce cas j'aurais un segfault ?
Je ne vois pas comment un problème dans les mutex pourrait faire
quitter mon serveur sans avoir le moindre message d'erreur. (??)