7
votes

Performance de référence de nœud.js (cluster) avec piscines MySQL: Lightpd + PHP?

edit (2): strong> Utilisez maintenant dB-mysql avec module générique-pool. Le taux d'erreur a chuté de manière significative et survole à 13%, mais le débit est toujours autour de 100 req / sec.

EDIT (1): strong> après que quelqu'un suggère que l'ordre de Rand () causerait que MySQL Soyez lent, j'avais supprimé cette clause de la requête. Nœud.js planant maintenant autour de 100 req / s, mais toujours l'erreur de connexion des rapports de serveur: trop de connexions '. P>

nœud.js ou lightpd avec php? H2>

Vous avez probablement vu beaucoup "Bonjour World" Benchmarking of Node.js ... mais "Hello World" tests, même ceux qui ont été retardés de 2 secondes par demande, ne sont même pas proches de l'utilisation de la production du monde réel. J'ai également effectué ces variations des tests "Hello World" à l'aide de Node.js et a vu un débit d'environ 800 req / sec avec un taux d'erreur de 0,01%. Cependant, j'ai décidé de passer des tests qui étaient un peu plus réalistes. P>

Peut-être que mes tests ne sont pas complets, probablement quelque chose est vraiment faux de nœud.js ou de mon code de test et donc si votre code de test. Expert, s'il vous plaît, aidez-moi à écrire de meilleurs tests. Mes résultats sont publiés ci-dessous. J'ai utilisé Apache Jmètre pour effectuer les tests. P>

Cas de test et spécifications système H2>

Le test est assez simple. Une requête MySQL pour le nombre d'utilisateurs est commandée au hasard. Le premier nom d'utilisateur de l'utilisateur est récupéré et affiché. La connexion de base de données MySQL passe via une prise UNIX. Le système d'exploitation est FreeBSD 8+. 8 Go de RAM. Processeur Intel Xeon Quad Core 2.x GHz. J'ai mis à l'écoute les configurations Lightpd un peu avant même de rencontrer nœud.js. P>

Apache JMeter Paramètres H2>

Nombre de threads (utilisateurs): 5000 Je crois que c'est le nombre de connexions concomitantes em> p>

période de rampe (en secondes): 1 p>

Compte de boucle: 10 Ceci est le nombre de demandes par utilisateur em>

Apache JMeter Fin résultats h2> xxx pré>

résultat conclusions h2>

nœud.js était si mauvais que je devais arrêter le test tôt. [ Fixe STRY> TESTÉ COMPLÈTEMENT] P>

NODE.JS Rapports "Erreur de connexion: Trop de connexions" sur le serveur. [ fixe fort>] p>

la plupart du temps, LightPD avait un débit d'environ 1200 req / sec. P>

Cependant, node.js avait un débit d'environ 29 REQ / SEC. [ fixe fort> maintenant à 100req / sec] p>

Ceci est le code que j'ai utilisé pour node.js (à l'aide de pools MySQL) h2> xxx pré> H2> Ceci est le code que j'ai utilisé pour PHP (Lightpd + FastCGI) H2>
<?php
  $conn = new mysqli('localhost', 'root', 'password', 'v3edb2011');
  if($conn) {
    $result = $conn->query('SELECT * FROM tb_users ORDER BY RAND()');
    if($result) {
      echo ($result->num_rows).' ROWS found using Lighttpd + PHP (FastCGI)<br />';
      $row = $result->fetch_assoc();
      echo $row['username'];
    } else {
      echo 'Error : DB Query';
    }
  } else {
    echo 'Error : DB Connection';
  }
?>


9 commentaires

Commander par Rand () est lent dans MySQL, ce ne serait pas un test équitable si votre base de données provoque une partie du délai.


Je vais effectuer le même test sans ordre en rand (). Étant donné que les deux accèdent à la même base de données exacte localement, je pensais que ce serait un test équitable.


Vous ne devriez pas vous reconnecter à la base de données pour chaque demande de noeud.


Utilisez une piscine, par exemple celle-ci: github.com/coopernuree/node-pool


En outre, je ne sais pas, mais je pense que vous devez augmenter ulmimit manuellement pour le nœud.


Depuis que c'est FreeBSD, ce serait des "limites" et non "ulimit". Quoi qu'il en soit, je suis maintenant effectuant des tests avec Generic-Pool car @thejh avez mentionné. La connexion basée sur la base de données se met également en désormité lorsqu'elle meurt etc. Corrigez-moi si mon code est faux. Merci.


