-
Notifications
You must be signed in to change notification settings - Fork 0
/
tuning_performance_for_deployment.html
273 lines (254 loc) · 33.6 KB
/
tuning_performance_for_deployment.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
<!doctype html>
<html dir="ltr" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ajuste de Rendimiento para Despliegue — Ruby on Rails Guides</title>
<link rel="stylesheet" type="text/css" href="stylesheets/style-v2.css" data-turbo-track="reload">
<link rel="stylesheet" type="text/css" href="stylesheets/print-v2.css" media="print">
<link rel="stylesheet" type="text/css" href="stylesheets/highlight-v2.css" data-turbo-track="reload">
<link rel="icon" href="images/favicon.ico" sizes="any">
<link rel="apple-touch-icon" href="images/icon.png">
<script src="javascripts/@hotwired--turbo.js" data-turbo-track="reload"></script>
<script src="javascripts/clipboard.js" data-turbo-track="reload"></script>
<script src="javascripts/guides.js" data-turbo-track="reload"></script>
<meta property="og:title" content="Ajuste de Rendimiento para Despliegue — Ruby on Rails Guides" />
<meta name="description" content="Ajuste de Rendimiento para DespliegueEsta guía cubre la configuración de rendimiento y concurrencia para desplegar su aplicación Ruby on Rails en producción.Después de leer esta guía, sabrá: Si debe usar Puma, el servidor de aplicaciones predeterminado Cómo configurar ajustes importantes de rendimiento para Puma Cómo comenzar a probar el rendimiento de los ajustes de su aplicación Esta guía se centra en los servidores web, que son el componente principal sensible al rendimiento de la mayoría de las aplicaciones web. Otros componentes como trabajos en segundo plano y WebSockets pueden ser ajustados, pero no serán cubiertos por esta guía.Más información sobre cómo configurar su aplicación se puede encontrar en la Guía de Configuración." />
<meta property="og:description" content="Ajuste de Rendimiento para DespliegueEsta guía cubre la configuración de rendimiento y concurrencia para desplegar su aplicación Ruby on Rails en producción.Después de leer esta guía, sabrá: Si debe usar Puma, el servidor de aplicaciones predeterminado Cómo configurar ajustes importantes de rendimiento para Puma Cómo comenzar a probar el rendimiento de los ajustes de su aplicación Esta guía se centra en los servidores web, que son el componente principal sensible al rendimiento de la mayoría de las aplicaciones web. Otros componentes como trabajos en segundo plano y WebSockets pueden ser ajustados, pero no serán cubiertos por esta guía.Más información sobre cómo configurar su aplicación se puede encontrar en la Guía de Configuración." />
<meta property="og:locale" content="en_US" />
<meta property="og:site_name" content="Ruby on Rails Guides" />
<meta property="og:image" content="https://avatars.githubusercontent.com/u/4223" />
<meta property="og:type" content="website" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:[email protected]&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Heebo:[email protected]&family=Noto+Sans+Arabic:[email protected]&display=swap" rel="stylesheet">
<meta name="theme-color" content="#C81418">
</head>
<body class="guide">
<nav id="topNav" aria-label="Secondary">
<div class="wrapper">
<strong class="more-info-label">Más en <a href="https://rubyonrails.org/">rubyonrails.org:</a> </strong>
<span class="red-button more-info-button">
Más Ruby on Rails
</span>
<ul class="more-info-links s-hidden">
<li class="more-info"><a href="https://rubyonrails.org/blog">Blog</a></li>
<li class="more-info"><a href="https://guides.rubyonrails.org/">Guías</a></li>
<li class="more-info"><a href="https://api.rubyonrails.org/">API</a></li>
<li class="more-info"><a href="https://discuss.rubyonrails.org/">Foro</a></li>
<li class="more-info"><a href="https://github.com/rails/rails">Contribuir en GitHub</a></li>
</ul>
</div>
</nav>
<header id="page_header">
<div class="wrapper clearfix">
<nav id="feature_nav">
<div class="header-logo">
<a href="index.html" title="Regresar a la página principal de Guías para Edge">Guías</a>
<span id="version_switcher">
Versión:
<select class="guides-version">
<option value="https://edgeguides.rubyonrails.org/" selected>Edge</option>
<option value="https://guides.rubyonrails.org/v7.2/">7.2</option>
<option value="https://guides.rubyonrails.org/v7.1/">7.1</option>
<option value="https://guides.rubyonrails.org/v7.0/">7.0</option>
<option value="https://guides.rubyonrails.org/v6.1/">6.1</option>
<option value="https://guides.rubyonrails.org/v6.0/">6.0</option>
<option value="https://guides.rubyonrails.org/v5.2/">5.2</option>
<option value="https://guides.rubyonrails.org/v5.1/">5.1</option>
<option value="https://guides.rubyonrails.org/v5.0/">5.0</option>
<option value="https://guides.rubyonrails.org/v4.2/">4.2</option>
<option value="https://guides.rubyonrails.org/v4.1/">4.1</option>
<option value="https://guides.rubyonrails.org/v4.0/">4.0</option>
<option value="https://guides.rubyonrails.org/v3.2/">3.2</option>
<option value="https://guides.rubyonrails.org/v3.1/">3.1</option>
<option value="https://guides.rubyonrails.org/v3.0/">3.0</option>
<option value="https://guides.rubyonrails.org/v2.3/">2.3</option>
</select>
</span>
</div>
<ul class="nav">
<li><a class="nav-item" id="home_nav" href="https://rubyonrails.org/">Inicio</a></li>
<li class="guides-index guides-index-large">
<a href="index.html" id="guidesMenu" class="guides-index-item nav-item">Índice de Guías</a>
<div id="guides" class="clearfix" style="display: none;">
<hr />
<dl class="guides-section-container">
<div class="guides-section">
<dt>Comienza Aquí</dt>
<dd><a href="getting_started.html">Primeros Pasos con Rails</a></dd>
</div>
<div class="guides-section">
<dt>Modelos</dt>
<dd><a href="active_record_basics.html">Conceptos Básicos de Active Record</a></dd>
<dd><a href="active_record_migrations.html">Migraciones de Active Record</a></dd>
<dd><a href="active_record_validations.html">Validaciones de Active Record</a></dd>
</div>
<div class="guides-section">
<dt>Vistas</dt>
<dd><a href="action_view_overview.html">Resumen de Action View</a></dd>
<dd><a href="layouts_and_rendering.html">Diseños y Renderizado en Rails</a></dd>
</div>
<div class="guides-section">
<dt>Controladores</dt>
<dd><a href="action_controller_overview.html">Resumen de Action Controller</a></dd>
<dd><a href="routing.html">Enrutamiento en Rails desde el Exterior</a></dd>
</div>
<div class="guides-section">
<dt>Otros Componentes</dt>
<dd><a href="active_support_core_extensions.html">Extensiones Básicas de Active Support</a></dd>
<dd><a href="action_mailer_basics.html">Conceptos Básicos de Action Mailer</a></dd>
<dd><a href="action_mailbox_basics.html">Conceptos Básicos de Action Mailbox</a></dd>
<dd><a href="action_text_overview.html">Resumen de Action Text</a></dd>
<dd><a href="active_job_basics.html">Conceptos Básicos de Active Job</a></dd>
</div>
<div class="guides-section">
<dt>Políticas</dt>
<dd><a href="maintenance_policy.html">Política de Mantenimiento</a></dd>
</div>
<div class="guides-section">
<dt>Notas de Lanzamiento</dt>
<dd><a href="upgrading_ruby_on_rails.html">Actualizando Ruby on Rails</a></dd>
<dd><a href="7_2_release_notes.html">Versión 7.2 - ?</a></dd>
<dd><a href="7_1_release_notes.html">Versión 7.1 - Octubre 2023</a></dd>
<dd><a href="7_0_release_notes.html">Versión 7.0 - Diciembre 2021</a></dd>
<dd><a href="6_1_release_notes.html">Versión 6.1 - Diciembre 2020</a></dd>
</div>
</dl>
</div>
</li>
<li><a class="nav-item" href="contributing_to_ruby_on_rails.html">Contribuir</a></li>
<li class="guides-index guides-index-small">
<select class="guides-index-item nav-item">
<option value="index.html">Índice de Guías</option>
<optgroup label="Comienza Aquí">
<option value="getting_started.html">Primeros Pasos con Rails</option>
</optgroup>
<optgroup label="Modelos">
<option value="active_record_basics.html">Conceptos Básicos de Active Record</option>
<option value="active_record_migrations.html">Migraciones de Active Record</option>
<option value="active_record_validations.html">Validaciones de Active Record</option>
</optgroup>
<optgroup label="Vistas">
<option value="action_view_overview.html">Resumen de Action View</option>
<option value="layouts_and_rendering.html">Diseños y Renderizado en Rails</option>
</optgroup>
<optgroup label="Controladores">
<option value="action_controller_overview.html">Resumen de Action Controller</option>
<option value="routing.html">Enrutamiento en Rails desde el Exterior</option>
</optgroup>
<optgroup label="Otros Componentes">
<option value="active_support_core_extensions.html">Extensiones Básicas de Active Support</option>
<option value="action_mailer_basics.html">Conceptos Básicos de Action Mailer</option>
<option value="action_mailbox_basics.html">Conceptos Básicos de Action Mailbox</option>
<option value="action_text_overview.html">Resumen de Action Text</option>
<option value="active_job_basics.html">Conceptos Básicos de Active Job</option>
</optgroup>
<optgroup label="Políticas">
<option value="maintenance_policy.html">Política de Mantenimiento</option>
</optgroup>
<optgroup label="Notas de Lanzamiento">
<option value="upgrading_ruby_on_rails.html">Actualizando Ruby on Rails</option>
<option value="7_2_release_notes.html">Versión 7.2 - ?</option>
<option value="7_1_release_notes.html">Versión 7.1 - Octubre 2023</option>
<option value="7_0_release_notes.html">Versión 7.0 - Diciembre 2021</option>
<option value="6_1_release_notes.html">Versión 6.1 - Diciembre 2020</option>
</optgroup>
</select>
</li>
</ul>
</nav>
</div>
</header>
<hr class="hide" />
<section id="feature">
<div class="wrapper">
<h1>Ajuste de Rendimiento para Despliegue</h1><p>Esta guía cubre la configuración de rendimiento y concurrencia para desplegar su aplicación Ruby on Rails en producción.</p><p>Después de leer esta guía, sabrá:</p>
<ul>
<li>Si debe usar Puma, el servidor de aplicaciones predeterminado</li>
<li>Cómo configurar ajustes importantes de rendimiento para Puma</li>
<li>Cómo comenzar a probar el rendimiento de los ajustes de su aplicación</li>
</ul>
<p>Esta guía se centra en los servidores web, que son el componente principal sensible al rendimiento de la mayoría de las aplicaciones web. Otros componentes como trabajos en segundo plano y WebSockets pueden ser ajustados, pero no serán cubiertos por esta guía.</p><p>Más información sobre cómo configurar su aplicación se puede encontrar en la <a href="configuring.html">Guía de Configuración</a>.</p>
<nav id="subCol">
<h3 class="chapter">
<picture>
<!-- Using the `source` HTML tag to set the dark theme image -->
<source
srcset="images/icon_book-close-bookmark-1-wht.svg"
media="(prefers-color-scheme: dark)"
/>
<img src="images/icon_book-close-bookmark-1.svg" alt="Chapter Icon" />
</picture>
Chapters
</h3>
<ol class="chapters">
<li><a href="#eligiendo-un-servidor-de-aplicaciones">Eligiendo un Servidor de Aplicaciones</a></li>
<li><a href="#¿para-qué-optimizar-questionmark">¿Para Qué Optimizar?</a>
<ul>
<li><a href="#entendiendo-la-concurrencia-y-el-paralelismo-de-ruby">Entendiendo la Concurrencia y el Paralelismo de Ruby</a></li>
<li><a href="#implicaciones-prácticas">Implicaciones Prácticas</a></li>
</ul></li>
<li><a href="#configuraciones">Configuraciones</a>
<ul>
<li><a href="#puma">Puma</a></li>
<li><a href="#yjit">YJIT</a></li>
<li><a href="#asignadores-de-memoria-y-configuración">Asignadores de Memoria y Configuración</a></li>
</ul></li>
<li><a href="#pruebas-de-rendimiento">Pruebas de Rendimiento</a>
<ul>
<li><a href="#qué-medir">Qué Medir</a></li>
<li><a href="#medición-en-producción">Medición en Producción</a></li>
<li><a href="#probadores-de-carga">Probadores de Carga</a></li>
<li><a href="#qué-puede-cambiar">Qué Puede Cambiar</a></li>
<li><a href="#calentamiento">Calentamiento</a></li>
<li><a href="#qué-solicitudes">Qué Solicitudes</a></li>
<li><a href="#qué-buscar">Qué Buscar</a></li>
</ul></li>
</ol>
</nav>
<hr>
</div>
</section>
<main id="container">
<div class="wrapper">
<div id="mainCol">
<p>Esta guía asume que está ejecutando <a href="https://ruby-lang.org">MRI</a>, la implementación canónica de Ruby también conocida como CRuby. Si está utilizando otra implementación de Ruby como JRuby o TruffleRuby, la mayor parte de esta guía no se aplica. Si es necesario, consulte fuentes específicas para su implementación de Ruby.</p><h2 id="eligiendo-un-servidor-de-aplicaciones"><a class="anchorlink" href="#eligiendo-un-servidor-de-aplicaciones"><span>1</span> Eligiendo un Servidor de Aplicaciones</a></h2><p>Puma es el servidor de aplicaciones predeterminado de Rails y el más utilizado en la comunidad. Funciona bien en la mayoría de los casos. En algunos casos, puede que desee cambiar a otro.</p><p>Un servidor de aplicaciones utiliza un método de concurrencia particular. Por ejemplo, Unicorn utiliza procesos, Puma y Passenger son híbridos de procesos y hilos, y Falcon utiliza fibras.</p><p>Una discusión completa sobre los métodos de concurrencia de Ruby está más allá del alcance de este documento, pero se presentarán los principales compromisos entre procesos e hilos. Si desea utilizar un método diferente a procesos e hilos, necesitará usar un servidor de aplicaciones diferente.</p><p>Esta guía se centrará en cómo ajustar Puma.</p><h2 id="¿para-qué-optimizar-questionmark"><a class="anchorlink" href="#¿para-qué-optimizar-questionmark"><span>2</span> ¿Para Qué Optimizar?</a></h2><p>En esencia, ajustar un servidor web Ruby es hacer un compromiso entre múltiples propiedades como el uso de memoria, el rendimiento y la latencia.</p><p>El rendimiento es la medida de cuántas solicitudes por segundo puede manejar el servidor, y la latencia es la medida de cuánto tiempo tardan las solicitudes individuales (también conocido como tiempo de respuesta).</p><p>Algunos usuarios pueden querer maximizar el rendimiento para mantener bajos sus costos de alojamiento, otros pueden querer minimizar la latencia para ofrecer la mejor experiencia de usuario, y muchos buscarán algún compromiso en el medio.</p><p>Es importante entender que optimizar para una propiedad generalmente perjudicará al menos otra.</p><h3 id="entendiendo-la-concurrencia-y-el-paralelismo-de-ruby"><a class="anchorlink" href="#entendiendo-la-concurrencia-y-el-paralelismo-de-ruby"><span>2.1</span> Entendiendo la Concurrencia y el Paralelismo de Ruby</a></h3><p><a href="https://www.ruby-lang.org/en/">CRuby</a> tiene un <a href="https://en.wikipedia.org/wiki/Global_interpreter_lock">Bloqueo Global del Intérprete</a>, a menudo llamado GVL o GIL. El GVL previene que múltiples hilos ejecuten código Ruby al mismo tiempo en un solo proceso. Múltiples hilos pueden estar esperando datos de red, operaciones de base de datos, u otro trabajo no Ruby generalmente referido como operaciones de E/S, pero solo uno puede ejecutar activamente código Ruby a la vez.</p><p>Esto significa que la concurrencia basada en hilos permite un mayor rendimiento al procesar concurrentemente solicitudes web siempre que realicen operaciones de E/S, pero puede degradar la latencia cuando una operación de E/S se completa. El hilo que la realizó puede tener que esperar antes de poder reanudar la ejecución de código Ruby. De manera similar, el recolector de basura de Ruby es "stop-the-world", por lo que cuando se activa todos los hilos deben detenerse.</p><p>Esto también significa que independientemente de cuántos hilos contenga un proceso Ruby, nunca usará más de un núcleo de CPU.</p><p>Debido a esto, si su aplicación solo pasa el 50% de su tiempo realizando operaciones de E/S, usar más de 2 o 3 hilos por proceso puede perjudicar severamente la latencia, y las ganancias en rendimiento rápidamente alcanzarán rendimientos decrecientes.</p><p>En términos generales, una aplicación Rails bien diseñada que no sufre de consultas SQL lentas o problemas de N+1 no pasa más del 50% de su tiempo realizando operaciones de E/S, por lo que es poco probable que se beneficie de más de 3 hilos. Sin embargo, algunas aplicaciones que llaman a APIs de terceros en línea pueden pasar una gran proporción de su tiempo realizando operaciones de E/S y pueden beneficiarse de más hilos que eso.</p><p>La forma de lograr un verdadero paralelismo con Ruby es usar múltiples procesos. Siempre que haya un núcleo de CPU libre, los procesos Ruby no tienen que esperar uno al otro antes de reanudar la ejecución después de que una operación de E/S se complete. Sin embargo, los procesos solo comparten una fracción de su memoria a través de <a href="https://en.wikipedia.org/wiki/Copy-on-write">copy-on-write</a>, por lo que un proceso adicional usa más memoria de lo que usaría un hilo adicional.</p><p>Tenga en cuenta que aunque los hilos son más baratos que los procesos, no son gratuitos, y aumentar el número de hilos por proceso también aumenta el uso de memoria.</p><h3 id="implicaciones-prácticas"><a class="anchorlink" href="#implicaciones-prácticas"><span>2.2</span> Implicaciones Prácticas</a></h3><p>Los usuarios interesados en optimizar para el rendimiento y la utilización del servidor querrán ejecutar un proceso por núcleo de CPU y aumentar el número de hilos por proceso hasta que el impacto en la latencia se considere demasiado importante.</p><p>Los usuarios interesados en optimizar para la latencia querrán mantener bajo el número de hilos por proceso. Para optimizar aún más la latencia, los usuarios incluso pueden establecer el conteo de hilos por proceso en <code>1</code> y ejecutar <code>1.5</code> o <code>1.3</code> procesos por núcleo de CPU para tener en cuenta cuando los procesos están inactivos esperando operaciones de E/S.</p><p>Es importante tener en cuenta que algunas soluciones de alojamiento pueden ofrecer solo una cantidad relativamente pequeña de memoria (RAM) por núcleo de CPU, impidiéndole ejecutar tantos procesos como sea necesario para usar todos los núcleos de CPU. Sin embargo, la mayoría de las soluciones de alojamiento tienen diferentes planes con diferentes proporciones de memoria y CPU.</p><p>Otra cosa a considerar es que el uso de memoria de Ruby se beneficia de economías de escala gracias a <a href="https://en.wikipedia.org/wiki/Copy-on-write">copy-on-write</a>. Entonces, <code>2</code> servidores con <code>32</code> procesos Ruby cada uno usarán menos memoria por núcleo de CPU que <code>16</code> servidores con <code>4</code> procesos Ruby cada uno.</p><h2 id="configuraciones"><a class="anchorlink" href="#configuraciones"><span>3</span> Configuraciones</a></h2><h3 id="puma"><a class="anchorlink" href="#puma"><span>3.1</span> Puma</a></h3><p>La configuración de Puma reside en el archivo <code>config/puma.rb</code>. Las dos configuraciones más importantes de Puma son el número de hilos por proceso y el número de procesos, que Puma llama <code>workers</code>.</p><p>El número de hilos por proceso se configura a través de la directiva <code>thread</code>. En la configuración generada por defecto, se establece en <code>3</code>. Puede modificarlo estableciendo la variable de entorno <code>RAILS_MAX_THREADS</code> o simplemente editando el archivo de configuración.</p><p>El número de procesos se configura mediante la directiva <code>workers</code>. Si usa más de un hilo por proceso, entonces debe establecerse en cuántos núcleos de CPU están disponibles en el servidor, o si el servidor está ejecutando múltiples aplicaciones, en cuántos núcleos desea que la aplicación use. Si solo usa un hilo por trabajador, entonces puede aumentarlo a más de uno por proceso para tener en cuenta cuando los trabajadores están inactivos esperando operaciones de E/S.</p><p>Puede configurar el número de trabajadores de Puma estableciendo la variable de entorno <code>WEB_CONCURRENCY</code>.</p><h3 id="yjit"><a class="anchorlink" href="#yjit"><span>3.2</span> YJIT</a></h3><p>Las versiones recientes de Ruby vienen con un <a href="https://en.wikipedia.org/wiki/Just-in-time_compilation">compilador Just-in-time</a> llamado <a href="https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md"><code>YJIT</code></a>.</p><p>Sin entrar en demasiados detalles, los compiladores JIT permiten ejecutar el código más rápido, a expensas de usar algo más de memoria. A menos que realmente no pueda permitirse este uso adicional de memoria, se recomienda encarecidamente habilitar YJIT.</p><p>A partir de Rails 7.2, si su aplicación se está ejecutando en Ruby 3.3 o superior, YJIT se habilitará automáticamente por Rails por defecto. Las versiones anteriores de Rails o Ruby deben habilitarlo manualmente, consulte la <a href="https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md"><code>documentación de YJIT</code></a> sobre cómo hacerlo.</p><p>Si el uso adicional de memoria es un problema, antes de deshabilitar completamente YJIT, puede intentar ajustarlo para usar menos memoria a través de <a href="https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md#decreasing---yjit-exec-mem-size">la configuración <code>--yjit-exec-mem-size</code></a>.</p><h3 id="asignadores-de-memoria-y-configuración"><a class="anchorlink" href="#asignadores-de-memoria-y-configuración"><span>3.3</span> Asignadores de Memoria y Configuración</a></h3><p>Debido a cómo funciona el asignador de memoria predeterminado en la mayoría de las distribuciones de Linux, ejecutar Puma con múltiples hilos puede llevar a un aumento inesperado en el uso de memoria causado por <a href="https://en.wikipedia.org/wiki/Fragmentation_(computing)">fragmentación de memoria</a>. A su vez, este aumento en el uso de memoria puede impedir que su aplicación utilice completamente los núcleos de CPU del servidor.</p><p>Para aliviar este problema, se recomienda encarecidamente configurar Ruby para usar un asignador de memoria alternativo: <a href="https://github.com/jemalloc/jemalloc">jemalloc</a>.</p><p>El Dockerfile predeterminado generado por Rails ya viene preconfigurado para instalar y usar <code>jemalloc</code>. Pero si su solución de alojamiento no está basada en Docker, debería investigar cómo instalar y habilitar jemalloc allí.</p><p>Si por alguna razón eso no es posible, una alternativa menos eficiente es configurar el asignador predeterminado de una manera que reduzca la fragmentación de memoria estableciendo <code>MALLOC_ARENA_MAX=2</code> en su entorno. Sin embargo, tenga en cuenta que esto podría hacer que Ruby sea más lento, por lo que <code>jemalloc</code> es la solución preferida.</p><h2 id="pruebas-de-rendimiento"><a class="anchorlink" href="#pruebas-de-rendimiento"><span>4</span> Pruebas de Rendimiento</a></h2><p>Debido a que cada aplicación Rails es diferente, y que cada usuario de Rails puede querer optimizar para diferentes propiedades, es imposible ofrecer una configuración predeterminada o directrices que funcionen mejor para todos.</p><p>Por lo tanto, la mejor manera de elegir los ajustes de su aplicación es medir el rendimiento de su aplicación y ajustar la configuración hasta que sea satisfactoria para sus objetivos.</p><p>Esto se puede hacer con una carga de trabajo de producción simulada, o directamente en producción con tráfico de aplicación en vivo.</p><p>Las pruebas de rendimiento son un tema profundo. Esta guía solo ofrece pautas simples.</p><h3 id="qué-medir"><a class="anchorlink" href="#qué-medir"><span>4.1</span> Qué Medir</a></h3><p>El rendimiento es el número de solicitudes por segundo que su aplicación procesa con éxito. Cualquier buen programa de prueba de carga lo medirá. Un rendimiento normalmente es un solo número expresado en "solicitudes por segundo".</p><p>La latencia es el retraso desde el momento en que se envía la solicitud hasta que su respuesta se recibe con éxito, generalmente expresada en milisegundos. Cada solicitud individual tendrá su propia latencia.</p><p>La latencia <a href="https://en.wikipedia.org/wiki/Percentile_rank">percentil</a> da la latencia donde un cierto porcentaje de solicitudes tienen mejor latencia que eso. Por ejemplo, <code>P90</code> es la latencia del percentil 90. El <code>P90</code> es la latencia para una sola prueba de carga donde solo el 10% de las solicitudes tomaron más tiempo que eso para procesarse. El <code>P50</code> es la latencia tal que la mitad de sus solicitudes fueron más lentas, también llamada latencia mediana.</p><p>La "latencia de cola" se refiere a latencias de percentil alto. Por ejemplo, el <code>P99</code> es la latencia tal que solo el 1% de sus solicitudes fueron peores. <code>P99</code> es una latencia de cola. <code>P50</code> no es una latencia de cola.</p><p>En términos generales, la latencia promedio no es una buena métrica para optimizar. Es mejor centrarse en la latencia mediana (<code>P50</code>) y de cola (<code>P95</code> o <code>P99</code>).</p><h3 id="medición-en-producción"><a class="anchorlink" href="#medición-en-producción"><span>4.2</span> Medición en Producción</a></h3><p>Si su entorno de producción incluye más de un servidor, puede ser una buena idea hacer <a href="https://en.wikipedia.org/wiki/A/B_testing">pruebas A/B</a> allí. Por ejemplo, podría ejecutar la mitad de los servidores con <code>3</code> hilos por proceso, y la otra mitad con <code>4</code> hilos por proceso, y luego usar un servicio de monitoreo de rendimiento de aplicaciones para comparar el rendimiento y la latencia de los dos grupos.</p><p>Los servicios de monitoreo de rendimiento de aplicaciones son numerosos, algunos son autohospedados, algunos son soluciones en la nube, y muchos ofrecen un plan de nivel gratuito. Recomendar uno en particular está más allá del alcance de esta guía.</p><h3 id="probadores-de-carga"><a class="anchorlink" href="#probadores-de-carga"><span>4.3</span> Probadores de Carga</a></h3><p>Necesitará un programa de prueba de carga para hacer solicitudes a su aplicación. Esto puede ser un programa de prueba de carga dedicado de algún tipo, o puede escribir una pequeña aplicación para hacer solicitudes HTTP y rastrear cuánto tiempo tardan. Normalmente no debería verificar el tiempo en su archivo de registro de Rails. Ese tiempo es solo cuánto tiempo tomó Rails para procesar la solicitud. No incluye el tiempo tomado por el servidor de aplicaciones.</p><p>Enviar muchas solicitudes simultáneas y cronometrarlas puede ser difícil. Es fácil introducir errores de medición sutiles. Normalmente debería usar un programa de prueba de carga, no escribir el suyo propio. Muchos probadores de carga son simples de usar y muchos probadores de carga excelentes son gratuitos.</p><h3 id="qué-puede-cambiar"><a class="anchorlink" href="#qué-puede-cambiar"><span>4.4</span> Qué Puede Cambiar</a></h3><p>Puede cambiar el número de hilos en su prueba para encontrar el mejor compromiso entre rendimiento y latencia para su aplicación.</p><p>Los hosts más grandes con más memoria y núcleos de CPU necesitarán más procesos para un mejor uso. Puede variar el tamaño y tipo de hosts de un proveedor de alojamiento.</p><p>Aumentar el número de iteraciones generalmente dará una respuesta más exacta, pero requerirá más tiempo para las pruebas.</p><p>Debe probar en el mismo tipo de host que se ejecutará en producción. Probar en su máquina de desarrollo solo le dirá qué configuraciones son mejores para esa máquina de desarrollo.</p><h3 id="calentamiento"><a class="anchorlink" href="#calentamiento"><span>4.5</span> Calentamiento</a></h3><p>Su aplicación debe procesar un número de solicitudes después del inicio que no se incluyan en sus mediciones finales. Estas solicitudes se llaman solicitudes de "calentamiento" y generalmente son mucho más lentas que las solicitudes posteriores de "estado estable".</p><p>Su programa de prueba de carga generalmente admitirá solicitudes de calentamiento. También puede ejecutarlo más de una vez y descartar el primer conjunto de tiempos.</p><p>Tiene suficientes solicitudes de calentamiento cuando aumentar el número no cambia significativamente su resultado. <a href="https://arxiv.org/abs/1602.00602">La teoría detrás de esto puede ser complicada</a> pero la mayoría de las situaciones comunes son sencillas: pruebe varias veces con diferentes cantidades de calentamiento. Vea cuántas iteraciones de calentamiento se necesitan antes de que los resultados se mantengan aproximadamente iguales.</p><p>El calentamiento muy largo puede ser útil para probar la fragmentación de memoria y otros problemas que ocurren solo después de muchas solicitudes.</p><h3 id="qué-solicitudes"><a class="anchorlink" href="#qué-solicitudes"><span>4.6</span> Qué Solicitudes</a></h3><p>Su aplicación probablemente acepta muchas solicitudes HTTP diferentes. Debería comenzar por probar la carga con solo algunas de ellas. Puede agregar más tipos de solicitudes con el tiempo. Si un tipo particular de solicitud es demasiado lento en su aplicación de producción, puede agregarlo a su código de prueba de carga.</p><p>Una carga de trabajo sintética no puede coincidir perfectamente con el tráfico de producción de su aplicación. Aún así, es útil para probar configuraciones.</p><h3 id="qué-buscar"><a class="anchorlink" href="#qué-buscar"><span>4.7</span> Qué Buscar</a></h3><p>Su programa de prueba de carga debería permitirle verificar latencias, incluidas latencias percentiles y de cola.</p><p>Para diferentes números de procesos e hilos, o diferentes configuraciones en general, verifique el rendimiento y una o más latencias como <code>P50</code>, <code>P90</code> y <code>P99</code>. Aumentar los hilos mejorará el rendimiento hasta cierto punto, pero empeorará la latencia.</p><p>Elija un compromiso entre latencia y rendimiento basado en las necesidades de su aplicación.</p>
<hr>
<h3>Comentarios</h3>
<p>
Se te anima a ayudar a mejorar la calidad de esta guía.
</p>
<p>
Por favor contribuye si ves algún error tipográfico o errores fácticos.
Para comenzar, puedes leer nuestra sección de <a href="https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#contributing-to-the-rails-documentation">contribuciones a la documentación</a>.
</p>
<p>
También puedes encontrar contenido incompleto o cosas que no están actualizadas.
Por favor agrega cualquier documentación faltante para main. Asegúrate de revisar
<a href="https://edgeguides.rubyonrails.org">Guías Edge</a> primero para verificar
si los problemas ya están resueltos o no en la rama principal.
Revisa las <a href="ruby_on_rails_guides_guidelines.html">Guías de Ruby on Rails</a>
para estilo y convenciones.
</p>
<p>
Si por alguna razón detectas algo que corregir pero no puedes hacerlo tú mismo, por favor
<a href="https://github.com/rails/rails/issues">abre un issue</a>.
</p>
<p>Y por último, pero no menos importante, cualquier tipo de discusión sobre la
documentación de Ruby on Rails es muy bienvenida en el <a href="https://discuss.rubyonrails.org/c/rubyonrails-docs">Foro oficial de Ruby on Rails</a>.
</p>
</div>
</div>
</main>
<hr class="hide" />
<footer id="page_footer">
<div class="wrapper">
<p>Este trabajo está bajo una <a href="https://creativecommons.org/licenses/by-sa/4.0/">Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional</a></p>
<p>"Rails", "Ruby on Rails" y el logotipo de Rails son marcas registradas de David Heinemeier Hansson. Todos los derechos reservados.</p>
<p> Esta traducción fue generada por openAi e <a href="http://latinadeveloper.com/">Isis Harris.</a></p>
</div>
</footer>
</body>
</html>