• Publicidad

Memoria RAM

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Memoria RAM

Notapor Emstro » 2011-08-02 10:10 @465

Hola amigos.

¿Alguien sabe cómo obtener más memoria RAM al lanzar un .pl?
Me refiero a que si se puede privilegiar mi proceso antes que otros.

Saludos y gracias.
Emstro
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2010-11-08 16:12 @716

Publicidad

Re: Memoria RAM

Notapor explorer » 2011-08-02 13:19 @596

Bueno, la mayor parte de las veces los límites los impone el sistema operativo, para que no haya ningún proceso acapare todos los recursos, y los demás procesos queden "congelados".

En Linux, normalmente, los procesos son arrancados por un proceso shell. En el shell bash existe el comando ulimit que permite ajustar los límites de los recursos que puede usar el proceso del shell y los procesos que éste arrancará.

Por ejemplo, si hacemos
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> ulimit -a
  2. core file size          (blocks, -c) 0
  3. data seg size           (kbytes, -d) unlimited
  4. scheduling priority             (-e) 0
  5. file size               (blocks, -f) unlimited
  6. pending signals                 (-i) 19717
  7. max locked memory       (kbytes, -l) 64
  8. max memory size         (kbytes, -m) 2155428
  9. open files                      (-n) 1024
  10. pipe size            (512 bytes, -p) 8
  11. POSIX message queues     (bytes, -q) 819200
  12. real-time priority              (-r) 0
  13. stack size              (kbytes, -s) 8192
  14. cpu time               (seconds, -t) unlimited
  15. max user processes              (-u) 19717
  16. virtual memory          (kbytes, -v) 2870400
  17. file locks                      (-x) unlimited
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
ulimit nos informa de los todos los límites que están puestos por defecto. Como propietarios de este shell, podemos modificar algunas condiciones. Por ejemplo, decir que en vez de poder reservar 2Gb de memoria, podremos reservar todo lo que el sistema pueda darnos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> ulimit -m unlimited
  2. explorer@casa:~/Documentos/Desarrollo> ulimit -m
  3. unlimited
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Así que, tú mismo podrías colocar una instrucción ulimit en alguno de los ficheros de arranque del shell del usuario que va a ejecutar el proceso, para ajustarlo a tus necesidades (.profile, .bashrc).

A nivel de sistema, podemos dar límites según el usuario o grupo al que pertenezca ese usuario. De ello se encarga el módulo pam_limits (man pam_limits), que toma sus valores por defecto del fichero /etc/security/limits.conf y de los ficheros contenidos dentro del directorio /etc/security/limits.d/. La definición de estos ficheros la tienes en man 5 limits.conf.

Otra cosa es privilegiar a tu proceso frente a otros. Para eso necesitas tener privilegios de superusuario (o root). Con el comando renice se puede ajustar la prioridad de un proceso que ya se está ejecutando. Y con el comando nice se puede ajustar la prioridad de un proceso que vamos a ejecutar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Memoria Ram

Notapor alfplayer » 2011-08-02 17:30 @771

Hay que diferenciar entre el uso de memoria y las prioridades de los procesos que se puede controlar con nice y renice, que se refiere al CPU, no a la memoria. O sea, un programa puede usar mucho el CPU y poca memoria, o viceversa.

ulimit limita aplicaciones, pero no se pueden ejecutar aplicaciones que no tienen memoria suficiente.

Creo que hay varias estrategias. Algunas que se me ocurren:

  • En Linux está disponible mlock para fijar en RAM parte o todo el espacio de memoria virtual del proceso; no sé si existe un equivalente en Perl.
  • Controlar cuánta memoria usan las otras aplicaciones y ejecutar sólo las más necesarias o las que usan menos memoria. Ejemplos:
    • Usar software alternativo que use menos memoria.
    • Usar sistemas operativos livianos, como distribuciones de GNU/Linux que usan poca memoria por defecto.
    • Cerrar aplicaciones manualmente o programáticamente antes que el programa requiera memoria.
  • También está la posibilidad de ajustar valores de swappiness de Linux para controlar la paginación.
alfplayer
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-07-30 13:31 @605
Ubicación: Buenos Aires, Argentina

Re: Memoria Ram

Notapor explorer » 2011-08-02 18:50 @826

alfplayer escribiste:O sea, un programa puede usar mucho el CPU y poca memoria, o viceversa.
También existe la tercera y cuarta posibilidad: que use mucha CPU y memoria y que no las use. En cuanto a programas, los hay de todas clases.

