Cuando tengo procesos que consumen grandes cantidades de memoria o tengo muchos procesos vinculados a la CPU en ejecución, a menudo resulta difícil incluso iniciar sesión en el sistema. Me gustaría evitar eso y mantener siempre el sistema receptivo. ¿Hay alguna forma de lograr esto?
Edición aclaratoria:
Estoy hablando de dos situaciones diferentes en las que experimento los mismos síntomas:
Carga de memoria muy alta. Un único proceso que consume cerca o más de los 64 GB de RAM disponibles. Cuando el sistema se acerca al 100% de uso, los programas dejan de responder.
Carga de CPU muy alta, problemas de programación. Tener 10.000 procesos ejecutables causa el mismo problema. Tenga en cuenta que esto no es un problema de carga del 100% de la CPU. Cuando elimino -STOP todos menos 200 de esos procesos, las 32 CPU permanecen al 100% de carga, pero el sistema es mucho más utilizable.
Y sobre el tema de lo que considero "el sistema". Entiendo que no existe una diferencia conceptual entre un proceso de shell y uno de mis otros procesos de usuario, pero es solo cuestión de hacerlos diferentes. Hay opciones como la amabilidad que hacen precisamente eso. Pero como se mencionó anteriormente, la amabilidad no resolvió el problema, al menos no en el caso (2.).
Tengo control total de estos sistemas y en todos los casos he podido detener trabajos usando kill -STOP o simplemente Cc.Lo que me gustaría solucionar es que esto se vuelve increíblemente difícil y, cuando se usa una GUI, a veces es imposible porque la entrada se procesa increíblemente lenta, en todo caso. Me gustaría solucionar este problema en general, no realizar cambios en algunos trabajos específicos.
Cosas que he probado:
Para muchos procesos en ejecución, que estoy teniendo en este momento, simplemente renuncié todos los procesos en ejecución a +5, pero eso no pareció ayudar. Ni ponerlos en amabilidad 19.
Como se sugiere en una de las respuestas. Intenté cambiar la política del programador a IDLE usando
sudo schedtool -D $(pgrep -u myuser progname -d " ")
y consudo sh -c 'for pid in $(pgrep -u myuser progname); do chrt -i -p 0 $pid; done;'
Esto parece mejorar un poco la situación.
Respuesta1
El problema es que estás saturando tu memoria y como resultado el sistema operativo tiene que recurrir a liberar cachés de disco e intercambiar programas y sus datos para intercambiarlos.
El intercambio es un método para mantener un sistema funcionando cuando se alcanzan los límites de memoria física. En un sistema con poca carga, esto puede significar que el sistema sigue funcionando y las cosas se eliminan cuando ocurre un problema y luego se vuelven a ingresar cuando es necesario con solo efectos menores.
La mayoría de los sistemas operativos eliminan programas y códigos para intercambiarlos según el "uso menos reciente". Es difícil hacer algún tipo de suposición sobre la "prioridad" de la memoria porque las cargas de memoria cambian y la "prioridad" es una pendiente resbaladiza de juicios subjetivos sobre lo que es más importante. Lo que es más importante para un sistema lo es menos para otro. Los programas de línea de comando son simplemente otros programas y es imposible distinguirlos de otros programas ejecutados por el usuario.
Como tiene un sistema muy cargado con muchos procesos que utilizan mucha memoria, se encuentra con un problema de contención. En el momento en que el sistema operativo intenta enviar algo al disco para liberar algo de memoria, otro proceso ya ha solicitado otras páginas que deben volver a ingresarse. Cada solicitud para recuperar algo expulsa algo más.
Entre 10.000 procesos, ¿cómo podría un sistema determinar qué debería tener prioridad sobre las solicitudes de programas de línea de comandos del "sistema" que se parecen a cualquier otra solicitud de programa?
El otro problema son los tiempos de búsqueda del disco duro. Para los HDD de estilo antiguo, el tiempo para mover el cabezal de la unidad y comenzar una lectura o escritura es del orden de 9,5 milisegundos. Con muchas solicitudes sucediendo a la vez para diferentes áreas, el tiempo puede dominar sobre todo lo demás y reducir el tiempo útil real y el ancho de banda a cifras sorprendentemente pequeñas. Un SSD puede ayudar, pero si tiene memoria limitada, entonces solo puede ayudar hasta cierto punto.
Pueden ocurrir cuellos de botella similares en todo el sistema y presentar síntomas diferentes. El sistema operativo puede gestionar un gran número de programas simultáneos, pero sigue siendo "sólo" un programa en sí mismo y necesita tiempo entre todo lo demás. El uso de archivos de intercambio es sólo uno de los cuellos de botella más extremos.
Inundar un sistema de esta manera y simplemente esperar que "se ocupe de ello" no es una buena idea.
Si utiliza constantemente más memoria de la que tiene, la respuesta es comprar más memoria. Si tiene miles de procesos compitiendo por el tiempo del disco duro para leer o escribir datos, entonces necesita distribuir la carga entre más máquinas o unidades.
En su otra situación, con 10.000 procesos activos, su problema es a la vez de discordia y expectativas poco realistas.
Un problema es que la "amabilidad" no siempre es necesariamente una prioridad menor. Depende del programador del sistema operativo y agregar más y más procesos en realidad puede ir en contra de tener un sistema justo y útil, ya que termina reduciendo la cantidad de tiempo asignado a cualquier proceso determinado.
Vea esta pregunta de nuestro sitio hermano de Unix¿Qué tal es lindo trabajar?que describe el Programador Completamente Justo:
El CFS tiene una latencia objetivo para la duración de la programación. Las latencias de destino más pequeñas producen una mejor interactividad, pero a medida que la latencia de destino disminuye, la sobrecarga de conmutación aumenta, lo que disminuye el rendimiento general.
...
Ahora considere dos procesos, uno con una amabilidad de 0 (el valor predeterminado) y el otro con una amabilidad de 5. La diferencia proporcional entre los pesos correspondientes es aproximadamente 1/3, lo que significa que el proceso de mayor prioridad recibe un intervalo de tiempo de aproximadamente 15 milisegundos. mientras que el proceso de menor prioridad recibe un intervalo de tiempo de 5 milisegundos.
Bajo este programador, la amabilidad significa que sus 10,000 procesosdeberíaobtenga menos tiempo, pero debido a la gran cantidad de ellos, es posible que esté alcanzando el límite inferior del valor del intervalo de tiempo para una programación "justa" y lo que significa que nadie obtiene un intervalo de tiempo de buen tamaño. Incluso podría estar alcanzando un límite en el que domina el tiempo la ejecución de tareas dentro o fuera de las CPU.
En la práctica, esto es lo mismo que la contención del disco duro. Está obligando a su sistema a dedicar más tiempo a intercambiar procesos que a dedicar tiempo útil a trabajar en un proceso determinado.
Puede obtener más información sobre el programador enhttp://man7.org/linux/man-pages/man7/sched.7.html
El uso de una cantidad más razonable de procesos (100 a 200) da como resultado que se divida una cantidad de tiempo razonable entre las tareas del sistema operativo y sus procesos.
En lugar de iniciar 10.000 tareas a la vez, deberías iniciar otras nuevas a medida que finalizan las anteriores.