NodeJS JSON.stringify() goulot d'étranglement
Mon service renvoie les réponses de très grands objets JSON - autour de 60 MO. Après un certain profilage j'ai trouvé qu'elle passe presque tout le temps de faire le JSON.stringify()
appel qui est utilisé pour convertir à la chaîne et l'envoyer comme une réponse. J'ai essayé des implémentations personnalisées de stringify et ils sont encore plus lente.
C'est un goulot d'étranglement pour mon service. Je veux être capable de gérer autant de requêtes par seconde que possible - actuellement 1 demande prend 700ms.
Mes questions sont les suivantes:
1) puis-je optimiser l'envoi de la réponse de la partie? Est-il plus efficace que les stringify-ing de l'objet et de l'envoi de la réponse?
2) à l'aide de async module et la réalisation de l' JSON.stringify()
dans un thread séparé d'améliorer dans l'ensemble, le nombre de requêtes/seconde(étant donné que plus de 90% du temps est consacré à l'appel)?
Avez-vous essayez d'utiliser socket.io. JSON.stringify charge la totalité de l'objet en mémoire, donc je ne pense pas que vous pouvez l'optimiser. Mais 60 mo de json est juste trop énorme.
Êtes-vous l'envoi de données redondantes? Si un sous-ensemble de vos données est modifié, de ne pas renvoyer toutes les données, il suffit de renvoyer le sous-ensemble. Qui peut vous permettre de réduire la quantité de données que vous stringify
Il serait utile de voir le code que vous utilisez pour envoyer la réponse afin que nous puissions évaluer votre processus.
Comment êtes-vous de consommer ce service.. c'est à dire, vous avez à sérialiser JSON? Peut-être essayer de la sérialisation et l'envoi comme BFILS à la place? J'imagine que vous devriez voir une amélioration de la performance de l'encodage/décodage; et la sortie devrait être plus petit.
OriginalL'auteur gosho_ot_pochivka | 2014-02-26
Vous devez vous connecter pour publier un commentaire.
Vous avez deux options:
1) trouver un JSON module qui vous permettra de diffuser le stringify opération, et de la traiter dans les morceaux. Je ne sais pas si un tel module est là-bas, si ce n'est pas que vous auriez à le construire. EDIT: Grâce à Reinard Mavronicolas pour souligner JSONStream dans les commentaires. En fait, j'ai eu sur mon brûleur arrière pour chercher quelque chose comme cela, pour un autre cas d'utilisation.
2)
async
ne pas utiliser les threads. Vous auriez besoin d'utilisercluster
ou certains autres threading module de laisser tomber le traitement dans un thread séparé. L'inconvénient ici est que vous êtes encore en train de traiter une grande quantité de données, vous êtes gagner de la bande passante à l'aide de threads, mais en fonction de votre trafic vous pouvez toujours frapper une limite.Tant qu'il n'en streaming/evented/bloc de traitement, c'est probablement très bien. Traitant de la quantité de données en une seule opération sans les casser en morceaux, va prendre un certain temps, peu importe ce que vous faites avec elle.
vous pouvez ajouter à votre réponse sous le point numéro 1 - github.com/dominictarr/JSONStream. Aussi, semble être anohter DONC, la question similaire à celui-ci: stackoverflow.com/questions/13503844/...
streaming pour msgpack serait probablement encore mieux.
OriginalL'auteur Jason
Après quelques années, cette question a une nouvelle réponse pour la première question: yieldable-json lib.
Comme l'a décrit dans de ce parler par Gireesh Punathil (IBM, Inde), cette librairie permet d'évaluer un JSON de 60MO sans blocage de la boucle d'événements de node.js laissez-vous accepter de nouvelles demandes dans le but d'améliorer votre capacité de production.
Pour la seconde, avec node.js 11 dans la phase d'expérimentation, vous pouvez utiliser le thread de travail afin d'augmenter votre serveur web le débit.
OriginalL'auteur Manuel Spigolon