2010-12-12 88 views
0

Je cours plusieurs instances d'un script et tout fonctionne bien. Chaque terminal que je charge construit le CPU plus haut. Je cours 12 instances et étrangle 99% d'un CPU dual core. J'ai complètement empilé mon RAM 8gb de DDR3. À un moment donné du projet, j'ai utilisé mysql mais j'ai trouvé de gros goulots d'étranglement là-bas et une erreur de déconnexion aléatoire (que googling m'a dit être la carte réseau).Perl scripts hogging CPU

Quoi qu'il en soit, écrire sur le disque était beaucoup plus rapide à partir de la coque. Le module utilisé est WWW: Mechanize

Cependant, par exemple, le profil n'est pas terrible. Rebondit jusqu'à 24%. Mais j'atteins une limite d'exécution à 100% de charge avec 8 ou 9 fenêtres de terminal en cours d'exécution .. Très probablement, il s'agit d'un résultat de la bande passante et juste le temps de téléchargement .. Puis-je accélérer cela? Disons arrêter le téléchargement après un # de kilo-octets?

Merci, Peter

+1

Que diable font ces scripts? De quoi parlez-vous quand vous parlez de "pousser plus sur la RAM et hors CPU"? Ce ne sont pas des ressources interchangeables. – fennec

+3

Vous semblez être très confus. S'il vous plaît prenez la perspective de quelqu'un qui n'est pas intimement familier avec ce que vous essayez de faire, et posez votre question afin qu'une telle personne puisse comprendre à la fois vos objectifs et vos contraintes. D'ailleurs, pourquoi voudriez-vous que votre processeur soit inactif? –

Répondre

0

Malheureusement, je ne crois pas qu'il y ait un moyen d'influer sur le comportement de l'interpréteur perl de cette façon. Vous pouvez définir des limites de cpu pour tous vos scripts perl sur votre boîte, mais pour autant que je sache, il n'y a aucun moyen de le faire dans Perl, car l'interpréteur gère toute l'allocation de mémoire, etc.

Vous pouvez consulter ce lien: How to limit CPU usage in perl

Aussi, vous pouvez regarder dans les fils de Perl, car ce sera certainement plus efficace en cours d'exécution alors l'interprète de 19 fois.

+0

Merci pour la réponse .. Hmm. Eh bien, qu'en est-il du module? C'est WWW: Mechanize .. Réflexions pour mieux utiliser cela? Les alternatives sont-elles meilleures, par exemple Curl, LWP? –

+3

Vous pouvez exécuter le script sous 'Devel :: NYTProf' et voir où votre script dépense réellement du temps CPU. Profilage! – fennec

+1

WWW :: Le module Mechanize est considéré comme le meilleur pour le traitement Web. Quant aux alternatives, Mechanize est une sous-classe de LWP, donc Mechanize ne fournit que peu de meilleures manipulations des données. Pour plus d'assistance, vous pouvez publier le script en question. @fennec: Bon point! +1 –

1

Mais j'atteins une limite dans l'exécution de 100% de charge avec 8 ou 9 fenêtres terminales course .. Très probablement, il est le résultat de la bande passante et juste le temps de téléchargement ..

Umm ... Non. Si vous frappez un mur en raison de contraintes de bande passante/temps de téléchargement, vos processus bloquent les E/S (état du processus D dans top/ps) et se mettent en veille, en consommant des cycles CPU quasi-inexistants jusqu'à la fin de la demande d'E/S. En ce qui concerne votre problème actuel, c'est impossible à dire sans plus de détails sur ce que fait votre code, idéalement en incluant le code source, mais une description générale de vos algorithmes pourrait suffire. Notez cependant qu'avec 8 ou 9 processus en cours d'exécution, vous garantissez un taux d'erreur de 100% si une seule instance utilise en moyenne 11 à 12% d'UC. Vous n'avez rien dit au sujet de la consommation moyenne par unité centrale de traitement, mais si elle rebondit régulièrement jusqu'à 24%, je ne serais pas du tout surpris de constater qu'elle atteint la moitié ou plus.

+0

Dave merci pour votre contribution (j'ai aussi apprécié votre site web). Gardons ce général car je suis convaincu que mon inexpérience est la clé. De toute évidence, il est simple mathématique lors de l'exécution que de nombreux terminaux à 24% chaque dopage 100% après 4 est probable. Il y a plusieurs idées que j'ai en tête mais hélas, l'heure et le temps. Pour info, j'ai trouvé une commande fantastique "last" dans les boucles, ce qui est génial! –

+0

Pour tous ceux qui étaient intéressés, j'ai trouvé une bonne solution à mon problème (en partie). En utilisant RAND() sur un serveur mysql, j'ai dû indexer plus de 300 000 enregistrements à chaque fois! Je savais que RAND() était inefficace à cette échelle mais ne pouvait pas trouver une alternative (essayé de générer des requêtes antérieures en Perl qui accaparaient le côté client) .. Hélas .. Jusqu'à ... "select id de' converge' où rand ()> .9 ordre par rand() limite 1; " Cette requête a pris 90% de frais généraux de mes requêtes! La question que j'ai toujours est, pourquoi? :) –

+0

@Peter: Oh, eh bien, alors, ça l'explique, oui ... Quand vous utilisez 'RAND' dans une requête, la base de données doit générer une valeur aléatoire pour chaque ligne de la table, même si elle ne retourne que une rangée à la fin. Pire, si vous passez à ORDER BY RAND, vous devez trier les lignes sur une valeur non indexée, ce qui est une opération relativement coûteuse. En ajoutant le 'WHERE RAND> .9', il génère maintenant 330k nombres aléatoires, mais il doit seulement trier 30k valeurs non indexées, puisque les 90% ou les enregistrements où le premier' RAND' renvoie .9 ou moins sont rejetés avant le ' ORDER BY' est traité. –