1 votes

Perl script et erreurs d'absence de mémoire

Nous disposons d'un serveur de taille moyenne avec 48 Go de RAM et nous tentons d'importer une liste d'environ 100 000 abonnés opt-in dans un nouveau système de gestion de listes écrit en Perl. D'après ce que j'ai compris, Perl n'a pas de limites de mémoire imposées comme PHP, et pourtant nous obtenons continuellement des erreurs de serveur interne lorsque nous tentons d'effectuer l'importation. En examinant les journaux d'erreurs, nous constatons que le script a manqué de mémoire. Puisque perl n'a pas de paramètre pour limiter l'utilisation de la mémoire (pour autant que je sache), pourquoi obtenons-nous ces erreurs ? Je doute qu'une petite importation comme celle-ci consomme 48 Go de mémoire vive.

Nous avons fait un compromis et divisé la liste en morceaux de 10 000, mais nous aimerions trouver la cause profonde pour les corrections futures. Il s'agit d'une machine CentOS avec Litespeed comme serveur web.

2 votes

Question idiote - OS 64 bits ou PAE ? Lorsque vous exécutez "top", combien de RAM perl consomme-t-il ?

0 votes

Désolé - c'est la première fois que je débogue et je n'étais pas sûr que les informations étaient pertinentes. Système d'exploitation 64 bits et perl n'apparaît même pas en haut. mail.cgi (le script utilisé) apparaît et utilise 25% de CPU et .3% de ram avant que l'erreur ne survienne.

0 votes

Quelle est l'erreur que vous obtenez ? Comment savez-vous qu'il manque de mémoire ?

2voto

coredump Points 12455

Il est difficile de déboguer sans voir le code, mais il se peut que vous lisiez le fichier en mémoire, au lieu de le traiter ligne par ligne en utilisant la fonction foreach $line (<FILE>) . De même, si vous l'ajoutez à une variable ou à un tableau, c'est la même chose. Effectuez tous les traitements à la place de la fonction foreach . Même ainsi, 100 000 courriels ne devraient pas utiliser 48 Go.

0voto

Jeff Albert Points 1967

De nombreux facteurs peuvent intervenir ici (paramètres de mémoire du noyau, selinux, contrôles de sanité des CGI par le serveur web), mais ulimit est probablement le coupable le plus probable ; commencez par /etc/limits.conf . Cela dit, l'exécution d'un import batched script en tant que CGI n'est probablement pas votre meilleur choix - même s'il ne s'épuise pas en mémoire, la plupart des serveurs web n'apprécient pas les script CGI à longue durée de vie, et vous pouvez finir par être terminé de toute façon. Ce genre de script s'exécutera mieux à partir de la ligne de commande, idéalement avec un point de contrôle ou au moins des journaux afin que vous puissiez voir jusqu'où vous avez avancé dans l'importation dans le cas où le script meurt avant l'achèvement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X