Estoy haciendo una gran cantidad de búsqueda de archivos basado en un criterio en múltiples iteraciones de mi script de Perl y parece tomar el 100% del tiempo de la CPU. ¿Hay alguna forma de controlar la utilización de la CPU de mi script? Leí en alguna parte sobre poner ciclos de sueño vacíos en mi script. Pero no estoy seguro de cómo hacer esto.¿Controla la utilización de la CPU de una secuencia de comandos perl?
Respuesta
se podría reducir el proceso de prioridad (de Perl), que le sean asignadas por el sistema operativo: windows o linux
ejemplo para la prioridad más baja:
ventanas
start /LOW perl <myscript>
Linux
nice +19 perl <myscript>
Parece la solución más simple. Probaré esto antes que los demás e informaré. –
Esta es una solución fácil pero requiere el conocimiento de los usuarios o crear un script de inicio o un alias. Sin embargo, si usa setpriority(), el código siempre renizará/cambiará la prioridad según lo previsto. El tipo de aplicación y uso debería decidir qué solución elegir. –
simplemente dormir:
while ($not_done_yet) {
do_stuff_here();
sleep 1; # <-- sleep for 1 second.
}
o un poco más de fantasía, hacer N operaciones por ciclo de sueño:
my $op_count = 0;
while ($not_done_yet) {
do_stuff_here();
$op_count ++;
if ($op_count >= 100) {
$op_count = 0;
sleep 1; # <-- sleep for 1 second every 100 loops.
}
}
Ok. Entiendo la idea Así que tendré que dividir mis tareas en grupos que puedan repetirse. –
usted podría utilizar sleep or usleep. Otra cosa que puede hacer es disminuir la prioridad del proceso.
Actualización: Ver setpriority()
La función 'setpriority' de Perl es simplemente un envoltorio alrededor de la llamada al sistema con el mismo nombre. Como tal, es un error fatal llamarlo a plataformas que no lo implementan (por ejemplo, Windows). –
Acabo de confirmar esto. 'setpriority()' no está implementado en Windows. –
Una gran manera de mejorar la utilización de la CPU es el uso de mejores algoritmos. No adivine dónde está gastando su código todo el tiempo: use un generador de perfiles. Devel::NYTProf
es una herramienta fantástica para esto.
Asegúrese de tener en cuenta Amdahl's law. Por ejemplo, supongamos que parte de su programa utiliza un algoritmo cuadrático y con cierto esfuerzo podría reemplazarlo por uno lineal. ¡Hurra! Pero si el código en cuestión representa solo el 5% del tiempo de ejecución total, su esfuerzo más heroico no puede ser mejor que una pequeña mejora del cinco por ciento. Utilice un generador de perfiles para determinar si hay oportunidades para una mayor aceleración en otros lugares.
No nos diga lo que está buscando, e incluso los algoritmos más conocidos pueden requerir un uso intensivo de la CPU. Tenga en cuenta que el planificador de su sistema operativo se ha escrito, ajustado a mano, probado y reescrito para utilizar los recursos del sistema de manera eficiente. Sí, algunas tareas requieren programadores especializados, pero estos casos son raros, incluso menos si se usa Perl.
No lo tome como una mala señal de que su código está consumiendo CPU. Puede que se sorprenda al saber que uno de los desafíos más difíciles en los sistemas en tiempo real, donde el rendimiento es crucial, es mantener la CPU ocupada en lugar de inactiva.
Mi secuencia de comandos pasa mucho tiempo haciendo tareas menores, como buscar texto en archivos, ejecutar programas externos, capturar y analizar su resultado, en lugar de cualquier algoritmo especializado. En general, estoy de acuerdo con tu opinión. No estoy particularmente preocupado de que mi script esté consumiendo la CPU. Pero más con el hecho de que el uso de esta CPU afecta a otros programas y servicios que se ejecutan en el mismo servidor de Windows. Eso es todo. Una simple prioridad de proceso bajo parece cumplir mi propósito en este momento. Sí, la creación de perfiles es buena a largo plazo. –
Parece una elección inteligente. –
¡Gracias por el consejo en NYTProf! Nota para mí: el único tipo de guía con pasos que pude encontrar hasta ahora es [perlmonks: mod_perl application profiling - Problem] (http://www.perlmonks.org/?node_id=833194) .. ¡Saludos! – sdaau
sleep + time + times puede hacer esto.
my $base = time;
my $ratio = 0.5;
my $used = 0;
sub relax {
my $now = time;
my ($total) = times;
return if $now - $base < 10 or $total - $used < 5; # otherwise too imprecise
my $over = ($total - $used) - $ratio * ($now - $base);
$base = $now + ($over > 0 && sleep($over));
$used = $total;
}
(No probado ...) Espolvorear suficientes relax
llamadas a través de su código y esto debe ser en promedio a cerca o debajo de tiempo de CPU del 50%.
BSD::Resource puede hacer esto de forma menos invasiva, y es posible que así agarrar Time::HiRes para una mayor precisión.
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);
(también sin probar ...) En un sistema que soporta, esto debería pedir al sistema operativo para señalar que cada $interval
segundos de tiempo de CPU, momento en que se restableció el contador y el sueño. Esto no debería requerir ningún cambio en el resto de tu código.
Tiene que ser probado. Pero parece una solución interesante para controlar generalmente el uso de CPU con números. –
¿Su script realmente está haciendo cosas todo el tiempo? Por ejemplo, si calcula un conjunto mandelbrot, tendrá bucles que consumen CPU, pero están procesando activamente datos todo el tiempo.
O tienes bucles en el que están a la espera de más datos de proceso:
while(1) {
process_data() if data_ready();
}
En el primer caso, el establecimiento de prioridades es probablemente la mejor solución. Se ralentizará el cálculo, pero solo tanto como sea necesario para dar servicio a cualquier otro proceso en el sistema.
En el segundo caso, puede mejorar drásticamente la utilización de la CPU durmiendo durante solo una fracción de segundo.
while(1) {
process_data() if data_ready();
select(undef, undef, undef, 0.1);
}
Si usted está tirando de los datos de una fuente que select
puede operar en, tanto mejor. Puede organizar que su ciclo se bloquee hasta que los datos estén listos.
use IO::Select;
my $s = IO::Select->new($handle);
while(1) {
process_data() if $s->can_read;
}
Seleccione trabajos en sockets y manejadores de archivos en sistemas * NIX. En los sistemas Windows, solo puede seleccionar en contra de los sockets.
- 1. ¿Es posible conocer la utilización de la CPU desde una secuencia de comandos
- 2. ¿Cómo puedo obtener una secuencia de comandos Perl para ver las variables en otra secuencia de comandos de Perl?
- 3. ¿Cómo puedo probar una secuencia de comandos de Perl independiente?
- 4. Forma multiplataforma para obtener la utilización de CPU/memoria
- 5. utilización de la CPU alta para dormir procesa
- 6. ¿Cómo deobfusacte correctamente una secuencia de comandos de Perl?
- 7. Muy poca utilización de CPU en Java
- 8. ¿Cómo esperar la pulsación de la tecla en la secuencia de comandos de Perl?
- 9. Pasando el valor de la secuencia de comandos PHP a la secuencia de comandos de Python
- 10. La secuencia de comandos PHP no puede obtenerse desde la secuencia de comandos de Python
- 11. ¿"usar ...." en la parte superior agrega sobrecarga a una secuencia de comandos de Perl?
- 12. ¿Cómo especificar en la secuencia de comandos que solo se use una versión específica de perl?
- 13. ¿Cómo ejecuto una secuencia de comandos Perl en múltiples archivos de entrada con la misma extensión?
- 14. ¿Asincronizar la secuencia de comandos de vim?
- 15. Obtención de la ruta de una secuencia de comandos R
- 16. Dando a la etiqueta de secuencia de comandos una ID
- 17. Argumento booleano para la secuencia de comandos
- 18. MongoDB - La utilización del servidor de múltiples CPU para una escritura pesada aplicación
- 19. Cómo conectar la ranura PyQt de la secuencia de fondo a la secuencia de comandos
- 20. Invocar una segunda secuencia de comandos con argumentos de una secuencia de comandos
- 21. Calculando con precisión la utilización de la CPU en Linux utilizando/proc/stat
- 22. ¿La ejecución de sus servidores al 100% del uso de la CPU causa algún problema o es solo una buena utilización de la CPU?
- 23. recomendación para la secuencia de comandos de la galería
- 24. ha podido recuperar la programación de utilización de la GPU
- 25. Usando llamadas al sistema desde C, ¿cómo obtengo la utilización de la (s) CPU (s)?
- 26. Utilización de la clase HttpWebRequest
- 27. Cómo obtener el nombre de la secuencia de comandos Perl que se ejecuta
- 28. De repente, las secuencias de comandos perl no funcionan a menos que las prefija con "perl" y den la ruta completa a la secuencia de comandos
- 29. ¿cómo detengo la ejecución en una secuencia de comandos python?
- 30. agrega automáticamente la ruta en una secuencia de comandos MATLAB
Esto depende de la plataforma. ¿En qué SO se está ejecutando? –
@bish Si no hay otros procesos que necesiten la CPU, ¿por qué debería permitirlo desperdiciar buenos ciclos cuando se pueden aprovechar? – Eli
Estoy ejecutando mis scripts en Windows. Sí, hay otros procesos que también se están ejecutando. Tenía que ser menos molesto con mis guiones. –