| Scroll Ignore | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||
|
Libération de ressources lors de la création d'un processus (fork)
Pour exécuter certaines tâches ( Modules, Workers, ... ), le Broker doit créer de nouveaux processus sur le système.
Sur les environnements UNIX et notamment Linux, la procédure pour créer un nouveau processus consiste à dupliquer le processus courant. L'appel système associé se nomme fork, ainsi, cette action est souvent appelée un fork.
Sous Linux, l'opération de fork est rapide, l'allocation effective de la mémoire du nouveau processus se faisant lorsque le nouveau processus veut y accéder.
Python disposant d'un garbage collector, un outil parcourant la mémoire pour identifier les zones inutilisées et la restituer au système, la mémoire héritée du parent finit par être intégralement copiée dans le nouveau processus.
Pour éviter une consommation inutile de ressources, après le fork, on nettoie les données inutiles issues du processus père (mémoire principalement)
Plus concrètement, le Broker va supprimer les données produites par les modules qu'il a instanciés.
Les modules peuvent fournir une méthode pour gérer la libération de leurs ressources.
Dans tous les cas, le log suivant permet de suivre le nettoyage des ressources :
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] INFO: [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] cleanup is starting [YYYY-MM-DD HH:MM:SS] INFO: [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] cleanup done in X.XXXs |
| Code Block | ||||
|---|---|---|---|---|
| ||||
[2021-10-11 06:10:52] INFO : [ WebUI ] [ CLEAN AFTER FORK ] [ pid:3736 ] cleanup is starting [2021-10-11 06:10:52] INFO : [ WebUI ] [ CLEAN AFTER FORK ] [ pid:3736 ] cleanup done in 0.143s |
Une erreur survient pendant le nettoyage des ressources d'un module
Si la méthode de nettoyage d'un module rencontre une erreur, on retrouvera le log qui suit.
Certaines ressources (la mémoire notamment) peuvent ne pas avoir été libérées, mais si le système en a suffisamment de disponibles, Shinken fonctionnera normalement.
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] ERROR : [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] [ MODULE_NAME2 ] On linux system, the forking mechanism (process creation) is fast but create a copy of the father process. So we have to release unnecessary resources inherited from father. The cleaning has been performed but we encountered an error: [YYYY-MM-DD HH:MM:SS] ERROR : [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] [ MODULE_NAME2 ] Cleanup of data from module 〖 MODULE_NAME2 〗 raised error 〖 IOError occurred 〗 [YYYY-MM-DD HH:MM:SS] ERROR : [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] [ MODULE_NAME2 ] Some memory may have not been freed. Shinken will still run if enough memory remains available. [YYYY-MM-DD HH:MM:SS] ERROR : [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] [ MODULE_NAME2 ] You can report this message to support in order to optimize Shinken memory consumption [YYYY-MM-DD HH:MM:SS] ERROR : [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] [ MODULE_NAME2 ] ERROR stack : Traceback (most recent call last): [YYYY-MM-DD HH:MM:SS] ERROR : [ MODULE_NAME ] [ CLEAN AFTER FORK ] [ pid:PID] [ MODULE_NAME2 ] ERREUR PYTHON |
| Code Block | ||||
|---|---|---|---|---|
| ||||
[2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] On linux system, the forking mechanism (process creation) is fast but create a copy of the father process. So we have to release unnecessary resources inherited from father. The cleaning has been performed but we encountered an error: [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] Cleanup of data from module 〖 sla 〗 raised error 〖 IOError occurred 〗 [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] Some memory may have not been freed. Shinken will still run if enough memory remains available. [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] You can report this message to support in order to optimize Shinken memory consumption [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] ERROR stack : Traceback (most recent call last): [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] File "/usr/lib/python2.7/site-packages/shinken/modulesmanager.py", line 877, in do_after_fork_cleanup [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] inst_cleanup() [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] File "/var/lib/shinken/modules/sla/sla_module_broker.py", line 93, in after_fork_cleanup [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] raise IOError(u'IOError occurred') [2021-09-29 15:05:58] ERROR : [ Livestatus ] [ CLEAN AFTER FORK ] [ pid:20404 ] [ sla ] IOError: IOError occurred |
Envoi et réception de commande entre plusieurs processus
Les logs suivants permettent de suivre l'envoi et la réception de commande se faisant entre plusieurs processus.
Il existe deux types de communications par commande :
- Communication entre le Broker et un de ses modules
- Communication entre un module et un de ses workers
Envoi d'une commande
Warning
Dans le cas d'un premier timeout d'une réussite de l'envoi de la commande, jusqu'à sa réception, ce log s'affichera :. La commande sera alors renvoyée une deuxième fois.
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] DEBUG WARNING : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] The command call call [NOM_DE_LA_COMMANDE] was executed by the for module NOM_DU_MODULE did intimeout TEMPS_D'EXECUTIONs(TEMPS_TIMEOUTs). We will retry one time. |
| Code Block | ||||
|---|---|---|---|---|
| Code Block | ||||
| ||||
[2020-11-17 09:12:11] DEBUGWARNING : [ broker-master ] [ Livestatus ] The command call [get_module_info] for module Livestatus was executedsent bybut the module Livestatus in 0.143s |
Warning
call did timeout (1s). We will retry one time. |
Il peut arriver qu'à l'envoi Dans le cas d'un premier timeout d'une commande une autre réponse soit reçue, si la précédente commande n'a pas fonctionné par exemple. Dans ce cas, ce log s'affichera. La commande sera alors renvoyée une deuxième foisafin de récupérer la bonne réponse.
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] WARNING : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] The command call call [NOM_DE_LA_COMMANDE] for was called module NOM_DU_MODULE did timeout (TEMPS_TIMEOUTs). We will retry one time.but another respond was present. Retrying. |
| Code Blockcode | ||||
|---|---|---|---|---|
| ||||
[2020-11-17 09:12:11] WARNING : [ broker-master ] [ Livestatus ] The command call [get_module_info] for module Livestatus was sentcalled but theanother callrespond did timeout (1s). We will retry one time. |
was present. Retrying. |
Error
Si l'envoi de la commande a connu un premier timeout, à son deuxième elle passera en erreur et ne sera pas renvoyée. Ce log sera affiché :
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] WARNING ERROR : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] The Fail to send command call call [NOM_DE_LA_COMMANDE] was for called but another respond was present. Retryingmodule NOM_DU_MODULE because the module did timeout (TEMPS_TIMEOUTs). |
| Code Block | ||||
|---|---|---|---|---|
| ||||
[2020-11-17 09:12:11] WARNINGERROR : [ broker-master ] [ Livestatus ] Fail Theto send command call [get_module_info] wasfor module calledLivestatus butbecause anotherthe respondmodule wasdid present. Retrying. |
Error
timeout (1s). |
Il peut arriver que la commande échoue à cause d'un problème du côté du module/worker. Dans ce cas ce log sera affiché après l'affichage de la stack.Si l'envoi de la commande a connu un premier timeout, à son deuxième elle passera en erreur et ne sera pas renvoyée. Ce log sera affiché :
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] ERROR : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] Fail to send command call [NOM_DE_LA_COMMANDE] for module NOM_DU_MODULE because theof modulean didunknown timeouterror (TEMPS_TIMEOUTs).MESSAGE_D'ERREUR |
| Code Block | ||||
|---|---|---|---|---|
| ||||
[2020-11-17 09:12:11] ERROR : [ broker-master ] [ Livestatus ] Fail to send command call [get_module_info] for module Livestatus because theof module did timeout (1s). |
an unknown error 'int' object is not iterable |
Debug
Dans le cas d'une réussite de l'envoi de la commande, jusqu'à sa réception, ce log s'affichera :
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] ERROR DEBUG : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] FailThe tocommand send commandcall call [NOM_DE_LA_COMMANDE] for was executed by the module NOM_DU_MODULE becauseMODULE of an unknown error MESSAGEin TEMPS_D'ERREUREXECUTIONs |
| Code Block | ||||
|---|---|---|---|---|
| ||||
[2020-11-17 09:12:11] ERRORDEBUG : [ broker-master ] [ Livestatus ] Fail to sendThe command call [get_module_info] forwas moduleexecuted Livestatusby becausethe ofmodule anLivestatus unknown error 'int' object is not iterablein 0.143s |
Réception d'une commande
Debug
Warning
Si une commande inconnue est reçueAu moment de la réception de la commande, si cette dernière est exécutable, ce log sera affiché :
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] DEBUG WARNING : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] [PID:PID_DU_PROCESSUS] Received Executingunknown command [NOM_DE_LA_COMMANDE] withfrom father param LISTE_DES_PARAMETRESprocess ! |
| Code Block | ||||
|---|---|---|---|---|
| ||||
[2020-11-17 09:12:11] DEBUGWARNING : [ broker-master ] [ Livestatus ] [PID:2564] Received Executingunknown command [get_module_info] from withfather paramprocess []! |
Error
Si une la commande inconnue est reçuecrash, ce log sera affiché :
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] WARNINGERROR : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] [PID:PID_DU_PROCESSUS] Received unknown ] Our father process did send us the command [NOM_DE_LA_COMMANDE] that fromdid father process !fail: TRACEBACK |
| Code Block | ||||
|---|---|---|---|---|
| ||||
[2020-11-17 09:12:11] WARNINGERROR : [ broker-master ] [ Livestatus ] [PID:2564] Received unknown Our father process did send us the command [get_module_info] fromthat father process ! |
Error
Si la commande crash, ce log sera affiché :
| Code Block | ||||
|---|---|---|---|---|
[YYYY-MM-DD HH:MM:SS] ERRORdid fail: [2020-11-17 09:12:11] ERROR : [ NOM_DU_BROKERbroker-master ] [ Livestatus NOM_DU_MODULE ] Our father process did send us] theTraceback command [NOM_DE_LA_COMMANDE] that did fail: TRACEBACK | ||||
| Code Block | ||||
| ||||
(most recent call last): [2020-11-17 09:12:11] ERROR : [ broker-master ] [ Livestatus ] Our father process did send us the command [get_module_info] that did fail: File "C:\dev\workspace\shinken-enterprise\sources\framework\shinken\shinken\basesubprocess.py", line 117, in get_and_execute_command_from_master [2020-11-17 09:12:11] ERROR : [ broker-master ] [ Livestatus ] Traceback (most recentresult call= lastf(): [2020-11-17 09:12:11] ERROR : [ broker-master ] [ Livestatus ] File "C:\dev\workspace\shinken-enterprise\sources\framework\shinken\shinken\basesubprocesstesting\test_command_queue_handler.py", line 11743, in get_and_executefail_command_from_master [2020-11-17 09:12:11] ERROR : [ broker-master ] [ Livestatus ] result = f()raise Exception [2020-11-17 09:12:11] ERROR : [ broker-master ] [ Livestatus ] Exception |
Debug
Au moment de la réception de la commande, si cette dernière est exécutable, ce log sera affiché :
| Code Block |
|---|
[YYYY-MM-DD HH:MM:SS] DEBUG : [ NOM_DU_BROKER ] [ NOM_DU_MODULE ] [PID:PID_DU_PROCESSUS] Executing command [NOM_DE_LA_COMMANDE] with param LISTE_DES_PARAMETRES |
| Code Block | ||||
|---|---|---|---|---|
| ||||
File "C:\dev\workspace\shinken-enterprise\testing\test_command_queue_handler.py", line 43, in fail_command [2020-11-17 09:12:11] ERRORDEBUG : [ broker-master ] [ Livestatus ] raise Exception [2020-11-17 09:12:11] ERROR : [ broker-master ] [ Livestatus ] Exception[PID:2564] Executing command [get_module_info] with param [] |