-
Compteur de contenus
25 878 -
Inscription
-
Dernière visite
-
Jours gagnés
1 256
Tout ce qui a été posté par Lazer
-
Sur la VM Debian, création d'une page Web eco.html servie par Apache contenant un JSON basique (issu d'un Eco-Devices) : {"product":"Eco-devices","T1_PTEC":"HC..","T1_PAPP":1560,"T1_HCHP":11861401,"T1_HCHC":9250490,"T2_PTEC":"----","T2_PAPP":0,"T2_BASE":0,"INDEX_C1":3371475,"INDEX_C2":2829685} . Sur la HC2, création d'un VD avec un bouton contenant le code suivant : -- Test de charge fibaro:debug("Starting loop...") local selfID = fibaro:getSelfId() local ip = fibaro:get(selfID, 'IPAddress') local port = fibaro:get(selfID, 'TCPPort') local i = 0 while i < 1000 do local WEB = Net.FHttp(ip, tonumber(port)) local response, status, errorCode = WEB:GET("/eco.html?i="..tostring(i)) if tonumber(errorCode) == 0 and tonumber(status) == 200 and response ~= nil and response ~= "" then fibaro:debug("i="..i.." memory="..collectgarbage("count")) else fibaro:debug("Erreur : i="..i) end i = i + 1 --WEB = nil --collectgarbage("collect") end fibaro:debug("Loop finished") . Après enregistrement du VD, sous Linux, on récupère le PID du process associé au VD : root@fghc2:~# ps -ef | grep "PluginManager 15" root 1754 1 0 16:21 ? 00:00:00 /opt/fibaro/PluginManager 15 startMainLoop 0 0 ... De base, ce VD a déjà 26 descripteurs de fichiers ouverts : root@fghc2:~# ls /proc/1754/fd | wc -l 26 . On lance le test en appuyant sur le bouton du VD. Dans la fenêtre de debug : [DEBUG] 16:34:41: Starting loop... [DEBUG] 16:34:41: i=0 memory=32.888671875 [DEBUG] 16:34:41: i=1 memory=33.0341796875 [DEBUG] 16:34:41: i=2 memory=33.181640625 [DEBUG] 16:34:41: i=3 memory=33.3271484375 [DEBUG] 16:34:41: i=4 memory=33.474609375 ... [DEBUG] 16:34:43: i=992 memory=50.4111328125 [DEBUG] 16:34:43: i=993 memory=50.564453125 [DEBUG] 16:34:43: i=994 memory=50.7158203125 [DEBUG] 16:34:43: i=995 memory=50.869140625 [DEBUG] 16:34:43: i=996 memory=51.0205078125 Cela s'arrête brusquement à la 997ème itération, sans jamais arriver au message "Loop Finished". L’exécution est très rapide, cela ne prend que 2 secondes (donc environ 500 requêtes http par seconde, le LUA est décidément un langage très rapide, bien plus que le Shell). L'occupation mémoire du moteur LUA reste très contenue, ne montant qu'à 51 ko. Sous Linux, on observe l'apparition d'un core dump : root@fghc2:~# ls -l /core -rw------- 1 root root 9261056 Jan 19 16:21 /core Cela s'exécute tellement vite que je n'ai pas le temps de monitorer le nombre de fichiers ouverts, mais de toute évidence on atteint la fameuse limite de 1024 fixée par le ulimit du système (26 + 997 = 1023). Dans le code LUA, j'ai mis en commentaire les 2 lignes suivantes à la fin de la boucle while : WEB = nil collectgarbage("collect") Si on les décommente et qu'on relance le test, on constate que la RAM utilisée par le moteur LUA n'augmente pas et se limite à 30 ko. En revanche les performances sont bien inférieures, car on force le garbage collector à tourner à chaque passage dans la boucle. Mais surtout, le nombre de descripteurs de fichiers atteint quand même 1024, occasionnant quand même le crash du VD avant de terminer la boucle : [DEBUG] 16:21:25: Starting loop... [DEBUG] 16:21:25: i=0 memory=32.9609375 [DEBUG] 16:21:25: i=1 memory=30.333984375 [DEBUG] 16:21:25: i=2 memory=30.365234375 [DEBUG] 16:21:25: i=3 memory=30.365234375 ... [DEBUG] 16:21:27: i=993 memory=30.369140625 [DEBUG] 16:21:27: i=994 memory=30.369140625 [DEBUG] 16:21:27: i=995 memory=30.369140625 [DEBUG] 16:21:27: i=996 memory=30.369140625 . Enfin, si on sort la ligne local WEB = Net.FHttp(...) de la boucle while, pour le positionner avant d'entrer dans la boucle, il n'y a qu'un seul socket TCP utilisé durant tout le script, donc la boucle s'exécute parfaitement. Je suis allé à 10'000 itérations sans faire broncher la box, et c'est encore plus rapide (car il n'y a pas besoin de rouvrir un socket à chaque passage dans la boucle, opération de loin la plus longue sur la totalité des instructions présentes) Conclusion de ce test : Cela se confirme, on a donc bien une limitation à 1024 fichiers ouverts par chaque process (chaque VD, Scène, Plugin étant dans des process séparés). Avec ce petit benchmark; volontairement violent, on atteint en 2 seconde la limite, et donc le crash (core dump) du process lié au module virtuel. Le test suivant sera de faire un bench un peu plus représentatif de nos modules virtuels que nous utilisons couramment. C'est à dire d'exploiter la Main Loop et son sleep() de 3 seconde à chaque passage dans la boucle. Cela laissera le temps de monitorer les descripteurs de fichiers ouverts au niveau Linux, et de voir si la main loop ouvre les sockets plus vite que la pile TCP/IP les libère.
-
Comme je le disais, la config Apache est ultra standard (/etc/apache2/sites-available/default) : <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options FollowSymLinks MultiViews IncludesNOEXEC AllowOverride All Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> # ProxyRequests On ProxyPass /api http://127.0.0.1:11111/api retry=0 Options +Includes AddType text/html .html AddOutputFilter INCLUDES .html </VirtualHost> La seule ligne intéressante, c'est le ProxyPass. Le process HCServer écoute bien sur le port 11111 : root@fghc2:~# netstat -aep | grep LISTEN | grep 11111 tcp 0 0 *:11111 *:* LISTEN root 4485 1350/HCServer . Je fais le test en LUA dès que possible. Par contre je suis en train de penser que mon test d'hier soir n'est pas représentatif du bug rencontré sur Homebirdge. Car je me suis contenté de surveiller le crash des process, mais le problème est différent avec Homebirdge ; apparemment, plus aucun ordre Z-Wave ne passe, donc ce n'est pas tout à fait pareil....
-
t'as un 486 DX2 66 MHz ? :huh: :huh:
- 478 réponses
-
- 1
-
- tuto hc2 et hcl
- toolkit
- (et 4 en plus)
-
Non Apache c'est bien les process httpd classiques, indépendants des développements Fibaro. Idem pour PHP. Je regarderai la conf demain, mais c'est du relativement standard de mémoire. HCServer c'est le processus principal de la box (en C compilé, donc on ne sais pas ce qu'il y a dedans). C'est un espèce d'ordonnanceur, qui va communiquer vers les process Z-Wave, le DB Updater, les VD, Scène, Plugins, etc... Ce HCServer est notamment responsable de l'API, pour rappel tout passe par l'API (nos scripts, nos commande LUA de type fibaro;call(...) setvalue(...) etc et aussi l'interface Web, les applis mobiles, etc). L'API est disponible via l'URL /api sur le port 11111 en localhost uniquement (proxy Apache local), et c'est le process HCServer qui écoute sur ce port, donc c'est lui qui traite toutes les requêtes. Lors de mon test de charge aujourd'hui, c'était bien le process HCServer qui était logiquement responsable de la majorité du %User CPU (et un peu de %Syst, car il fait des appels systèmes aussi) En effet pour Homebridge c'est assez mystérieux.... je ne l'utilise pas, mais il faudrait monitorer la box (en root bien sà»r) durant toute la phase de fonctionnement, jusqu'au crash. J'envisage 2 cas possible : - une augmentation d'un paramètre, qui finit par mener au crash (à priori on a exclu les sockets TCP et la RAM avec le test d'aujourd'hui, mais on est peut être passé à coté d'un autre paramètre critique) - le chaos, c'est à dire un développement anarchique purement Fibaro, qui fait que le bug se produit de façon aléatoire. Les requêtes répétées de Homebridge ne font qu'augmenter la probabilité d'occasionner ce bug. Mon test d'aujourd'hui également, peut être qu'en le laissant tourner une journée complète ça finirait par arriver.
-
Du coup, je propose de réinitialiser le compteur de message de Pascaldu54 à0. Vous êtes tout d'accord bien sûr ?
-
Test violent depuis un Linux : une requête http toutes les 30ms vers /api/devices : while [ 1 ] do curl --silent -u admin:password http://192.168.x.y/api/devices > /dev/null done A la louche, ça fait donc environ 30 requêtes à seconde. J'ai laissé tourné environ 10 minutes..... soit plus de 18000 requêtes HTTP ! Sur la HC2, le nombre de connexions en TIME_WAIT monte assez vite, puis se stabilise : root@fghc2:~# netstat -a | grep TIME_WAIT | wc -l 4188 root@fghc2:~# netstat -a | grep TIME_WAIT | wc -l 4232 root@fghc2:~# netstat -a | grep TIME_WAIT | wc -l 4075 root@fghc2:~# netstat -a | grep TIME_WAIT | wc -l 4622 root@fghc2:~# netstat -a | grep TIME_WAIT | wc -l 4338 Coté client (ma VM Debian), on a sensiblement le même nombre de TIME_WAIT. Aucun process n'a crashé, et en particulier le HCServer qui est responsable des 503 Unavailable Error : root@fghc2:~# screen -ls There are screens on: 1386.LILIServer (01/14/2016 06:26:47 PM) (Detached) 1383.Zwave (01/14/2016 06:26:47 PM) (Detached) 1335.Router (01/14/2016 06:26:43 PM) (Detached) 1327.RemoteAccess (01/14/2016 06:26:43 PM) (Detached) 1348.HCServer (01/14/2016 06:26:43 PM) (Detached) 1330.DbUpdater (01/14/2016 06:26:43 PM) (Detached) 1256.GPIOServer (01/14/2016 06:26:36 PM) (Detached) 7 Sockets in /var/run/screen/S-root. L'utilisation en RAM est totalement stable durant ce test (version 4.063 Beta) : root@fghc2:~# free -m total used free shared buffers cached Mem: 993 470 522 0 61 233 -/+ buffers/cache: 175 817 Swap: 243 0 243 Après : root@fghc2:~# free -m total used free shared buffers cached Mem: 993 469 523 0 61 231 -/+ buffers/cache: 176 816 Swap: 243 0 243 Bref, on peut y aller niveau charge sur l'API, la HC2 encaisse sans souci. Donc on en revient toujours au même : les crashs ne sont pas dus à une charge excessive, puisque notre HC2 ne fait rien en temps normal (charge CPU moyenne très largement inférieure à 10%, plutôt proche du pourcent.....) Demain je ferai le test inverse, en utilisant la HC2 comme client http. Il faut que je monte un Apache sur ma VM pour donner un peu de données à ingurgiter à la HC2. Si tu as une idée d'un autre test que je peux faire, c'est le moment
-
mprinfo est parti mais voici Pascaldu54, pro-jeedom
-
C'est moi ou le forum est ànouveau très lent en ce moment ?
-
Si j'ai le temps ce soir, j'essaierai de monter une maquette avec ma HC2 de test et mon serveur Xeon en face.... test de requêtes http massives dans un sens, puis dans l'autre, afin de voir si on arrive àcrasher la HC2.
-
J'ajoute que Fibaro utilise lui-même massivement l'API http pour ses propres besoins.... donc entre ça et mes propres scripts LUA, en fin de compte il n'est pas étonnant d'avoir autant de TIME-WAIT, qui signifie que les sockets sont bien fermées.
-
Non les ESTABLISHED sont bien fermées systématiquement. J'ai plus de ESTABLISHED dues àmes connexions SSH qu'aux connexions Web, c'est dire ! Au moins les sockets sont bien fermées àchaque fois qu'on sort de la boucle LUA.
-
root@fghc2:~# ulimit -Ha core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited Apparemment, les TIME_WAIT ne sont pas un souci, on reste sur des valeurs assez faibles : http://vincent.bernat.im/fr/blog/2014-tcp-time-wait-state-linux.html Il semble que les TIME_WAIT sont supprimés au bout de 1 à4 minutes, donc vu que j'ai plusieurs VD qui font plusieurs Net.FHTTP(), ce n'est pas aberrant.
-
Limites systèmes : root@fghc2:~# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited Je viens de comparer avec une installation par défaut de Debian 6, c'est exactement pareil, donc FIbaro n'a rien modifié. Effectivement, je pense que tu as mis le doit sur un point intéressant...; open files = 1024 et regarde ça : root@fghc2:~# netstat -a | grep TIME_WAIT | wc -l 1101 Faut que j’identifie les sockets pour voir par quels process ils sont ouverts....
-
je t'avoue que j'ai jamais pensé àsurveiller les sockets. J'ai étudié l'utilisation mémoire des process, ainsi que le nombre de thread (plusieurs centaines, en augmentation continue pour un seul process, làaussi il y a un problème) Ca serait intéressant que j'étudie également les sockets.... Mais la pile TCP/IP est censée les fermer comme tu le fais remarquer.
-
j'ai eu des plantages avec plus de 50 % de RAM libre. Et les plantages peuvent arriver sur tout : VD, Scène, voire process principal (HC Serveur), et pourtant tout cela est dans des process différents au niveau OS LInux. Les crash que j'ai observé sont des core dump, très aléatoire (entre 3h après le reboot de la box, et plusieurs mois après le reboot) donc ce n'est pas une conséquence d'une grande utilisation de la RAM, sinon le process ne planterait pas et la RAM utilisée augmenterait, de même que le swap (paging space). A noter de plus que l'utilisation RAM d'un process de type VD, Scène, ou Plugin, augmente rapidemment pour atteindre son régime de croisière, puis se stabilise autour d'une valeur nominale (modérée), qui varie légèrement en fonction du déclenchement du garbage collector. Le Garbage Collector est très bien décrit dans les docs LUA, je ne me souviens plus bien de l’intervalle, mais tu peux retrouver l'info facilement, et même le déclencher manuellement si tu veux. -- Appeler manuellement le garbage collector collectgarbage("collect") Tu peux aussi surveiller la consommation mémoire : -- getCurrentMemoryUsed() return total current memory in use by lua interpreter in kilobytes -- collectgarbage("count") permet de vérifier la "gestion de la mémoire". -- Attention Le Mainloop et les boutons sont des Sandbox (bacs à sable), le collectgarbage("count") retourne uniquement la mémoire utilisée par le script dans le sandbox. getCurrentMemoryUsed = (function() return collectgarbage("count"); end) Si tu veux aller plus loin, root ta box, surveille les process et la RAM globale du système, et tu verras que tu ne peux rien faire. C'est codé avec les pieds, on est obligé de faire avec. J'ai contourné le problème avec un watchdog (dans ma signature) qui relance les VD/Scènes quand ils plantent à tord (core dump) ou à raison (erreur de syntaxe LUA).
-
Sujet déplacé, merci de ne pas poster dans la section pour les nuls, réservé aux tutos. Essaye le format PNG, je ne pense pas que le JPEG soit accepté.
-
Concernant la stabilité, j'ai des VD qui tournent en boucle infinie, et qui ne plantent pas, que je libère la connexion HTTP ou pas (j'ai testé dans les 2 cas). Donc je ne pense pas que cela ait un impact sur la stabilité de la box. Comme je l'avais déjà précisé ailleurs, notre code LUA est exécuté par l'interpréteur LUA, qui est une librairie standard, non développée par Fibaro. Et jusqu'à preuve du contraire, le LUA est un langage robuste, avec un garbage collecteur efficace, qui rattrape nos erreurs de programmation. Les instabilités de la HC2 ne sont pas dues à nos quelques centaines de lignes en LUA, mais à ce qu'à développé FIbaro. Certainement des fuites mémoires non maitrisées.... auxquelles nous ne pouvons rien faire.
-
PS : tu ne peux pas poster de nouveau sujet dans la section pour les Nuls, surement pour ça que tu n'as pas eu de réponse.... d'ailleurs je viens d'y trouver ton sujet, que je vais supprimer car tu as créé un nouveau topic. Idéalement, il faut fermer la connexion Net.FHTTP, mais c'est vrai qu'on ne le fait pas systématiquement.... car le Garbage Collector du LUA fait le ménage à intervalle régulier. Si tu veux forcer la libération de mémoire, tu peux affecter nil à la variable : local HC2 = Net.FHttp("127.0.0.1", 11111) -- blah blah blah HC2 = nil
-
méchant les pompiers te diront qu'ils préfèrent pourtant le bois au métal.... car la réaction du bois en cas d'incendie est plus prévisible que les structures métalliques, qui s'effondrent sans prévenir.
-
Ouaip c'est collé ! Mais ça devrait passer en refroidissement passif, pour l'instant avec le switch de 10W, ça reste froid. Sinon l'évacuation se fera par le trou vers le placard d'àcôté, ou àgauche le long des câbles réseaux.
-
OK bon j'en parle àmon boss, sur un malentendu ça peut passer
-
quoi, pas de mirabelle ? Bon inutile que je vienne alors Comme il va faire froid dans l'Est, peut être que je ferais mieux de rester chez moi et rendre visite àmon ami Fredo Il parait que le serveur DHCP fonctionne maintenant
-
Mon coffret réseau 10" était trop étroit.... aucun switch de qualité (marque réputée, manageable, et avec plus de 16 ports) ne rentrait dedans. Et mon Netgear 8 ports ne me convenait plus. Problème, je suis limité en espace, et le seul emplacement à ma disposition est le bas d'un placard, qui nous sert de porte-manteaux. Aucun coffret 19 pouces ne me convenait, à cause des profondeurs, c'est soit 30cm, soit 45cm.... mais jamais entre les deux. J'ai donc acheté 4 profilés rack en acier 2 mm de 6U sur eBay pour une poignée d'euros. Une cornière acier pré-percée chez Leroy Merlin, ainsi que quelques vis et écrous papillons pour une autre poignée d'euros. Et du bois de récupération (des chutes de liteaux de mon abris de jardin) Fabrication de la structure sur mesure, en me servant du switch Cisco et du panneau de brassage Legrand comme référence pour la largeur entre les montants : Ça rentre parfaitement dans le placard : Les écrous papillons servent à ajuster la profondeur des rails, en fonction de la profondeur du switch, afin de maximiser le peu d'espace disponible. J'ai fait sauter le fond du placard afin de mettre le sol à nu, ce qui laisse la place pour l'arrivée des câbles réseau. Pour fermer cela proprement, je pensais le faire en panneau MDF peint. Une fois dans mon Leroy Merlin local, je tombe sur un stock de planches en chêne de 20mm en promo. C'est parfait, ça sera plus propre, et puis un coffret réseau en chêne massif, c'est juste la classe Voici l'ensemble monté, avec des vitres en plexiglas, et de la quincaillerie de la marque Hettich (j'adore leurs produits) : Commentaire de Madame à ce moment là : il est bizarre ton nouveau meuble à chaussure (euh, comment dire... tu en as déjà un qui est aussi large et qui fait 2m de haut... ) Bon clairement, les portes sont ce qui m'a pris le plus de temps à faire dans tout le projet, je me suis galéré avec des tourillons pour l'assemblage, une belle rainure pour la fixation de la vitre, le positionnement des charnières, et le système de fermeture. En haut à gauche, on voir quelques câbles réseaux qui remontent, ils seront masqués ultérieurement avec un double fond en HDF. Il y a largement la place pour monter une 15zaine de câbles réseau directement vers l'étage. Vue de l'intérieur : Reste à faire : - une réglette de prise électrique (certaines seront sur un onduleur à venir) - terminer le câblage réseau avec des câbles de qualité et aux bonnes longueurs. - continuer à passer des câbles dans toute la maison, j'ai maintenant de la marge pour le brassage. - installer le routeur et le point d'accès Wi-Fi Ubiquiti Comme le coffret est en bois, je pourrais y installer des équipements hertziens, tels que Wi-Fi, Z-Wave, etc.... mais je vais m'abstenir car : situé au ras du sol ce n'est pas l'idéal pour diffuser dans la maison, et ça risque de chauffer assez vite (HC2 + Freebox, ça consomme beaucoup, si je peux éviter d'installer des ventilateurs d'extraction, c'est mieux). Et puis comme j'ai la place pour tout cela, voici justement la vue du placard de droite, qui contient le serveur HP (d'ailleurs faut que je mette le G8 à la place du G7), la Freebox, la HC2, et les tableaux électriques :
-
c'est pas bon, ça sent les fichiers corrompus. A mon avis t'es bon pour faire un recovery.
-
- oui c'est ce que j'utilise chez moi, le nom du site fonctionne parfaitement à la place de l'IP - je pense que tu vas devoir modifier les scripts pour changer l'URL.... galère à faire Est-ce que tu ne peux pas créer une URL du style domotique.monsite.com (le www étant inutile) Cool Je ne connais pas du tout les NAS WD..... mais vu l'erreur, j'ai l'impression qu'il n'y a pas MySQL sur le NAS. Faudrait que tu cherches comment activer cette fonction sur ton NAS.
- 1 285 réponses
-
- tuto multimã©dia
- graphiques
-
(et 2 en plus)
Étiqueté avec :