2013-11-28 2 views
0

Мы должны запустить несколько голодных процессов в системе Linux. Этим процессам часто требуется несколько Go (~ 5Go) памяти для запуска (общая память: 16Go RAM + 2Go swap).Ограничение процессов по оперативной памяти под Linux

  • В первом, когда система работает из памяти, ОЫЙ-убийца убил процессы, нам пришлось перезагружать систему каждый раз, когда это случилось.

  • Затем мы попытались использовать параметры overcommit_memory (= 2) + overcommit_ratio (= 75), поэтому процессы не запускаются, когда ситуация становится критической. Поэтому больше не нужно перезагружать сервер. Но наш стартовый скрипт теперь сообщает о десятках ошибок, когда предел достигнут: новые процессы сразу заблуждаются, процессы никогда не запускаются.

  • Итак, теперь мы ищем решение для запуска «как можно большего количества» процессов, как мы хотим, а затем они будут задержаны/приостановлены или что угодно, ожидая, когда их братья остановятся ... Разве это существует?

+1

Это должно быть здесь http://unix.stackexchange.com/ – user2485710

ответ

0

Я написал этот небольшой инструмент, позволяющий параллельно выполнять любое количество заданий или, наоборот, ограничивать степень параллелизма. Просто прочитайте комментарии в заголовке, чтобы увидеть, как его использовать - вы можете ограничить количество заданий до 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 
Смежные вопросы