Il peut pousser des choses au-delà de la complexité que vous vouliez, mais vous voudrez peut-être envisager l'approche de la cluster ('app') et de mettre votre CreateServer () appelez à l'intérieur de l'APP.js (suivant l'API de module requis () et encapsuler une seule DB. connexion dans chaque instance. Cela devrait donner à chaque travailleur une connexion DB persistante et donner une meilleure idée de la performance réelle mondiale.


Hehe, vous voudrez peut-être jeter un coup d'œil sur ce que Ted Dziuba a à dire sur Node.Js et ses performances: TedDziUba.com/2011/10/straight-Talk-on-event-loops.html


Nodejs n'est pas idéal pour chaque situation, c'est sûr. Mais c'est génial pour d'autres situations. Il semble que l'on utilise la plupart du temps que j'utilise le nœud, c'est sur des projets qui n'utilisent pas de base de données relationnelle, ce benchmarking ne s'appliquerait pas.


7 Réponses :


4
votes

100 connexions est le paramètre par défaut du nombre maximum de connexions MySQL.

Donc, vos connexions ne sont pas réutilisées pour différentes demandes. Vous avez probablement déjà une requête sur chaque connexion.

Peut-être que la bibliothèque Nodejs MySQL que vous utilisez ne doit pas faire la queue des requêtes sur la même connexion MySQL, mais essayez d'ouvrir une autre connexion et échouez.


0 commentaires

0
votes

n'utilisez pas 10 connexions MySQL maximales dans Node.js et 5000 connexions MySQL maximales via PHP?

Pendant que vous exécutez vos tests sur l'un ou l'autre système, je jetterais un coup d'œil à la "spectacle complet" de MySQL.


0 commentaires

5
votes

Ceci est une mauvaise comparaison de référence. Dans Node.js, vous sélectionnez la table entière et la mettant dans un tableau. Dans PHP, votre seul analyse de la première rangée. Donc, plus votre table est plus grande, le nœud plus lent sera l'air. Si vous avez fabriqué PHP utilise mysqli_fetch_all, ce serait une comparaison similaire. Alors que la DB-MySQL est censée être rapide, il n'est pas très complet et n'a pas la capacité de faire une comparaison équitable. Utilisation d'un autre module nœud.js différent, comme le nœud-mysql-libmysqlclient devrait vous permettre de traiter uniquement la première ligne.


0 commentaires

-1
votes

Ceci est une mauvaise repère, il devrait s'agir d'un simple "monde Hello", comme des milliers de points de repère qui prouvent que Nodejs est le serveur "Hello World" le plus rapide de tous les temps: D


1 commentaires

Ceci est plus approprié comme un commentaire



1
votes

Avez-vous activé APC avec PHP?

Pouvez-vous essayer d'activer les connexions persistantes avec PHP? par exemple. xxx


0 commentaires

2
votes

Corrigez-moi si je me trompe, mais je me sens comme si vous oubliez quelque chose: le nœud utilise un seul processus pour gérer chaque demande (et les gère à travers des événements, toujours le même processus), tandis que PHP reçoit un nouveau processus (fil ) Pour chaque demande.

Le problème avec ceci est que le processus du nœud colle à un noyau de la CPU, et PHP obtient à l'échelle avec les quatre cœurs par multi-filetage. Je dirais qu'avec un processeur Quad Core 2.x GHz, PHP aurait certainement un avantage significatif sur le nœud uniquement en pouvant utiliser les ressources supplémentaires.

Il existe une autre discussion donnant des informations sur la manière de faire échec noeud Plusieurs cœurs, mais cela doit être fait explicitement par codage. Encore une fois, corrigez-moi si je me trompe, mais je ne vois aucun code de ce type dans l'exemple ci-dessus.

Je suis jolie nouvelle pour noder moi-même, mais j'espère que cela vous aidera à améliorer votre test :)


0 commentaires

0
votes

Une chose à considérer est que le pilote - la performance des bases de données peut être très liée au pilote spécifique que vous utilisez. Le pilote MySQL le plus populaire et celui qui est le plus activement entretenu est https://github.com/felixge/ nœud-mysql . Pourrait obtenir des résultats différents avec cela.

Mais si vous êtes coincé à 100 connexions, des sons comme des connexions ne sont pas correctement fermés. Je pourrais ajouter une console.log instruction dans les pools Destroyez l'événement pour vous assurer qu'il est vraiment en cours d'exécution.


0 commentaires