7
votes

Contrôler l'utilisation du processeur d'un script perl?

Je fais beaucoup de recherche de fichiers en fonction d'un critère dans plusieurs itérations de mon script Perl et semble prendre 100% de l'heure de la CPU. Existe-t-il un moyen de contrôler mon utilisation de la CPU de script? J'ai lu quelque part à propos de mettre des cycles de sommeil vides dans mon script. Mais je ne suis pas sûr comment faire cela.


3 commentaires

C'est la plate-forme dépendante. Sur quel OS fonctionnez-vous?


@ incendiable S'il n'y a pas d'autres processus nécessitant la CPU, pourquoi devrait-il le laisser, gaspiller de bons cycles quand ils peuvent être mis à bon usage?


Je court mes scripts sur Windows. Oui, il existe d'autres processus qui fonctionnent également. Je devais être moins excluant avec mes scripts.


6 Réponses :


3
votes

Il suffit de dormir: xxx

ou légèrement plus fantaisie, faire des opérations par cycle de veille: xxx


1 commentaires

D'accord. Je reçois l'idée. Je vais donc devoir briser mes tâches en groupes pouvant être itératés.



10
votes

Vous pourriez réduire la priorité du processus (Perl), comme attribué par le système d'exploitation: Windows ou < Un href = "http://www.computerhope.com/unix/unice.htm" rel = "Nofollow NOREFERRER"> Linux

Exemple de priorité la plus basse:

Windows xxx

linux xxx


2 commentaires

Cela ressemble à la solution la plus simple. Je vais essayer cela devant les autres et faire rapport.


Il s'agit d'une solution facile mais nécessite les connaissances des utilisateurs ou que vous créez un script de démarrage ou un alias. Si toutefois, vous utilisez SetPiority (), le code renira / modifiera toujours la priorité comme prévu. Le type d'application et l'utilisation devrait décider de la solution à choisir.



5
votes

Vous pouvez utiliser Sleep ou USLEep . Une autre chose que vous pouvez faire est de réduire la priorité du processus.

mise à jour: Voir SETPIRIORITY ()


2 commentaires

La fonction SETPIRIORITY PERL est juste une enveloppe autour de l'appel système avec le même nom. En tant que tel, c'est une erreur fatale de l'appeler sur des plates-formes qui ne l'appliquent pas (par exemple Windows).


Je viens de confirmer cela. SETPIRIORITY () n'est pas implémenté dans Windows.



7
votes

Un excellent moyen d'améliorer l'utilisation de la CPU consiste à utiliser de meilleurs algorithmes. Ne devinez pas où votre code dépense tout son temps: utilisez un profileur. devel :: nytprof est un outil fantastique pour cela.

Assurez-vous de garder Law d'Amdahl à l'esprit. Par exemple, par exemple, une partie de votre programme utilise un algorithme quadratique et avec certains efforts que vous pourriez le remplacer par une linéaire. Hourra! Mais si le code en question ne représente que 5% du total des heures d'exécution, votre effort le plus héroïque peut ne pas mieux améliorer une nouvelle amélioration de cinq pour cent. Utilisez un profileur pour déterminer si des possibilités de plus grande vitesse sont disponibles ailleurs.

Vous ne nous disons pas ce que vous recherchez, et même les algorithmes les plus connus peuvent être intensives de la CPU. Considérez que le planificateur de votre système d'exploitation a été écrit, réglé à la main, testé et réécrit pour utiliser efficacement les ressources du système. Oui, certaines tâches nécessitent des planificateurs spécialisés, mais de tels cas sont rares - encore moins susceptibles que vous utilisiez Perl.

Ne le prenez pas comme un mauvais signe que votre code alimente la CPU. Vous serez peut-être surpris d'apprendre que l'un des défis les plus difficiles des systèmes en temps réel, où la performance est cruciale, est de garder la CPU occupée plutôt que de ralenti.


2 commentaires

Mon script passe beaucoup de temps à faire des tâches ménagères, telles que la recherche de texte dans des fichiers, exécuter des programmes externes, capturer et analyser leur sortie, plutôt que tout algorithme spécialisé. En général, je suis d'accord avec votre opinion. Je ne suis pas particulièrement préoccupé par le fait que mon script mangeait la CPU. Mais plus avec le fait que cette utilisation de la CPU affecte d'autres programmes et services exécutés sur le même serveur Windows. Donc c'est tout. Une simple priorité de processus faible semble servir mon objectif à l'heure actuelle. Oui, le profilage est bon à long terme.


Merci pour la pointe sur NyTProf! Notez à soi-même: le seul type de guide avec les étapes que je pouvais trouver jusqu'à présent est Perlmonks: Profilage de l'application MOD_PERL - Problème .. Bravo!



2
votes

Dormez + heure + fois peut un peu cela.

my $base = clock_gettime(CLOCK_MONOTONIC);
my (undef, $hard) = getrlimit(RLIMIT_CPU);
my $interval = 10;
if ($hard != RLIM_INFINITY && $hard < $interval) {$interval = $hard / 2}
my $ratio = 0.5;
$SIG{XCPU} = sub {
    setrlimit(RLIMIT_CPU, $interval, $hard);
    my $now = clock_gettime(CLOCK_MONOTONIC);
    my $over = $interval - $ratio * ($now - $base);
    $base = $now + ($over > 0 && sleep($over));
};
setrlimit(RLIMIT_CPU, $interval, RLIM_INFINITY);


1 commentaires

Doit être testé. Mais on dirait une solution intéressante pour contrôler généralement l'utilisation du processeur avec des chiffres.



2
votes

Votre script fait-il réellement faire des choses tout le temps? Par exemple, si vous calculez un ensemble MandelBrot, vous aurez des boucles qui consomment du processeur, mais utilisez activement des données tout le temps.

ou avez-vous des boucles où vous attendez plus de données pour traiter: P>

use IO::Select;
my $s = IO::Select->new($handle);

while(1) { 
    process_data() if $s->can_read;
}


0 commentaires