Commit 6007aa4
authored
Run Solid Queue in async mode on Render free tier (#23)
* Run Solid Queue in async mode on Render free tier
Companion to #22 (WEB_CONCURRENCY=0). Free tier (512MB) can't fit
SQ's default fork mode, which spawns supervisor + worker +
dispatcher + scheduler subprocesses for ~460MB of RSS overhead on
top of Puma. The container OOM-cycles every ~7-15 min — the deploy
still looks "live" but HTTP returns 502s during each restart
window.
`solid_queue_mode :async` (documented switch in
lib/puma/plugin/solid_queue.rb of the gem) tells the plugin to
run worker/dispatcher/scheduler as threads inside the Puma master
process. The 4 SQ subprocesses collapse into ~50MB of thread
overhead in Puma. Container RSS drops from ~530MB (cycling into
OOM) to a flat ~300MB.
Trade-off per SQ's own docs ("Only use async if you know what
you're doing and have strong reasons to"):
- Less isolation between SQ and Puma. A leaky/hung SQ thread
affects request serving. For low-traffic student projects this
is the right call; revisit if upgrading to a paid plan.
- No inter-process parallelism for jobs. Free tier is already
0.1 vCPU, so this isn't real lost throughput.
- Recurring tasks and concurrency controls still work unchanged.
The DB pool bump (5 → 8) is non-optional: previously the pool was
sized for Puma's 3 request threads only; now the same process
also runs 3 SQ worker threads + dispatcher + scheduler. Under any
load the old pool=5 would throw ConnectionTimeoutError. The 5 ->
8 default still respects DB_POOL env override for projects that
need finer control.
Diagnosed and validated on raghubetina/aplace:
raghubetina/aplace#58 — RSS metric showed
the predicted plateau at ~300MB with zero growth after deploy.
* Pin solid_queue ~> 1.3 for solid_queue_mode :async support
This branch's puma.rb adds `solid_queue_mode :async if ENV["SOLID_QUEUE_IN_PUMA"]`,
but the lockfile resolved to solid_queue 1.1.4, which has no such DSL method.
Booting in production crashes immediately with:
config/puma.rb:47:in 'Puma::DSL#_load_from': undefined method
'solid_queue_mode' for an instance of Puma::DSL (NoMethodError)
Async supervisor mode was re-introduced in solid_queue 1.3.0
(rails/solid_queue#644); the earlier 0.4 implementation was
removed in 0.7. Pinning to ~> 1.3 documents the minimum that
matches this branch's puma.rb and updates the lockfile to 1.4.0.
Caught by deploying a marketplace smoke-test app built from this
branch + #22 + #24 to Render free tier.1 parent 8899422 commit 6007aa4
4 files changed
Lines changed: 52 additions & 37 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
89 | | - | |
| 89 | + | |
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
| |||
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
| 134 | + | |
134 | 135 | | |
135 | | - | |
| 136 | + | |
136 | 137 | | |
137 | 138 | | |
138 | 139 | | |
| |||
154 | 155 | | |
155 | 156 | | |
156 | 157 | | |
157 | | - | |
158 | | - | |
| 158 | + | |
| 159 | + | |
159 | 160 | | |
160 | | - | |
| 161 | + | |
161 | 162 | | |
162 | 163 | | |
163 | 164 | | |
| |||
188 | 189 | | |
189 | 190 | | |
190 | 191 | | |
191 | | - | |
| 192 | + | |
192 | 193 | | |
| 194 | + | |
193 | 195 | | |
194 | 196 | | |
195 | 197 | | |
| |||
211 | 213 | | |
212 | 214 | | |
213 | 215 | | |
214 | | - | |
| 216 | + | |
215 | 217 | | |
216 | 218 | | |
217 | 219 | | |
| |||
223 | 225 | | |
224 | 226 | | |
225 | 227 | | |
226 | | - | |
227 | | - | |
| 228 | + | |
228 | 229 | | |
229 | 230 | | |
230 | 231 | | |
| |||
240 | 241 | | |
241 | 242 | | |
242 | 243 | | |
243 | | - | |
244 | | - | |
| 244 | + | |
245 | 245 | | |
246 | | - | |
| 246 | + | |
247 | 247 | | |
248 | | - | |
| 248 | + | |
249 | 249 | | |
250 | | - | |
| 250 | + | |
251 | 251 | | |
252 | | - | |
| 252 | + | |
253 | 253 | | |
254 | | - | |
| 254 | + | |
255 | 255 | | |
256 | | - | |
| 256 | + | |
257 | 257 | | |
258 | | - | |
259 | | - | |
260 | | - | |
| 258 | + | |
261 | 259 | | |
262 | 260 | | |
263 | 261 | | |
| |||
293 | 291 | | |
294 | 292 | | |
295 | 293 | | |
296 | | - | |
297 | | - | |
| 294 | + | |
| 295 | + | |
298 | 296 | | |
299 | 297 | | |
300 | 298 | | |
301 | 299 | | |
302 | | - | |
| 300 | + | |
303 | 301 | | |
304 | 302 | | |
305 | 303 | | |
| |||
319 | 317 | | |
320 | 318 | | |
321 | 319 | | |
322 | | - | |
| 320 | + | |
323 | 321 | | |
324 | 322 | | |
325 | 323 | | |
326 | | - | |
327 | | - | |
| 324 | + | |
| 325 | + | |
328 | 326 | | |
329 | 327 | | |
330 | 328 | | |
| |||
343 | 341 | | |
344 | 342 | | |
345 | 343 | | |
346 | | - | |
| 344 | + | |
347 | 345 | | |
348 | 346 | | |
349 | 347 | | |
350 | 348 | | |
351 | | - | |
| 349 | + | |
| 350 | + | |
352 | 351 | | |
| 352 | + | |
353 | 353 | | |
354 | | - | |
| 354 | + | |
355 | 355 | | |
356 | 356 | | |
357 | 357 | | |
| |||
438 | 438 | | |
439 | 439 | | |
440 | 440 | | |
441 | | - | |
| 441 | + | |
442 | 442 | | |
443 | 443 | | |
444 | 444 | | |
445 | | - | |
| 445 | + | |
446 | 446 | | |
447 | | - | |
| 447 | + | |
448 | 448 | | |
449 | 449 | | |
450 | 450 | | |
| |||
453 | 453 | | |
454 | 454 | | |
455 | 455 | | |
456 | | - | |
| 456 | + | |
457 | 457 | | |
458 | 458 | | |
459 | 459 | | |
| |||
490 | 490 | | |
491 | 491 | | |
492 | 492 | | |
493 | | - | |
| 493 | + | |
494 | 494 | | |
495 | 495 | | |
496 | 496 | | |
| |||
541 | 541 | | |
542 | 542 | | |
543 | 543 | | |
544 | | - | |
| 544 | + | |
545 | 545 | | |
546 | 546 | | |
547 | 547 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
21 | 26 | | |
22 | 27 | | |
23 | 28 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
39 | 49 | | |
40 | 50 | | |
41 | 51 | | |
0 commit comments