ruby on rails - Webrick es muy lento en responder. ¿Cómo acelerarlo?
ruby-on-rails oracle (12)
"Thin" es ahora una gran opción para ejecutar localmente y en Heroku :
Sitio web: http://code.macournoyer.com/thin/
Puedes usarlo localmente colocando tu Gemfile:
gem "thin"
... y luego ejecuta bundle e inicia tu servidor con thin start
o rails s
.
Actualización sobre Heroku
Thin ahora se considera una mala opción para Heroku. Más información aquí:
https://blog.heroku.com/archives/2013/4/3/routing_and_web_performance_on_heroku_a_faq
Su recomendación:
Cambie a un servidor web simultáneo como Unicorn o Puma en JRuby, que permite que el banco de datos administre su propia cola de solicitudes y evite el bloqueo en solicitudes largas.
Tengo una aplicación de Rails que estoy ejecutando en mi servidor. Cuando voy a un escritorio remoto e intento cargar la aplicación, el servidor tarda unos buenos 3-4 minutos en responder con una página HTML simple. Sin embargo, cuando cargo la página localmente en el servidor, la página aparece en solo un segundo. Intenté hacer ping al servidor desde mi escritorio remoto y los pings están teniendo éxito en un tiempo razonable.
Todo parece haber comenzado después de instalar el cliente básico de Oracle y SQLPLUS. ¿Debería sospechar de Oracle? ¿Alguien ha experimentado algo similar a esto?
En mi situación probablemente rara, funcionó después de que descargué mis iptables, esto no tenía ningún efecto secundario porque no tenía ninguna regla personalizada (solo el predeterminado Ubuntu permite todo):
sudo iptables -F
Esta es una respuesta muy tardía, pero pasé gran parte del día depurando este mismo problema con Rails corriendo en Vagrant. Cambiar la búsqueda DNS inversa no mejoró en absoluto los tiempos de solicitud. Una combinación de dos cosas llevó mi carga de página de ~ 20 segundos a ~ 3 segundos en el modo de desarrollo:
Reemplace WEBrick con mongrel. Tenía que usar la versión preliminar o no se instalaría:
sudo gem install mongrel --pre
Luego agrégalo a mi Gemfile para dev:
group :test, :development do
gem ''mongrel''
end
Comencé mi servidor así, entonces:
rails server mongrel -e development
Eso cortó unos segundos, 5 o 6 segundos, pero todavía era terriblemente lento. Esta fue la guinda del pastel : añada esto también al Gemfile:
group :development do
gem ''rails-dev-boost'', :git => ''git://github.com/thedarkone/rails-dev-boost.git''
end
Este es un viejo hilo de preguntas y respuestas que me ayudó a resolver el problema :DoNotReverseLookup
en una máquina virtual de desarrollo local y quería agregar información adicional. Esta página web explica el error de regresión en Ruby core que hace que este problema aparezca para algunos; el énfasis es mío; El largo y corto de todo esto es que hay una solicitud de extracción de GitHub para una solución básica de Ruby y espero que se apruebe y fusione en un breve lanzamiento de Ruby:
Después de unas horas de resolución de problemas, ¡resultó que sí! Aparentemente, en algún lugar a lo largo de la evolución de la lib estándar de Ruby de 1.8.6 a 2.0.0, WEBrick adquirió una nueva opción de configuración
:DoNotReverseLookup
que está establecida ennil
de forma predeterminada. Luego, en las entrañas del código de procesamiento de solicitud de WEBrick, establece el indicadordo_not_reverse_lookup
en la instancia del socket de conexión entrante al valor deconfig[:DoNotReverseLookup]
. Como este valor esnil
, que es falso, el efecto es el mismo que establecerlo enfalse
, anulando elSocket.do_not_reverse_lookup
globalSocket.do_not_reverse_lookup
. Por lo tanto, a menos que tenga:DoNotReverseLookup => true
en su configuración de WEBrick, siempre se realizará una búsqueda DNS inversa para cada conexión nueva, lo que podría causar una latencia grave.
Relacionado con este descubrimiento hay una solicitud de extracción de GitHub del autor que propone cómo reparar el problema en el código fuente de Ruby WEBrick: Corregir el error de regresión en la implementación de la opción de configuración de DoogleRrowseLookup de WEBrick: 731
La solución como se describe en la solicitud es cambiar la línea 181 en lib/webrick/server.rb
de esto:
sock.do_not_reverse_lookup = config[:DoNotReverseLookup]
A esto:
unless config[:DoNotReverseLookup].nil?
Compartir aquí si alguien tropieza con este hilo de pregunta / respuesta bien considerado y está interesado en el progreso para resolver este problema en Ruby core. Esperemos que este tirón se fusione o el problema subyacente se trate de alguna manera en el próximo lanzamiento de Ruby; tal vez 2.1.6?
Experimenté retrasos de 10 segundos con frecuencia con Sinatra. Este fragmento me lo resolvió.
Agregue esto cerca de la parte superior de su archivo app.rb
class Rack::Handler::WEBrick
class << self
alias_method :run_original, :run
end
def self.run(app, options={})
options[:DoNotReverseLookup] = true
run_original(app, options)
end
end
Ver source
Intentaba hacer esto con webrick en 1.8.7 y no pudimos encontrar la configuración para cambiar. Sin embargo, un truco que puede usar es agregar al archivo de hosts del servidor que se ejecuta, abrimos la dirección IP que está tratando de buscar de forma inversa.
No hay DoNotReverseLookup
opción DoNotReverseLookup
en ruby 1.8.x webrick. La solución es poner:
Socket.do_not_reverse_lookup = true
en algún lugar al comienzo de tu script.
Fuente: WEBrick y Socket.do_not_reverse_lookup: Un cuento en dos actos
Puede usar Apache
o instalar Thin
. En tu Gemfile: gem ''thin''
O puede consultar la lista de servidores web para ver los rieles .
Solo tuve el mismo problema. los
...
:DoNotReverseLookup => true,
...
hizo el truco para mí también. En caso de que esté ejecutando Ruby bajo el rvm, aquí está el camino a seguir:
~/.rvm/rubies/ruby-<version>/lib/ruby/<version>/webrick/config.rb
Tenía el mismo problema. Para mí, esta publicación contiene la solución. Si está en Ubuntu, detenga (o desinstale) el avahi-daemon
. service avahi-daemon stop
detiene al daemon.
Webrick ahora se siente muy rápido.
El problema tiene un viejo informe en Rails Lighthouse , sin embargo, Ruby-on-Rails ha movido sus boletos a github desde entonces; Es desafortunado que este viejo problema persista aún.
Tenga en cuenta, sin embargo, que si realmente usa avahi-daemon
para algo, como encontrar impresoras y escáneres en su red, eso ya no funcionará.
Tener el mismo problema aquí (incluso un año después). En Linux debes hacer lo siguiente:
Busque el archivo /usr/lib/ruby/1.9.1/webrick/config.rb y edítelo.
Reemplazar la línea
:DoNotReverseLookup => nil,
con
:DoNotReverseLookup => true,
Reinicie webrick y funcionará como un encanto :)
Tuve un problema vagamente similar que se manifestó al acceder a un servidor WEBrick a través de una VPN. Las solicitudes tomarían mucho tiempo, la mayor parte sin que ocurra nada en el cable. Dado que ni gemas mestizas ni gemas thin
funcionaban con Ruby1.9 en Windows y no había forma de que me involucrara en la compilación de cosas desde el origen, tenía que seguir con WEBrick.
La solución fue establecer el parámetro de configuración DoNotReverseLookup
en true
al crear el servidor WEBrick:
server = HTTPServer.new {:DoNotReverseLookup => true, ...}