Shell-script para periodicamente liberar alguma memória com o LiveCD do Ubuntu 18.10 com apenas 4GB de RAM. Precisa de alguma melhoria

0

Editar 1: O congelamento acabou de acontecer e eu consegui me recuperar disso. Log (syslog) do congelamento até 'now': link

Edit 2: Parece um bug / problema com o GDM3. Vou tentar o Xubuntu.

Edit 3: Agora estou usando o Xubuntu. O problema ainda acontece, mas com muito menos frequência. Então, é de fato um problema de memória.

Atualmente estou usando o Live 18.10 do Ubuntu desde que meu HD morreu. Eu fiz algumas personalizações no meu LiveCD principalmente para o consumo de memória, porque eu tenho apenas 4GB de RAM.

Quando minha memória livre fica abaixo de 100MB, meu LED pendrive começa a piscar como um louco e o sistema congela deixando-me tempo para sair da interface gráfica ( Ctrl + Alt + f1 ... f12 ) e reinicialização ( Ctrl + Alt + Del ) ou, às vezes, para fechar o Google Chrome com sudo killall chrome .

Por isso, criei um script muito simples para limpar o cache do sistema e fechar o Google Chrome. Fechar o Chrome do nada é bom, já que ele pede para você recuperar as guias quando não foi fechado corretamente.

A questão : funciona como um encanto 95% do tempo. Não sei se meu script é muito simples ou se há outro motivo para esse congelamento intermitente, pois não posso verificar o log, devido à necessidade de reinicialização. Existe uma maneira mais eficiente de fazer isso? Estou fazendo errado?

Obs .: Eu tenho outro script para limpar o cache que é executado a cada 15 minutos. Desde que criei esses scripts, eu posso usar meu LiveCD todos os dias com quase nenhum congelamento. Talvez 1 por dia .. Antes disso eu tive que reiniciar a cada 30-40min, porque eu uso o Chrome com várias abas.

Meu script:

#!/bin/bash 

while true ; do 
free='free -m | grep Mem | awk '{print $4}''
if [ "$free" -gt 0 ]
 then
    if [ $free -le 120 ]; #When my memory consuptiom goes below 120MB do the commands below. 
     then

if pgrep -x "chrome" > /dev/null
then
        sudo killall -9 chrome
        sudo su xubuntu
        /usr/bin/google-chrome-stable --password-store=basic --aggressive-cache-discard --aggressive-tab-discard
else
    echo "Stopped"
fi

    sudo sysctl -w vm.drop_caches=3
        sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 



    fi
fi & sleep 1; done
    
por Lucas Rizzini 24.11.2018 / 17:47

1 resposta

0

A solução que "fra-san" deu nos comentários aqui encaixou perfeitamente. Usando o pacote "cgroup-tools", consegui limitar o uso da memória do Chrome com êxito. Testei-o abrindo dezenas de abas ao mesmo tempo e pude ver o limite de memória em ação. No entanto, tive que deixar meu script em execução, pois, por mais que eu use principalmente o Chrome, o cache do sistema consome muita memória RAM também.

Meus passos:

1- Use este script de: Limite o uso de memória para um único processo do Linux

#!/bin/sh

# This script uses commands from the cgroup-tools package. The cgroup-tools commands access the cgroup filesystem directly which is against the (new-ish) kernel's requirement that cgroups are managed by a single entity (which usually will be systemd). Additionally there is a v2 cgroup api in development which will probably replace the existing api at some point. So expect this script to break in the future. The correct way forward would be to use systemd's apis to create the cgroups, but afaik systemd currently (feb 2018) only exposes dbus apis for which there are no command line tools yet, and I didn't feel like writing those.

# strict mode: error if commands fail or if unset variables are used
set -eu

if [ "$#" -lt 2 ]
then
    echo Usage: 'basename $0' "<limit> <command>..."
    echo or: 'basename $0' "<memlimit> -s <swaplimit> <command>..."
    exit 1
fi

cgname="limitmem_$$"

# parse command line args and find limits

limit="$1"
swaplimit="$limit"
shift

if [ "$1" = "-s" ]
then
    shift
    swaplimit="$1"
    shift
fi

if [ "$1" = -- ]
then
    shift
fi

if [ "$limit" = "$swaplimit" ]
then
    memsw=0
    echo "limiting memory to $limit (cgroup $cgname) for command $@" >&2
else
    memsw=1
    echo "limiting memory to $limit and total virtual memory to $swaplimit (cgroup $cgname) for command $@" >&2
fi

# create cgroup
sudo cgcreate -g "memory:$cgname"
sudo cgset -r memory.limit_in_bytes="$limit" "$cgname"
bytes_limit='cgget -g "memory:$cgname" | grep memory.limit_in_bytes | cut -d\  -f2'

# try also limiting swap usage, but this fails if the system has no swap
if sudo cgset -r memory.memsw.limit_in_bytes="$swaplimit" "$cgname"
then
    bytes_swap_limit='cgget -g "memory:$cgname" | grep memory.memsw.limit_in_bytes | cut -d\  -f2'
else
    echo "failed to limit swap"
    memsw=0
fi

2- Nomeado como "limitmem" e copiado para / usr / bin / então eu poderia chamá-lo do terminal apenas com limitmem . Agora eu posso abrir um processo que limita o uso da memória para, por exemplo, 800MB usando esta sintaxe: limitmem 800M command

No meu caso: limitmem 1000M google-chrome --password-store=basic --aggressive-cache-discard --aggressive-tab-discard

    
por 04.12.2018 / 09:21