用于定期释放仅 4GB RAM 的 Ubuntu 18.10 LiveCD 的一些内存的 Shell 脚本。需要一些改进

用于定期释放仅 4GB RAM 的 Ubuntu 18.10 LiveCD 的一些内存的 Shell 脚本。需要一些改进

编辑1:冻结刚刚发生,我能够从中恢复过来。从冻结到现在的日志(syslog):https://ufile.io/ivred

编辑 2:这似乎是 GDM3 的错误/问题。我会尝试Xubuntu。

编辑3:现在我正在使用Xubuntu。问题仍然会发生,但频率要低得多。所以..这确实是一个内存问题。

自从我的 HD 坏了之后,我目前正在使用 Ubuntu 18.10 Live CD。我对 LiveCD 进行了一些自定义,主要针对内存消耗,因为我只有 4GB 的 RAM。

当我的可用内存低于 100MB 时,我的随身碟 LED 开始疯狂闪烁,系统冻结,让我有时间退出 GUI 界面 ( Ctrl++ ... ) 并重新启动 ( ++ ) ,或者有时关闭 Google Chrome和。Altf1f12CtrlAltDelsudo killall chrome

所以我创建了一个非常简单的脚本来清理系统缓存并关闭 Google Chrome。像这样突然关闭 Chrome 是可以的,因为它会要求您在标签未正确关闭时恢复标签。

问题:95% 的情况下它都像魅力一样有效。我不知道我的脚本是否太简单,或者还有其他原因导致这种间歇性冻结,因为我无法检查日志,因为需要重新启动。有没有更有效的方法来做到这一点?我做错了吗?

观察:我有另一个脚本来清理每 15 分钟运行一次的缓存。自从我创建了这些脚本以来,我每天都可以使用我的 LiveCD,几乎没有任何卡顿。也许每天 1 次。在此之前,我必须每 30-40 分钟重新启动一次,因为我使用带有多个选项卡的 Chrome。

我的脚本:

#!/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。现在我可以使用以下语法打开一个将内存使用限制为例如 800MB 的进程:limitmem 800M command

就我而言:limitmem 1000M google-chrome --password-store=basic --aggressive-cache-discard --aggressive-tab-discard

答案2

您问您是否以最有效的方式做到这一点。我一直以非常类似的方式使用笔记本电脑。使用 LiveUSB 三年来我注意到的事情:

  1. 尽量不要使用apt-get install安装包;代替使用sudo dpkg -i。这似乎使“共享”内存保持较低(系统文件被修改,从而占用 RAMdisk 中的更多内存)。
  2. 您不需要终止整个 Chromium 进程树;您只能杀死它留下的“剩余”关闭选项卡(通常称为--type=renderer进程)。您可以通过运行以下命令来执行此操作:
    ps aux | grep type=renderer
    kill -9 $(ps aux | grep type=renderer)
    
    您可以指定键盘快捷键来运行包含该kill命令的脚本。这样您就不必重新加载整个浏览器;您只需单击通知弹出窗口即可重新加载扩展。无论出于何种原因,此后的内存开销都保持在非常低的水平。
  3. 我曾经clean cache/buffers每天多次使用该命令,但随着时间的推移我注意到我只需要关注“可用”内存而不是“空闲”内存。我的系统在只有 100 MB 可用空间的情况下仍能正常运行。我只需担心可用空间低于 300 MB;然后通常按终止 Chromium 热键即可解决问题。

    我很想知道是否有一种方法可以在每次可用内存达到某个下限时触发“kill Chromium”命令。

注意:我尝试了 Zram/Zswap 程序,但这些似乎没有帮助;这些似乎只会使系统过度使用冻结更频繁,从而导致频繁重新启动(对已经很旧的硬盘的磨损更多,重新启动或挂起的次数越少越好)。

相关内容