alfplayer escribiste:ulimit limita aplicaciones, pero no se pueden ejecutar aplicaciones que no tienen memoria suficiente.
Sí, sí que se puede. Bueno, siempre que no se sobrepasen los límites de direccionamiento virtual. Con funcionalidades como mmap(2) se puede mapear los contenidos de un fichero que esté en disco a direcciones virtuales del proceso, con lo que éste puede acceder a sus contenidos sin tener que cargarlo en memoria. Y el fichero puede ser todo lo grande que se quiera, hasta el límite máximo del direccionamiento posible, que suele ser mucho mayor que la cantidad de memoria RAM. En CPAN hay módulos para hacer esto. Referencias a dos de ellos en la página de Wikipedia, al final.

alfplayer escribiste:En Linux está disponible mlock para fijar en RAM parte o todo el espacio de memoria virtual del proceso; no sé si existe un equivalente en Perl.
Sí que hay algún módulo que tiene esa funcionalidad, como por ejemplo, IO::AIO.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Memoria RAM

Notapor creating021 » 2011-08-02 21:13 @926

Si en el sistema operativo en el que se está trabajando soporta setpriority, en Perl se puede usar dicha función. Supongo que sería mucho más fácil usar BSD::Resources aunque no deja de ser otra posibilidad :) .
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Memoria Ram

Notapor alfplayer » 2011-08-03 01:42 @113

explorer escribiste:
alfplayer escribiste:ulimit limita aplicaciones, pero no se pueden ejecutar aplicaciones que no tienen memoria suficiente.
Sí, sí que se puede. Bueno, siempre que no se sobrepasen los límites de direccionamiento virtual. Con funcionalidades como mmap(2) se puede mapear los contenidos de un fichero que esté en disco a direcciones virtuales del proceso, con lo que éste puede acceder a sus contenidos sin tener que cargarlo en memoria. Y el fichero puede ser todo lo grande que se quiera, hasta el límite máximo del direccionamiento posible, que suele ser mucho mayor que la cantidad de memoria RAM. En CPAN hay módulos para hacer esto. Referencias a dos de ellos en la página de Wikipedia, al final.


Según https://lkml.org/lkml/2011/2/8/214, ulimit -m (maximum resident set size / RLIMIT_RSS) no está implementado actualmente en Linux.

La otra opción interesante de ulimit para limitar aplicaciones en general es -v que limita la memoria virtual del proceso (no evita que trabaje en swap). Al parecer, el uso principal es evitar que si una aplicación pide mucha memoria no haga detener otras aplicaciones o arriesgue la estabilidad del sistema. Con esto, si las aplicaciones llegan a su límite impuesto de memoria virtual no se asegura que continúen ejecutándose y pueden detenerse. Puede ser útil para detectar qué programas usan demasiada memoria o para asegurar que otras aplicaciones tengan un mínimo de memoria disponible, pero como expliqué puede traer problemas hasta que se aprende a controlar el uso de memoria de las aplicaciones del sistema. Puede ser empleada pero estratégicamente.

Igualmente, es posible limitar el uso de RAM de aplicaciones usando cgroups en GNU/Linux o con ulimit -m en sistemas que lo soporten (al sobrepasar el límite se trabaja en swap).

setpriority modifica el mismo valor que los comandos nice y renice (como ya mencioné, referido a la prioridad del proceso en el CPU).

Se puede programar intentando usar poca memoria de aplicaciones por ejemplo con mmap, pero mi respuesta apunta a priorizar el uso de memoria en aplicaciones en general, aunque es un tema que excede a Perl.
alfplayer
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-07-30 13:31 @605
Ubicación: Buenos Aires, Argentina

Re: Memoria RAM

Notapor pvaldes » 2011-08-08 17:25 @767

Pregunta genérica, respuesta genérica.

Optimizando tu código Perl.
Aumentando un poco el valor nice para ese proceso de perl (¡temporalmente!)
y optimizando el uso de memoria fuera de Perl, lo que puede implicar cerrar programas que no sean necesarios.
Puede implicar cerrar X y correr el programa fuera del sistema gráfico en una tty.
Puede implicar no usar librerías redundantes de un escritorio distinto al que tienes instalado,
y suele ser bueno a la hora de establecer tu estrategia, tirar de free, y averiguar qué programa está gastando más recursos con memstat, (y si no es imprescindible cerrarlo el primero).
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 31 invitados

cron