gpt4 book ai didi

linux - Linux下通过内存限制进程

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:15 25 4
gpt4 key购买 nike

我们必须在 Linux 系统上启动几个饥饿的进程。这些进程通常需要几个 Go (~5Go) 内存才能运行(总内存:16Go RAM + 2Go swap)。

  • 最初,当系统内存不足时,OOM-killer 会杀死进程,每次发生这种情况时我们都必须重新启动系统。

  • 然后,我们尝试使用 overcommit_memory (= 2) + overcommit_ratio (= 75) 参数,以便在情况变得危急时不会启动进程。因此,无需再重新启动服务器。但是,当达到限制时,我们的启动脚本现在会报告数十个错误:新进程立即出错,进程永远不会启动。

  • 所以现在我们正在寻找一种解决方案来启动“任意数量”的进程,然后它们会被延迟/暂停或其他什么,等待它们的兄弟停止......它存在吗?

最佳答案

我编写这个小工具是为了允许任意数量的作业并行运行,或者限制并行度。只需阅读标题中的注释即可了解如何使用它 - 您可以将作业数量限制为一次 2 个或 3 个或类似的值,但一次性将其全部提交。它底层使用 REDIS,它是免费的并且非常易于安装。

#!/bin/bash
################################################################################
# File: core
# Author: Mark Setchell
#
# Primitive, but effective tool for managing parallel execution of jobs in the
# shell. Based on, and requiring REDIS.
#
# Usage:
#
# core -i 8 # Initialise to 8 cores, or specify 0 to use all available cores
# for i in {0..63}
# do
# # Wait for a core, do a process, release core
# (core -p; process; core -v)&
# done
# wait
################################################################################
function usage {
echo "Usage: core -i ncores # Initialise with ncores. Use 0 for all cores."
echo " core -p # Wait (forever) for free core."
echo " core -v # Release core."
exit 1
}

function init {
# Delete list of cores in REDIS
echo DEL cores | redis-cli > /dev/null 2>&1
for i in `seq 1 $NCORES`
do
# Add another core to list of cores in REDIS
echo LPUSH cores 1 | redis-cli > /dev/null 2>&1
done
exit 0
}

function WaitForCore {
# Wait forever for a core to be available
echo BLPOP cores 0 | redis-cli > /dev/null 2>&1
exit 0
}

function ReleaseCore {
# Release or give back a core
echo LPUSH cores 1 | redis-cli > /dev/null 2>&1
exit 0
}

################################################################################
# Main
################################################################################
while getopts "i:pv" optname
do
case "$optname" in
"i")
if [ $OPTARG -lt 1 ]; then
NCORES=`sysctl -n hw.logicalcpu`; # May differ if not on OSX
else
NCORES=$OPTARG
fi
init $NCORES
;;
"p")
WaitForCore
;;
"v")
ReleaseCore
;;
"?")
echo "Unknown option $OPTARG"
;;
esac
done
usage

关于linux - Linux下通过内存限制进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20270467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com