RAMが4GBしかないUbuntu 18.10 LiveCDの一部のメモリを定期的に確保するシェルスクリプトです。若干の改善が必要です

RAMが4GBしかないUbuntu 18.10 LiveCDの一部のメモリを定期的に確保するシェルスクリプトです。若干の改善が必要です

編集1:ちょうど停止現象が発生し、修復できました。停止状態から現在までのログ(syslog):https://ufile.io/ivred

編集2:これはGDM3のバグ/問題のようです。私はXubuntuを試してみます。

編集3:今Xubuntuを使用しています。問題はまだ発生しますが、頻度ははるかに低いです。だから..本当にメモリの問題です。

HDが終了して以来、現在Ubuntu 18.10 Live CDを使用しています。 RAMは4GBしかないので、主にメモリ消費のためにLiveCDをいくつかカスタマイズしました。

利用可能なメモリが100 MB未満に低下すると、ペンドライブのLEDが狂ったように点滅し始め、システムがフリーズしてGUIインターフェイスを終了し(Ctrl++...)、再起動(++)するか、時々Google Chromeと。Altf1f12CtrlAltDelsudo killall chrome

そのため、システムキャッシュをクリーンアップしてGoogle Chromeを閉じる非常に簡単なスクリプトを作成しました。タブが正しく閉じられていない場合は、タブを復元するように求められます。

質問:95%の場合、それは魅力のように動作します。私のスクリプトが単純すぎるか、再起動が必要なためログを確認できないため、断続的にハングする他の原因があるかどうかわかりません。これを行うより効率的な方法はありますか?私は何が間違っていましたか?

観察:15分ごとに実行されるキャッシュをクリーンアップする別のスクリプトがあります。このスクリプトを作成したので、ほとんど問題なくLiveCDを毎日使用できます。 1日1回程度かもしれません。以前は複数のタブを持つChromeを使用していたため、30〜40分ごとに再起動する必要がありました。

私のスクリプト:

#!/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

ベストアンサー1

コメントに「fra-san」が提供したソリューションが完璧にフィットします。 「cgroup-tools」パッケージを使用してChromeのメモリ使用量を正常に制限できました。何十ものタブを同時に開いてテストしましたが、メモリ制限が実際に機能していることがわかります。ただし、Chromeを主に使用してもシステムキャッシュもRAMを消費するため、スクリプトを実行し続ける必要があります。

私のステップ:

1- 次のスクリプトを使用します。単一の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-名前を「limitmem」として指定して/usr/bin/にコピーすると、端末から呼び出すことができますlimitmem。次の構文を使用して、メモリ使用量を800 MBに制限するプロセスを開くことができます。limitmem 800M command

私:limitmem 1000M google-chrome --password-store=basic --aggressive-cache-discard --aggressive-tab-discard

おすすめ記事