2010-08-24 2 views
2

J'ai écrit un programme Perl qui recherche et manipule un fichier texte. Ce processus CGI nettoie le fichier directement en mémoire, manipule le fichier en fonction de l'entrée de l'utilisateur, puis génère le résultat HTML.Mise à l'échelle d'un simple CGI Perl sur un serveur à haut volume

Cela fonctionne fonctionnellement sage. Cependant, je sais qu'une fois que je déploierai sur un serveur à haut volume, il ne sera pas en mesure de répondre en temps voulu. Je soupçonne que la mémoire soit un goulot d'étranglement. Quelle est la meilleure façon de partager ce fichier, de sorte qu'il est lu une fois en mémoire une fois que le serveur démarre et plus jamais?

La solution que je devine est un démon serveur qui charge le fichier en mémoire et sert d'autres processus/threads leurs données. Si oui, quelle est la meilleure méthode pour mettre en œuvre l'IPC?

+0

Avez-vous réellement besoin que le fichier soit présent en mémoire en une fois? Je sais que cela facilite la programmation, mais si vous pouvez faire ce que vous avez à faire en le diffusant en ligne/bloc à la fois, tous vos problèmes de mémoire disparaîtront et le mécanisme de mise en cache du disque fonctionnera très bien. –

+0

Quelle est la taille de ce fichier? Si c'est petit, laissez le cache disque en prendre soin. Quelle est la complexité des recherches? Vous pouvez vouloir quelque chose comme SQLite ou un magasin de données NoSQL à la fois pour contenir les données d'une manière organisée, faire les recherches et les mettre en cache. La recherche de fichiers plats n'est pas mise à l'échelle. – Schwern

Répondre

2

C'est à peu près la raison pour laquelle mod_perl a été créé.

6

Utilisez FastCGI. Il transforme efficacement votre programme CGI en un petit serveur que votre serveur Web appelle. C'est simple et fonctionne sur beaucoup de serveurs web différents. Parce que votre CGI s'exécute dans son propre processus, il peut fonctionner sur une machine différente de votre serveur Web, et vous pouvez faire évoluer votre programme sur plusieurs serveurs d'applications. Et cela fonctionne avec la plupart des principaux langages de programmation. L'avantage de mod_perl est qu'il vous permet d'explorer les entrailles d'Apache en utilisant Perl. Si vous n'utilisez pas cela c'est trop. mod_perl a beaucoup d'inconvénients. Il vous lie à Apache et quelle que soit la version de Perl compilée dans mod_perl. Il mélange la configuration et l'espace mémoire de toutes vos applications Perl avec celles d'Apache, ce qui complique la configuration et conduit à un gonflement de la mémoire. Et mod_perl est vraiment compliqué et difficile à mettre à niveau.

+0

En outre, mod_perl peut avoir des bogues de persistance des données assez "intéressants". –

+0

Cela peut être une solution de mise en œuvre, mais nous n'en sommes pas encore là. Indépendamment de ce que le module CGI à utiliser, etc. En termes de codage, quelle est la meilleure pratique en termes d'écriture de code pour lire le même fichier encore et encore? Je suis à la recherche de quelque chose du genre Mémoire partagée, mmap, Sockets IPC, etc. – Face

+0

@Face Vous pouvez écrire un serveur pour conserver le fichier en mémoire et le transmettre à d'autres processus, mais si c'est tout 'est essentiellement la reproduction du cache disque du système d'exploitation. Mal. La meilleure pratique consiste à * ne pas * lire le fichier encore et encore en gardant votre processus persistant. Cela permet également d'économiser le coût de la recompilation du code et de refaire l'initialisation à chaque coup. C'est ce que FastCGI vous achète. Si vous souhaitez conserver certaines données * calculées * persistantes en mémoire afin que d'autres processus puissent les partager, essayez quelque chose comme memcached. Si les données sont compliquées, regardez dans NoSQL. – Schwern

Questions connexes