diff options
Diffstat (limited to 'system')
-rw-r--r-- | system/earlyoom/README | 24 | ||||
-rw-r--r-- | system/earlyoom/doinst.sh | 26 | ||||
-rw-r--r-- | system/earlyoom/earlyoom.1 | 272 | ||||
-rw-r--r-- | system/earlyoom/earlyoom.SlackBuild | 108 | ||||
-rw-r--r-- | system/earlyoom/earlyoom.info | 10 | ||||
-rw-r--r-- | system/earlyoom/rc.earlyoom | 70 | ||||
-rw-r--r-- | system/earlyoom/slack-desc | 19 |
7 files changed, 529 insertions, 0 deletions
diff --git a/system/earlyoom/README b/system/earlyoom/README new file mode 100644 index 0000000000..fa2893b2b9 --- /dev/null +++ b/system/earlyoom/README @@ -0,0 +1,24 @@ +earlyoom checks the amount of available memory and free swap up to 10 +times a second (less often if there is a lot of free memory). By +default if both are below 10%, it will kill the largest process +(highest oom_score). The percentage value is configurable via command +line arguments. + +To enable it, put this line in your rc.local after running chmod +x on +/etc/rc.d/rc.earlyoom: + +if [ -x /etc/rc.d/rc.earlyoom ]; +then + /etc/rc.d/rc.earlyoom start +fi + +and to have it turnoff at shutdown, simply put this in your +rc.local_shutdown: + +if [ -x /etc/rc.d/rc.earlyoom ]; +then + /etc/rc.d/rc.earlyoom stop +fi + +A log file for it is kept at /var/log/earlyoom.log +And earlyoom can be configured by modifying /etc/default/earlyoom diff --git a/system/earlyoom/doinst.sh b/system/earlyoom/doinst.sh new file mode 100644 index 0000000000..7290fb4b61 --- /dev/null +++ b/system/earlyoom/doinst.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +config() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then # toss the redundant copy + rm $NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} + +preserve_perms() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + if [ -e $OLD ]; then + cp -a $OLD ${NEW}.incoming + cat $NEW > ${NEW}.incoming + mv ${NEW}.incoming $NEW + fi + config $NEW +} + +preserve_perms etc/rc.d/rc.earlyoom.new diff --git a/system/earlyoom/earlyoom.1 b/system/earlyoom/earlyoom.1 new file mode 100644 index 0000000000..0bcf687a2e --- /dev/null +++ b/system/earlyoom/earlyoom.1 @@ -0,0 +1,272 @@ +.\" Automatically generated by Pandoc 2.16.2 +.\" +.TH "earlyoom" "1" "" "" "General Commands Manual" +.hy +.SH NAME +.PP +earlyoom - Early OOM Daemon +.SH SYNOPSIS +.PP +\f[B]earlyoom\f[R] [\f[B]OPTION\f[R]]\&... +.SH DESCRIPTION +.PP +The oom-killer generally has a bad reputation among Linux users. +One may have to sit in front of an unresponsive system, listening to the +grinding disk for minutes, and press the reset button to quickly get +back to what one was doing after running out of patience. +.PP +\f[B]earlyoom\f[R] checks the amount of available memory and free swap +up to 10 times a second (less often if there is a lot of free memory). +If \f[B]both\f[R] memory \f[B]and\f[R] swap are below 10%, it will kill +the largest process (highest \f[C]oom_score\f[R]). +The percentage value is configurable via command line arguments. +.PP +If there is a failure when trying to kill a process, \f[B]earlyoom\f[R] +sleeps for 1 second to limit log spam due to recurring errors. +.SH OPTIONS +.SS -m PERCENT[,KILL_PERCENT] +.PP +set available memory minimum to PERCENT of total (default 10 %). +.PP +earlyoom starts sending SIGTERM once \f[B]both\f[R] memory \f[B]and\f[R] +swap are below their respective PERCENT setting. +It sends SIGKILL once \f[B]both\f[R] are below their respective +KILL_PERCENT setting (default PERCENT/2). +.PP +Use the same value for PERCENT and KILL_PERCENT if you always want to +use SIGKILL. +.PP +Examples: +.IP +.nf +\f[C] +earlyoom # sets PERCENT=10, KILL_PERCENT=5 +earlyoom -m 30 # sets PERCENT=30, KILL_PERCENT=15 +earlyoom -m 20,18 # sets PERCENT=20, KILL_PERCENT=18 +\f[R] +.fi +.SS -s PERCENT[,KILL_PERCENT] +.PP +set free swap minimum to PERCENT of total (default 10 %). +Send SIGKILL if at or below KILL_PERCENT (default PERCENT/2), otherwise +SIGTERM. +.PP +You can use \f[C]-s 100\f[R] to have earlyoom effectively ignore swap +usage: Processes are killed once available memory drops below the +configured minimum, no matter how much swap is free. +.PP +Use the same value for PERCENT and KILL_PERCENT if you always want to +use SIGKILL. +.SS -M SIZE[,KILL_SIZE] +.PP +As an alternative to specifying a percentage of total memory, +\f[C]-M\f[R] sets the available memory minimum to SIZE KiB. +The value is internally converted to a percentage. +If you pass both \f[C]-M\f[R] and \f[C]-m\f[R], the lower value is used. +Example: Reserve 10% of RAM but at most 1 GiB: +.IP +.nf +\f[C] +earlyoom -m 10 -M 1048576 +\f[R] +.fi +.PP +earlyoom sends SIGKILL if at or below KILL_SIZE (default SIZE/2), +otherwise SIGTERM. +.SS -S SIZE[,KILL_SIZE] +.PP +As an alternative to specifying a percentage of total swap, \f[C]-S\f[R] +sets the free swap minimum to SIZE KiB. +The value is internally converted to a percentage. +If you pass both \f[C]-S\f[R] and \f[C]-s\f[R], the lower value is used. +.PP +Send SIGKILL if at or below KILL_SIZE (default SIZE/2), otherwise +SIGTERM. +.SS -k +.PP +removed in earlyoom v1.2, ignored for compatibility +.SS -i +.PP +removed in earlyoom v1.7, ignored for compatibility +.SS -d +.PP +enable debugging messages +.SS -v +.PP +print version information and exit +.SS -r INTERVAL +.PP +Time between printing periodic memory reports, in seconds (default 1.0). +A memory report looks like this: +.IP +.nf +\f[C] +mem avail: 21790 of 23909 MiB (91.14%), swap free: 0 of 0 MiB ( 0.00%) +\f[R] +.fi +.PP +Set to 3600 to print a report every hour, to 86400 to print once a day +etc. +Set to 0 to disable printing periodic memory reports. +Free memory monitoring and low-memory killing runs independently of this +option at an adaptive poll rate that only depends on free memory. +Due to the adaptive poll rate, when there is a lot of free memory, the +actual interval may be up to 1 second longer than the setting. +.SS -p +.PP +Increase earlyoom\[cq]s priority: set niceness of earlyoom to -20 and +oom_score_adj to -100. +.PP +When earlyoom is run through its default systemd service, the +\f[C]-p\f[R] switch doesn\[cq]t work. +To achieve the same effect, enter the following three lines into +\f[C]sudo systemctl edit earlyoom\f[R]: +.IP +.nf +\f[C] +[Service] +OOMScoreAdjust=-100 +Nice=-20 +\f[R] +.fi +.SS -n +.PP +Enable notifications via d-bus. +.PP +To actually see the notifications in your GUI session, you need to have +systembus-notify (https://github.com/rfjakob/systembus-notify) running +as your user. +.SS -N /PATH/TO/SCRIPT +.PP +Run the given script for each process killed. +Must be an absolute path. +.PP +Within the script, information about the killed process can be obtained +via the following environment variables: +.IP +.nf +\f[C] +EARLYOOM_PID Process PID +EARLYOOM_NAME Process name truncated to 16 bytes (as reported in /proc/PID/comm) +EARLYOOM_UID UID of the user running the process +\f[R] +.fi +.PP +WARNING: \f[C]EARLYOOM_NAME\f[R] can contain spaces, newlines, special +characters and is controlled by the user, or it can be empty! +Make sure that your notification script can handle that! +.SS -g +.PP +Kill all processes that have same process group id (PGID) as the process +with excessive memory usage. +.PP +For example, with this flag turned on, the whole application will be +killed when one of its subprocess consumes too much memory (as long as +they all have the same PGID, of course). +.PP +Enable this flag when completely cleaning up the \[lq]entire +application\[rq] is more desirable, and you are sure that the +application puts all its processes in the same PGID. +.PP +Note that some desktop environments (GNOME, for example) put all desktop +application in the same process group as \f[C]gnome-shell\f[R]. +earlyoom might kill all such processes including \f[C]gnome-shell\f[R] +when this flag is turned on. +.PP +Be sure to check how your environment behaves beforehand. +Use +.IP +.nf +\f[C] +pstree -gT +\f[R] +.fi +.PP +to show all processes with the PGID in brackets. +.SS --prefer REGEX +.PP +prefer killing processes matching REGEX (adds 300 to oom_score) +.SS --avoid REGEX +.PP +avoid killing processes matching REGEX (subtracts 300 from oom_score) +.SS --ignore REGEX +.PP +ignore processes matching REGEX. +.PP +Unlike the --avoid option, this option disables any potential killing of +the matched processes that might have occurred due to the processes +attaining a high oom_score. +.PP +Use this option with caution as other processes might be sacrificed in +place of the ignored processes when earlyoom determines to kill +processes. +.SS --dryrun +.PP +dry run (do not kill any processes) +.SS -h, --help +.PP +this help text +.SH EXIT STATUS +.PP +0: Successful program execution. +.PP +1: Other error - inspect message for details +.PP +2: Switch conflict. +.PP +4: Could not cd to /proc +.PP +5: Could not open proc +.PP +7: Could not open /proc/sysrq-trigger +.PP +13: Unknown options. +.PP +14: Wrong parameters for other options. +.PP +15: Wrong parameters for memory threshold. +.PP +16: Wrong parameters for swap threshold. +.PP +102: Could not open /proc/meminfo +.PP +103: Could not read /proc/meminfo +.PP +104: Could not find a specific entry in /proc/meminfo +.PP +105: Could not convert number when parse the contents of /proc/meminfo +.SH Why not trigger the kernel oom killer? +.PP +Earlyoom does not use \f[C]echo f > /proc/sysrq-trigger\f[R] because the +Chrome people made their browser always be the first (innocent!) +victim by setting \f[C]oom_score_adj\f[R] very high. +Instead, earlyoom finds out itself by reading through +\f[C]/proc/*/status\f[R] (actually \f[C]/proc/*/statm\f[R], which +contains the same information but is easier to parse programmatically). +.PP +Additionally, in recent kernels (tested on 4.0.5), triggering the kernel +oom killer manually may not work at all. +That is, it may only free some graphics memory (that will be allocated +immediately again) and not actually kill any process. +.SH MEMORY USAGE +.PP +About 2 MiB VmRSS. +All memory is locked using mlockall() to make sure earlyoom does not +slow down in low memory situations. +.SH BUGS +.PP +If there is zero total swap on earlyoom startup, any \f[C]-S\f[R] +(uppercase \[lq]S\[rq]) values are ignored, a warning is printed, and +default swap percentages are used. +.PP +For processes matched by \f[C]--prefer\f[R], negative +\f[C]oom_score_adj\f[R] values are not taken into account, and the +process gets an effective \f[C]oom_score\f[R] of at least 300. +See https://github.com/rfjakob/earlyoom/issues/159 for details. +.SH AUTHOR +.PP +The author of earlyoom is Jakob Unterwurzacher +\[la]jakobunt\[at]gmail.com\[ra]. +.PP +This manual page was written by Yangfl \[la]mmyangfl\[at]gmail.com\[ra], +for the Debian project (and may be used by others). diff --git a/system/earlyoom/earlyoom.SlackBuild b/system/earlyoom/earlyoom.SlackBuild new file mode 100644 index 0000000000..4934e0ad80 --- /dev/null +++ b/system/earlyoom/earlyoom.SlackBuild @@ -0,0 +1,108 @@ +#!/bin/bash + +# Slackware build script for earlyoom + +# Copyright 2022 Charadon US +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +cd $(dirname $0) ; CWD=$(pwd) + +PRGNAM=earlyoom +VERSION=${VERSION:-1.7} +BUILD=${BUILD:-1} +TAG=${TAG:-_SBo} +PKGTYPE=${PKGTYPE:-tgz} + +if [ -z "$ARCH" ]; then +case "$( uname -m )" in + i?86) ARCH=i586 ;; + arm*) ARCH=arm ;; + *) ARCH=$( uname -m ) ;; +esac +fi + +# If the variable PRINT_PACKAGE_NAME is set, then this script will report what +# the name of the created package would be, and then exit. This information +# could be useful to other scripts. +if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then + echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE" + exit 0 +fi + +TMP=${TMP:-/tmp/SBo} +PKG=$TMP/package-$PRGNAM +OUTPUT=${OUTPUT:-/tmp} + +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +else + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +fi + +set -e + +rm -rf $PKG +mkdir -p $TMP $PKG $OUTPUT +cd $TMP +rm -rf $PRGNAM-$VERSION +tar xvf $CWD/$PRGNAM-$VERSION.tar.gz +cd $PRGNAM-$VERSION +chown -R root:root . +find -L . \ + \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ + -o -perm 511 \) -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ + -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; + + +make PREFIX=/usr +make DESTDIR=$PKG PREFIX=/usr install-bin +install -Dm644 earlyoom.default $PKG/etc/default/earlyoom +install -Dm644 $CWD/earlyoom.1 $PKG/usr/man/man1/earlyoom.1 + + +rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la + +find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true + +find $PKG/usr/man -type f -exec gzip -9 {} \; +for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done + +install -Dm644 $CWD/rc.earlyoom $PKG/etc/rc.d/rc.earlyoom.new + +mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION +#cp -a <documentation> $PKG/usr/doc/$PRGNAM-$VERSION +cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +cat $CWD/doinst.sh > $PKG/install/doinst.sh + +cd $PKG +/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE diff --git a/system/earlyoom/earlyoom.info b/system/earlyoom/earlyoom.info new file mode 100644 index 0000000000..37a84be0fc --- /dev/null +++ b/system/earlyoom/earlyoom.info @@ -0,0 +1,10 @@ +PRGNAM="earlyoom" +VERSION="1.7" +HOMEPAGE="https://github.com/rfjakob/earlyoom" +DOWNLOAD="https://github.com/rfjakob/earlyoom/archive/v1.7/earlyoom-1.7.tar.gz" +MD5SUM="9c567930c60b2ccdc536951b005d413d" +DOWNLOAD_x86_64="" +MD5SUM_x86_64="" +REQUIRES="" +MAINTAINER="Charadon" +EMAIL="dev@iotib.net" diff --git a/system/earlyoom/rc.earlyoom b/system/earlyoom/rc.earlyoom new file mode 100644 index 0000000000..277050fefd --- /dev/null +++ b/system/earlyoom/rc.earlyoom @@ -0,0 +1,70 @@ +#!/bin/sh +set -eu + +. /etc/default/earlyoom + +do_start() { + if ps -p "$(cat /var/run/earlyoom.pid)" > /dev/null + then + echo "earlyoom is already running." + else + echo "Starting earlyoom..." + nohup /usr/bin/earlyoom $EARLYOOM_ARGS > /var/log/earlyoom.log 2>&1 & + echo "$!" > /var/run/earlyoom.pid + fi +} + +do_stop() { + if ps -p "$(cat /var/run/earlyoom.pid)" > /dev/null + then + echo "Stopping earlyoom..." + kill -15 "$(cat /var/run/earlyoom.pid)" + else + echo "earlyoom is not running." + fi +} + +do_force_stop() { + if ps -p "$(cat /var/run/earlyoom.pid)" > /dev/null + then + echo "Killing earlyoom..." + kill -9 "$(cat /var/run/earlyoom.pid)" + else + echo "earlyoom appears to not be running." + fi +} + +do_restart() { + do_stop + do_start +} + +do_status() { + if ps -p "$(cat /var/run/earlyoom.pid)" > /dev/null + then + echo "earlyoom is running with pid $(cat /var/run/earlyoom.pid)." + else + echo "earlyoom is not running." + fi +} + +case $1 in + start) + do_start + ;; + stop) + do_stop + ;; + restart) + do_restart + ;; + force-stop) + do_force_stop + ;; + status) + do_status + ;; + *) + echo "USAGE: rc.earlyoom (start|stop|force-stop|restart|status)" + ;; +esac diff --git a/system/earlyoom/slack-desc b/system/earlyoom/slack-desc new file mode 100644 index 0000000000..a39853a125 --- /dev/null +++ b/system/earlyoom/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. +# Line up the first '|' above the ':' following the base package name, and +# the '|' on the right side marks the last column you can put a character in. +# You must make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':' except on otherwise blank lines. + + |-----handy-ruler------------------------------------------------------| +earlyoom: earlyoom (The Early OOM Daemon) +earlyoom: +earlyoom: earlyoom checks the amount of available memory and free swap up to +earlyoom: 10 times a second (less often if there is a lot of free memory). By +earlyoom: default if both are below 10%, it will kill the largest process +earlyoom: (highest oom_score). The percentage value is configurable via +earlyoom: command line arguments. +earlyoom: +earlyoom: +earlyoom: +earlyoom: |