Comment puis-je améliorer les performances de Moose dans les processus CGI non persistants?

StackOverflow https://stackoverflow.com/questions/1410939

  •  05-07-2019
  •  | 
  •  

Question

Moose est un cadre d'objet fantastique. Le problème, c’est que, pris avec ses dépendances, c’est un très grand. Notre profilage indique que sur notre plate-forme, le simple chargement de Moose entraîne une surcharge de 5 à 6 secondes sur les scripts d'application CGI non persistants. Ce n'est tout simplement pas acceptable pour ces applications uniques.

En revanche, lorsque nous utilisons un système de processus persistant (tel que FCGI), cette surcharge de démarrage est éliminée (ou plutôt, elle n’est encourue qu’une seule fois) et tout va bien. Le problème que nous avons est que nous ne pouvons pas garantir que tout notre code sera toujours exécuté selon un processus persistant.

Nous avons étudié la possibilité d'utiliser Mouse comme solution de remplacement pour Moose, dont les fonctionnalités sont limitées. , mais comme il se trouve (comme indiqué dans cette réponse ) ce n'est pas une option viable. Toutes les bibliothèques que nous écrivons pour travailler avec Moose ne fonctionneront pas avec Mouse de manière subtile mais importante. Et nous voulons vraiment ne pas bifurquer tous nos modules pour pouvoir prendre en charge Moose dans un environnement persistant et Mouse for "vanilla". CGI.

Cela étant, nous avons les options suivantes:

  1. Définissez nos modules internes pour fonctionner avec Moose ou Mouse, selon le cas. (Beurk!)
  2. Développez uniquement nos modules pour FCGI / Moose . Ne supporte pas "vanille" CGI plus. Si nous devons écrire des scripts qui ne sont pas persistants, ils ne pourront pas utiliser nos modules internes.
  3. N'utilisez ni Moose, ni souris , mais un autre framework d'objet.

Quelle est la meilleure option? Nous nous penchons vers 2 pour le moment, et nous allons tout gâcher si nous devons faire fonctionner quelque chose en tant que CGI vanille. Qu'en est-il des autres cadres? Y a-t-il quelque chose de plus léger que nous devrions examiner?

Était-ce utile?

La solution

Je préférerais abandonner le support vanille de CGI. L’hébergement de FCGI n’est vraiment pas cher de nos jours et il n’ya aucune raison de s’en remettre à la vanille CGI (IMO), car cela ne fait que renforcer l’opinion selon laquelle Perl est lent. Mais si vous ne pouvez pas l'éviter, vous pouvez utiliser quelque chose comme Object :: Tiny . Mais si vous avez besoin de rôles, de contraintes, de méta-programmation et de toutes les autres fonctionnalités offertes par Moose, vous n’êtes pas plus chanceux si vous ne perdez pas le CGI vanille.

Autres conseils

Vous pouvez écrire une application serveur principale à l'aide de Moose, puis écrire de très petits scripts CGI simples qui interrogent le serveur principal.

+-------+    +--------------+
| Small |===>|  Persistent  |
|  CGI  |<===| Moose Server |
+-------+  ^  +--------------+
           |
         Socket
       Connection

C’est plus ou moins ce que fait FCGI, il est donc peut-être plus logique de simplement utiliser FCGI.

D'un autre côté, il peut être très utile de disposer d'un serveur dorsal autre que cgi sur lequel TOUTE interface abstraite est boulonnée au besoin.

Par exemple, si vous utilisez des sockets TCP (ou UDP), vous pouvez faire en sorte qu'une application de bureau native atteigne le même arrière-plan que votre CGI.

La meilleure solution dans votre cas dépend vraiment de votre situation spécifique. En fonction des détails de la situation, je me vois moi-même décider d'utiliser cette approche ou l'une des approches décrites ci-dessus.

Ma suggestion est de choisir l'option n ° 2, puis de nous aider à restructurer Moose afin que le CGI devienne viable. FREW travaille actuellement sur la suite de tests de Moose afin de permettre au projet MooseX :: Antlers de réduire au maximum les frais généraux qui font de Moose un système inutilisable pour les environnements CGI.

Matt Trout (mst), l’homme qui est actuellement à la tête de MooseX :: Antlers, a exprimé le souhait de pouvoir exécuter des applications dans un environnement CGI, le cas échéant. Je suggère de rester avec FCGI pour le moment et de le harceler pour savoir ce que vous pouvez faire pour aider!

Jonathan Rockway a écrit à propos de APP :: Peristent (qui, curieusement, , n'est pas dans CPAN) il y a quelques mois. Je ne l'ai pas utilisé, mais d'après son article de blog mentionné ci-dessus, il semble fournir une architecture serveur-client assez transparente dans laquelle vous pouvez intégrer le traitement réel de votre CGI.

L'idée de base de App :: Persistent , pperl , SpeedyCGI et probablement d'autres sont que le processus de compilation de votre programme Perl en code octet n'est effectué qu'une seule fois et une sorte de mise en cache est utilisée pour les invocations ultérieures. Moose étant réputé avoir une pénalité de temps de compilation, j'essaierais d'abord cette approche.

J'ai utilisé pperl avec succès pour dessiner de nombreux graphiques MRTG . Vers 2001, sur un ancien système. Le programme Perl a été exécuté pour chaque graphique, ce qui était plutôt une surcharge - ceci est probablement comparable à votre scénario CGI.

Il existe également une autre option: PPerl .

Je ne l'ai jamais utilisé, mais ça a vraiment l'air intéressant. Et la personne qui l’a écrit (Matt Sergeant aka baud) - cela vous garantit pratiquement un code de bonne qualité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top