Saltar al contenido

La computadora se congela con casi toda la RAM, posiblemente un problema de caché de disco

Es imprescindible comprender el código de forma correcta antes de utilizarlo a tu proyecto si tdeseas aportar algo puedes compartirlo con nosotros.

Solución:

Para solucionar este problema, descubrí que debe establecer la siguiente configuración en alrededor del 5% -6% de su RAM física total, dividida por la cantidad de núcleos en la computadora:

sysctl -w vm.min_free_kbytes=65536

Tenga en cuenta que esta es una configuración por núcleo, por lo que si tengo 2 GB de RAM y dos núcleos, calculé el 6 % de solo 1 GB y agregué un poco más solo para estar seguro.

Esto obliga a la computadora a tratar de mantener libre esta cantidad de RAM y, al hacerlo, limita la capacidad de almacenar en caché los archivos del disco. Por supuesto, todavía intenta almacenarlos en caché e intercambiarlos de inmediato, por lo que probablemente también debería limitar su intercambio:

sysctl -w vm.swappiness=5

(100 = intercambiar tan a menudo como sea posible, 0 = intercambiar solo si es absolutamente necesario)

El resultado es que Linux ya no decide al azar cargar un archivo completo de película de aproximadamente 1GB en RAM mientras lo mira, y mata la máquina al hacerlo.

Ahora hay suficiente espacio reservado para evitar el agotamiento de la memoria, que aparentemente era el problema (ya que no hay más bloqueos como antes).

Después de probar durante un día, los bloqueos desaparecieron, a veces hay ralentizaciones menores, porque las cosas se almacenan en caché con más frecuencia, pero puedo vivir con eso si no tengo que reiniciar la computadora cada pocas horas.

La lección aquí es: la administración de memoria predeterminada es solo uno de los casos de uso y no siempre es la mejor, aunque algunas personas intentan sugerir lo contrario: el entretenimiento en el hogar ubuntu debe configurarse de manera diferente al servidor.


Probablemente desee hacer que estas configuraciones sean permanentes agregándolas a su /etc/sysctl.conf Me gusta esto:

vm.swappiness=5
vm.min_free_kbytes=65536

Esto me sucedió en una nueva instalación de Ubuntu 14.04.

En mi caso, no tuvo nada que ver con los problemas de sysctl mencionados.

En cambio, el problema era que el UUID de la partición de intercambio era diferente durante la instalación que después de la instalación. Por lo tanto, mi intercambio nunca se habilitó y mi máquina se bloqueaba después de unas horas de uso.

La solución fue verificar el UUID actual de la partición de intercambio con

sudo blkid

y luego sudo nano /etc/fstab para reemplazar el valor UUID del intercambio incorrecto con el informado por blkid.

Un simple reinicio para afectar los cambios, y listo.

A mi no me funciono nada!!

Así que escribí un script para monitorear el uso de la memoria. Primero intentará borrar la caché de RAM si el consumo de memoria aumenta un umbral. Puede configurar este umbral en el script. Si el consumo de memoria no cae por debajo del umbral incluso entonces, comenzará a matar procesos uno por uno en orden decreciente de consumo de memoria hasta que el consumo de memoria esté por debajo del umbral. Lo he configurado al 96% por defecto. Puede configurarlo cambiando el valor de la variable RAM_USAGE_THRESHOLD en el script.

Estoy de acuerdo en que matar procesos que consumen mucha memoria no es la solución perfecta, ¡pero es mejor matar UNA aplicación en lugar de perder TODO el trabajo! el script le enviará una notificación de escritorio si el uso de RAM aumenta el umbral. También le notificará si elimina algún proceso.

#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()

RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100

def main():
    if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
        # Clear RAM cache
        mem_warn = "Memory usage critical: %nClearing RAM Cache".
            format(psutil.virtual_memory().percent)
        print(mem_warn)
        Popen("notify-send """.format(mem_warn), shell=True)
        print("Clearing RAM Cache")
        print(Popen('echo 1 > /proc/sys/vm/drop_caches',
                    stdout=PIPE, stderr=PIPE,
                    shell=True).communicate())
        post_cache_mssg = "Memory usage after clearing RAM cache: %".format(
                            psutil.virtual_memory().percent)
        Popen("notify-send """.format(post_cache_mssg), shell=True)
        print(post_cache_mssg)

        if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
            print("Clearing RAM cache saved the day")
            return
        # Kill top CMAX_NUM_PROCESS_KILL highest memory consuming processes.
        ps_killed_notify = ""
        for i, ps in enumerate(sorted(psutil.process_iter(),
                                      key=lambda x: x.memory_percent(),
                                      reverse=True)):
            # Do not kill root
            if ps.pid == 1:
                continue
            elif (i > MAX_NUM_PROCESS_KILL) or 
                    (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
                messagebox.showwarning('Killed proccess - save_hang',
                                       ps_killed_notify)
                Popen("notify-send """.format(ps_killed_notify), shell=True)
                return
            else:
                try:
                    ps_killed_mssg = "Killed   () which was consuming " 
                                     " % memory (memory usage=)". 
                        format(i, ps.name(), ps.pid, ps.memory_percent(),
                               psutil.virtual_memory().percent)
                    ps.kill()
                    time.sleep(1)
                    ps_killed_mssg += "Current memory usage=".
                        format(psutil.virtual_memory().percent)
                    print(ps_killed_mssg)
                    ps_killed_notify += ps_killed_mssg + "n"
                except Exception as err:
                    print("Error while killing : ".format(ps.pid, err))
    else:
        print("Memory usage = " + str(psutil.virtual_memory().percent))
    root.update()


if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as err:
            print(err)
        time.sleep(1)

Guarde el código en un archivo, digamos save_hang.py. Ejecute el script como:

sudo python save_hang.py

Tenga en cuenta que este script es compatible solo con Python 3 y requiere que instale el paquete tkinter. puedes instalarlo como:

sudo apt-get install python3-tk

Espero que esto ayude...

Si conservas alguna suspicacia y disposición de perfeccionar nuestro noticia puedes ejecutar una crónica y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *