Il y a du code, où, avec mon entrée actuelle (~ 200 tâche à exécuter), il faut P> tâches code> est une matrice de fonctions, chacune de la requête HTTP PEFORMS (à l'aide du module CODE> Demande Code> ) et appeler API Mongodb pour stocker les données (à l'instance de Mongohq). P>
[normal mode] collection cycle: 1356.843 sec. (22.61405 mins.)
4 Réponses :
L'inconvénient principal que vous verrez ici est une pointe de la charge de serveur de base de données. Cela peut ou non être correct en fonction de votre configuration. p>
Si votre serveur de base de données est une ressource partagée, vous voudrez probablement limiter les demandes parallèles à l'aide de async.acherlimit code> à la place. P>
Votre intuition est correcte que le parallélisme ne vient pas gratuitement, mais vous pourrez certainement être capable de payer pour cela. P>
Utilisation d'un module de test de charge (ou collection de modules) comme NODELOAD , vous pouvez quantifier la manière dont cette opération parallèle affecte votre serveur. déterminer s'il est acceptable. p>
async.parallellimit peut être un bon moyen de limiter la charge du serveur si vous en avez besoin, mais d'abord Il est important de découvrir si la limitation est nécessaire em>. Test explicitement est le meilleur moyen de découvrir les limites de votre système (chaqueLimit a une signature différente, mais pourrait être utilisé aussi bien). P>
Au-delà de cela, des pièges communs utilisant async.Parallel incluent de vouloir un flux de contrôle plus compliqué que cette offre de fonction (qui, à partir de votre description, ne semble pas s'appliquer) et d'utiliser parallèlement sur trop grande d'une collection naïvement (qui, disant, Peut vous faire tomber dans la limite de descripteur de fichier de votre système si vous écrivez de nombreux fichiers). Avec vos 200 demandes de 200 ans et vos opérations de sauvegarde sur 1 Go de RAM, j'imagine que vous seriez bien tant que vous ne réussirez pas beaucoup de massage dans les gestionnaires d'événements, mais si vous vivez Server Susks, Parallellimit pourrait être un bon moyen de sortir. p>
Encore une fois, le test est le meilleur moyen de comprendre ces choses. P>
J'éprouve exactement la suspension du serveur après 24-30 heures de travail d'application (même avec une exécution série), une seule solution de contournement est maintenant de redémarrer l'application. Je suis en grenier, c'est que c'est à cause de la mémoire ou de quelque chose (aucune erreur, mais la demande HTTP est juste bloquée) ..
Cela ressemble à une fuite de mémoire plus qu'un serveur surchargé pour moi. À quelle fréquence exécutez-vous le cycle de travail 200 par période de 24 à 30 heures?
Très souvent, jusqu'à 100 fois .. Je soupçonne aussi une fuite de mémoire, mais il est juste difficile de la résoudre.
Je m'attendrais à ce que vous fassiez des objets ou des objets de fonction alors. Si vous vous souciez de poster du code, je peux jeter un coup d'œil.
J'ai peur que cela puisse être un peu difficile, car la base de code n'est pas si petite .. Github .com / Litecond / Collecteur / Arbre / Master / Source - Mais si vous remarquez une erreur évidente, serait génial.
C'est un peu d'hypothèse, qui n'a pas réellement mis en œuvre l'application, mais cela me semble que Scheduler.js pourrait avoir une fuite de ses tâches. Dans Collector.js, comment devez-vous exiger le dossier ./engine/connectors et l'utiliser sans erreur?
Notez également que le set.timeout code> dans planificateur.js conserve la portée de la fonction code> de la fonction jusqu'à ce que les incendies de délais d'attente. Cela inclut toutes les tâches créées.
Merci beaucoup .. On dirait que settimeout code> a vraiment causé des fuites, j'ai refactoré le code comme GITUB.COM/LIKELETORE/Collector/blob/Memory-leak/source/engi ne / ... Si vous avez quelques minutes, sera heureux pour suggestions;
Semble amélioré, sage de mémoire. Est-ce que ça se passe bien?
Il est! J'ai utilisé nœud-memwatch code>, même je résiste peu de
fuites code> la détection est définitivement meilleure qu'auparavant. Merci pour votre aide!
Ravi de l'entendre! Bonne chance à vous et heureux d'être utile.
Je voudrais souligner que Exécuter simultanément est comme en cours d'exécution de différents programmes sur un seul noyau CPU, via le multitâche / planification. La vraie exécution parallèle serait exécutée de différents programmes sur chaque noyau de la CPU multicœur. Ceci est important comme nœud.js a Architecture forte> Single-fileté. P>
La meilleure chose à propos de la noeud est que vous n'avez pas à vous soucier des E / S. Il gère des I / O très efficacement. p>
Dans votre cas, vous stockez des données sur MongoDB, c'est principalement des E / S. Donc, les exécutera parallèlement à utiliser votre bande passante réseau et si la lecture / écriture de disque est également une bande passante de disque. Votre serveur ne sera pas accroché à cause de la surcharge de la CPU. p>
La conséquence de ce serait que si vous augmentez votre serveur, vos demandes peuvent échouer. Vous pouvez obtenir une erreur Vous pouvez également obtenir des erreurs de socket lorsqu'il est surchargé comme Enfin, le serveur peut accrocher à cause de la collecte des ordures. La collecte des ordures commence une fois que votre mémoire augmente à un certain point, puis fonctionne périodiquement après un certain temps. La mémoire de tas maximum V8 peut avoir environ 1,5 Go. Attendez-vous donc que GC fonctionne fréquemment si sa mémoire est élevée. Le nœud s'écrasera avec async.parallallal code> exécute plusieurs fonctions simultanément strong> non (complètement) parallien strong>. C'est plus comme le parallélisme virtuel. P>
EMFILE code> (trop de fichiers ouverts). Chaque prise compte en tant que fichier. Habituellement, les connexions sont regroupées, ce qui signifie établir la connexion Une prise est cueillie à partir de la piscine et lorsque vous avez fini de retourner dans la piscine. Vous pouvez augmenter le descripteur de fichier avec
ulimit -n xxxx code>. P>
econnreset cod> (erreur: prise raccroche),
econnréfused code> ou
eTimeDout code>. Alors manipulez-les correctement. Vérifiez également le nombre maximum de connexions simultanées pour le serveur MongoDB. P>
processus de mémoire code> si vous demandez plus, que cette limite. Donc, corrigez les fuites de mémoire dans votre programme. Vous pouvez regarder ces Outils . P>
Vous réaliserez la différence si plusieurs utilisateurs se connectent:
Dans ce cas, le processeur peut gérer plusieurs opérations p>
Asynch essaie d'exécuter plusieurs opérations de plusieurs utilisateurs égaux égaux par rapport à l'égal p> C'est l'oposite de Atomicy (donc peut-être surveiller Atomicy sur des opérations spéciales sur la base de données spéciales - mais c'est un autre sujet) p> alors peut-être qu'il est donc plus rapide d'utiliser: P> - Ce n'est pas un problème tant que P> T2.U1 is based on T1.U1
Vous devez probablement modifier et utiliser
async.parallellimit (tableau, limite, cb) code> pour de meilleures performances. Trouvez une limite d'exécutions parallèles qui ne débordent pas de l'exécution, et ce sera plus rapide que ASYNC.Parallel: P en tant que bonus, il ne sera plus suspendu :)