如何将 Java 选项传递给 Puma 守护进程?

How to pass Java options to Puma daemon?

我在 jruby-9.0.4.0 上有一个 Rails 应用程序 运行 并使用 Puma 作为 Web 服务器。

我正在尝试增加 puma 的内存限制;当前标志是 -Xmx500m -Xss2048k。我将 _JAVA_OPTIONS=-Xss4096k -Xmx2048m 添加到我的 env 并且所有 jruby 进程都像 rake assets:precompile 一样使用它,但是 puma 实例本身没有。

capistrano 跟踪的一部分

DEBUG [0aec947c] Command: cd 
/dummy/production/releases/20160707071111 && ( 
export RBENV_ROOT="/usr/local/rbenv" RBENV_VERSION="jruby-9.0.4.0" 
RAILS_ENV="production" ; /usr/local/rbenv/bin/rbenv exec bundle exec 
rake assets:precompile )

DEBUG [0aec947c]    Picked up _JAVA_OPTIONS: -Xss4096k -Xmx2048m

config/puma.rb

# Min and Max threads per worker
threads 8, 512

# Default to production
rails_env = ENV['RAILS_ENV'] || 'production'
environment rails_env

app_dir = "/dummy/#{rails_env}/current"

# Set up socket location
bind "tcp://localhost:3000"

# Logging
stdout_redirect "#{app_dir}/log/puma.stdout.log", "#{app_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{app_dir}/pids/puma.pid"
state_path "#{app_dir}/pids/puma.state"
activate_control_app

ENV 变量

JAVA_OPTS=-Xss4096k -Xmx2048m
_JAVA_OPTIONS=-Xss4096k -Xmx2048m
JAVA_HOME=/usr/lib/jvm/java-7-oracle-amd64

cat /proc/<pid>/environ

的输出

RBENV_ROOT=/usr/local/rbenvprevious=NUPSTART_JOB=rcPATH=/dummy/production/shared/bundle/jruby/2.2.0/bin:/usr/local/rbenv/versions/jruby-9.0.4.0/bin:/usr/local/rbenv/libexec:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binPWD=/dummy/production/releases/20160707133222RBENV_DIR=/dummy/production/releases/20160707133222SUPERVISOR_SERVER_URL=unix:///var/run/supervisor.sockUPSTART_EVENTS=runlevelRUNLEVEL=2NLSPATH=/usr/dt/lib/nls/msg/%L/%N.catSUPERVISOR_PROCESS_NAME=dummyprocessSUPERVISOR_ENABLED=1XFILESEARCHPATH=/usr/dt/app-defaults/%L/DtSHLVL=0UPSTART_INSTANCE=PREVLEVEL=NRBENV_VERSION=jruby-9.0.4.0RBENV_HOOK_PATH=:/usr/local/rbenv/rbenv.d:/usr/local/etc/rbenv.d:/etc/rbenv.d:/usr/lib/rbenv/hooksrunlevel=2SUPERVISOR_GROUP_NAME=dummyprocessTERM=linuxRUBYOPT=-rbundler/setupRUBYLIB=/usr/local/rbenv/versions/jruby-9.0.4.0/lib/ruby/gems/shared/gems/bundler-1.11.2/libroot

机器是 8 核和 24GB 内存。

如何让 puma 实例也选择 Java 选项?

https://devcenter.heroku.com/articles/optimizing-dyno-usage#basic-methodology-for-optimizing-memory

JRuby

JRuby servers like Puma make good use of concurrency without the need for multiple processes. However, you will need to tune the amount of memory allocated to the JVM, depending on the dyno type. The Ruby buildpack defines sensible defaults, which can be overridden by setting either JAVA_OPTS or JRUBY_OPTS.

this blog post 中所述,您可以将 JVM 选项放在 JRUBY_OPTS 环境变量中。

在你的情况下,你可以在启动 Puma 守护进程之前设置变量:

export JRUBY_OPTS="-J-Xss4096k -J-Xmx2048m"

您也可以尝试通过设置 JAVA_OPTS 环境变量直接配置 JVM :

export JAVA_OPTS="-Xss4096k -Xmx2048m"

还要检查 puma 守护程序是如何启动的

cat /proc/<pid>/environ

您的环境未传播到 Puma 守护程序。您需要了解 Puma 是如何启动的。它可能是 init.d service or an upstart service.

更新:

看来你可以用rbenv-vars设置你的环境。

使用以下

在您的 Rails 项目中创建一个 .rbenv-vars 文件
JAVA_OPTS='-Xss4096k -Xmx2048m'

然后您的环境应该传播到 puma 守护程序。