6
votes

Node.js async parallèle - quelles sont les conséquences?

Il y a du code, xxx pré>

où, 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>

avec mon entrée actuelle (~ 200 tâche à exécuter), il faut P>

  [normal mode] collection cycle: 1356.843 sec. (22.61405 mins.)


1 commentaires

Vous devez probablement modifier et utiliser async.parallellimit (tableau, limite, cb) 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 :)


4 Réponses :


0
votes

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.

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 à la place.


0 commentaires

5
votes

Votre intuition est correcte que le parallélisme ne vient pas gratuitement, mais vous pourrez certainement être capable de payer pour cela.

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.

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 . 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).

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.

Encore une fois, le test est le meilleur moyen de comprendre ces choses.


11 commentaires

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 dans planificateur.js conserve la portée de la fonction 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 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 , même je résiste peu de fuites 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.



3
votes

Je voudrais souligner que async.parallallal exécute plusieurs fonctions simultanément non (complètement) parallien . C'est plus comme le parallélisme virtuel.

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 Single-fileté.

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.

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.


La conséquence de ce serait que si vous augmentez votre serveur, vos demandes peuvent échouer. Vous pouvez obtenir une erreur EMFILE (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 .

Vous pouvez également obtenir des erreurs de socket lorsqu'il est surchargé comme econnreset (erreur: prise raccroche), econnréfused ou eTimeDout . Alors manipulez-les correctement. Vérifiez également le nombre maximum de connexions simultanées pour le serveur MongoDB.


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 processus de mémoire si vous demandez plus, que cette limite. Donc, corrigez les fuites de mémoire dans votre programme. Vous pouvez regarder ces Outils .


0 commentaires

0
votes

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> XXX PRE>

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> xxx pré>

- Ce n'est pas un problème tant que P>

T2.U1 is based on T1.U1


0 commentaires