Uso da memória do unicórnio enchendo quase toda a RAM

Existem essencialmente 3 problemas aqui:

1) O Unicorn parece estar constantemente preenchendo toda a RAM, fazendo com que eu remova os trabalhadores manualmente.

2) Unicórnio parece estar gerando trabalhadores adicionais por alguma razão, embora eu tenha especificado um número fixo de trabalhadores (7 deles). Isso está causando parcialmente o acúmulo de RAM, o que também está me levando a remover os funcionários manualmente.

3) A implantação de tempo de inatividade zero não é confiável no meu caso. Às vezes, ele pega as alterações, às vezes eu recebo tempos limite do gateway. Cada implantação se torna uma situação muito estressante.

Eu realmente não gosto de usar o Monit, porque ele mata os funcionários sem esperar que os funcionários terminem de atender seus pedidos.

Então, isso é normal? Outras pessoas que implantam usando o Unicorn têm o mesmo problema em que a RAM cresce descontroladamente?

E também onde os trabalhadores o número de trabalhadores gerados não correspondem ao número de trabalhadores definidos?

A outra alternativa é o assassino do trabalhador do unicórnio, que eu estaria experimentando depois de lerMemória comendo unicórnio.

Pequena atualização:

Então chegou a um ponto em que a New Relic estava me dizendo que a memória era quase 95%. Então eu tive que matar um trabalhador. Curiosamente, matar aquele trabalhador reduziu bastante a memória, como pode ser visto no gráfico abaixo.

O que há com isso?

Para referência, aqui está minhaunicorn.rb eunicorn_init.sh. Adoraria que alguém me dissesse que há um erro em algum lugar.

unicorn.rb

root = "/home/deployer/apps/myapp/current"
working_directory root
pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.stderr.log"
stdout_path "#{root}/log/unicorn.log"

listen "/tmp/unicorn.myapp.sock"
worker_processes 7
timeout 30

preload_app true

before_exec do |_|
  ENV["BUNDLE_GEMFILE"] = '/home/deployer/apps/myapp/current/Gemfile'
end

before_fork do |server, worker|
  # Disconnect since the database connection will not carry over
  if defined? ActiveRecord::Base
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{root}/tmp/pids/unicorn.pid.oldbin`"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
  sleep 1
end

after_fork do |server, worker|
  # Start up the database connection again in the worker
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end

  Redis.current.quit
  Rails.cache.reconnect
end

unicorn_init.sh

#!/bin/sh
set -e

# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/home/deployer/apps/myapp/current
PID=$APP_ROOT/tmp/pids/unicorn.pid
CMD="cd $APP_ROOT; BUNDLE_GEMFILE=/home/deployer/apps/myapp/current/Gemfile bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
AS_USER=deployer
set -u
OLD_PIN="$PID.oldbin"

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
  test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
}

run () {
  if [ "$(id -un)" = "$AS_USER" ]; then
    eval $1
  else
    su -c "$1" - $AS_USER
  fi
}

case "$1" in
start)
  sig 0 && echo >&2 "Already running" && exit 0
  run "$CMD"
  ;;
stop)
  sig QUIT && exit 0
  echo >&2 "Not running"
  ;;
force-stop)
  sig TERM && exit 0
  echo >&2 "Not running"
  ;;
restart|reload)
  sig USR2 && echo reloaded OK && exit 0
  echo >&2 "Couldn't reload, starting '$CMD' instead"
  run "$CMD"
  ;;
upgrade)
  if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
  then
    n=$TIMEOUT
    while test -s $OLD_PIN && test $n -ge 0
    do
      printf '.' && sleep 1 && n=$(( $n - 1 ))
    done
    echo

    if test $n -lt 0 && test -s $OLD_PIN
    then
      echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
      exit 1
    fi
    exit 0
  fi
  echo >&2 "Couldn't upgrade, starting '$CMD' instead"
  run "$CMD"
  ;;
reopen-logs)
  sig USR1
  ;;
*)
  echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
  exit 1
  ;;
esac

questionAnswers(2)

yourAnswerToTheQuestion