Unicorn Memory Usage llenando casi toda la memoria RAM

Hay esencialmente 3 problemas aquí:

1) Unicornio parece estar llenando constantemente toda la memoria RAM, lo que hace que elimine los trabajadores manualmente.

2) Unicornio parece estar generando trabajadores adicionales por alguna razón, aunque he especificado un número fijo de trabajadores (7 de ellos). Esto está causando en parte la acumulación de RAM, lo que también me lleva a eliminar trabajadores manualmente.

3) El despliegue de tiempo de inactividad cero no es confiable en mi caso. A veces se recogen los cambios, a veces tengo tiempos de espera de puerta de enlace. Cada despliegue se convierte en una situación muy estresante.

Realmente no me gusta usar Monit, porque mata a los trabajadores sin esperar a que los trabajadores terminen de atender sus solicitudes.

Entonces, ¿esto es normal? ¿Otras personas que implementan el uso de Unicorn tienen el mismo problema donde la memoria RAM crece sin control?

¿Y también donde los trabajadores el número de trabajadores generados no coincide con el número de trabajadores definido?

La otra alternativa es un asesino trabajador unicornio, que probaría después de leer.Unicornio comiendo memoria.

Pequeña actualización:

Así que llegó a un punto en el que New Relic me decía que la memoria era casi del 95%. Así que tuve que matar a un trabajador. Curiosamente, matar a ese trabajador disminuyó bastante la memoria, como se ve en el gráfico a continuación.

¿Que pasa con eso?

Para referencia, aquí está miunicorn.rb yunicorn_init.sh. Me encantaría que alguien me dijera que hay un error en alguna parte.

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta