• Skip to secondary menu
  • Skip to main content
  • Skip to primary sidebar
  • Home
  • Projects
  • Products
  • Themes
  • Tools
  • Request for Quote

Vengala Vinay

Having 12+ Years of Experience in Software Development

  • Home
  • WordPress
  • PHP
    • Codeigniter
  • Django
  • Magento
  • Selenium
  • Server
Home » Tuning Laravel Horizon and Redis Queues on Debian 12 Bookworm to Process 1 Million jobs daily

Tuning Laravel Horizon and Redis Queues on Debian 12 Bookworm to Process 1 Million jobs daily

Optimizing Redis for High-Throughput Queuing

Achieving a daily throughput of one million jobs in Laravel Horizon necessitates a robust and finely-tuned Redis instance. On Debian 12 Bookworm, we’ll focus on kernel-level tuning, Redis configuration, and strategic deployment. The default Redis configuration is often insufficient for production workloads of this scale.

Kernel Tuning for Network and Memory Performance

The core of high-performance queuing lies in efficient network I/O and memory management. We’ll adjust kernel parameters to prioritize these aspects. These changes are typically made in /etc/sysctl.conf or files within /etc/sysctl.d/.

Network Stack Optimization

To reduce latency and increase throughput for network-bound operations like Redis communication, we’ll tune TCP buffer sizes and connection tracking.

Tuning TCP Buffer Sizes

Increasing the read and write buffer sizes allows for larger data transfers per packet, reducing overhead. The values below are starting points and may require further adjustment based on network topology and Redis workload.

net.core.rmem_max and net.core.wmem_max

These parameters set the maximum receive and transmit buffer sizes, respectively. We’ll set them to a generous value, like 16MB.

net.ipv4.tcp_rmem and net.ipv4.tcp_wmem

These define the minimum, default, and maximum TCP send/receive buffer sizes. We’ll configure them to allow for larger buffers.

Connection Tracking

A high number of concurrent connections can strain the connection tracking module. We’ll increase its capacity.

net.netfilter.nf_conntrack_max

This sets the maximum number of connections that can be tracked. A value of 1,000,000 is a reasonable starting point for a busy server.

Memory Management Tuning

Efficient memory usage is critical for Redis, which is an in-memory data store. We’ll adjust swappiness and transparent huge pages.

vm.swappiness

Setting vm.swappiness to a low value (e.g., 1 or 10) tells the kernel to avoid swapping out application memory as much as possible, which is crucial for Redis performance.

Transparent Huge Pages (THP)

THP can sometimes cause latency spikes in memory-intensive applications like Redis. It’s generally recommended to disable it for Redis.

Applying Kernel Tuning

To apply these kernel parameters, create a new configuration file, for example, /etc/sysctl.d/99-redis-tuning.conf.

Creating the sysctl configuration file

Use your preferred text editor (e.g., nano or vim) to create and edit the file.

Disabling Transparent Huge Pages

This is a critical step. You can disable THP temporarily or persistently. For persistent disabling, create a systemd service.

Temporary Disabling (until reboot)

Execute these commands as root:

Persistent Disabling via Systemd

Create a systemd service file, e.g., /etc/systemd/system/disable-thp.service.

Redis Server Configuration for High Throughput

The redis.conf file is the primary control point for Redis performance. We’ll focus on memory management, persistence, and client connection settings.

Memory Management

maxmemory and maxmemory-policy

Setting a strict maxmemory limit is essential to prevent Redis from consuming all available RAM and causing system instability. The maxmemory-policy dictates how Redis evicts keys when the limit is reached. For a queue, allkeys-lru (Least Recently Used) is a common choice, but if your queue has specific eviction needs, adjust accordingly. Ensure maxmemory is set to a value that leaves ample room for the OS and other processes.

Persistence

For a queueing system, data loss is often acceptable for older jobs. Disabling or carefully configuring persistence can significantly improve write performance.

RDB Snapshotting

RDB snapshots are point-in-time backups. For a queue, frequent snapshots are usually unnecessary and can impact performance. Consider disabling it or setting a very long interval.

AOF (Append Only File)

AOF logs every write operation. While it provides better durability, it can be slower. For high-throughput queues where occasional data loss of very old jobs is acceptable, consider disabling AOF or using a less frequent sync policy (e.g., appendfsync every second or appendfsync no if durability is not a concern at all).

Client Connections

Tuning connection-related parameters can help manage concurrent access.

maxclients

This sets the maximum number of concurrent client connections. Ensure this is set high enough to accommodate your Horizon workers and any other Redis clients. A value of 10000 or more is often appropriate for busy servers.

Applying Redis Configuration

Edit your redis.conf file (typically located at /etc/redis/redis.conf). After making changes, restart the Redis service.

Laravel Horizon Configuration for Scale

Horizon’s configuration directly impacts how efficiently it processes jobs. We’ll focus on worker scaling, job timeouts, and supervisor settings.

config/horizon.php

This file is the central hub for Horizon’s configuration. Key parameters to adjust for high throughput include:

environments

Define your production environment settings here. Pay close attention to supervisor and processes.

supervisor settings

processes: The number of worker processes per supervisor. This should be tuned based on your server’s CPU cores and the nature of your jobs (CPU-bound vs. I/O-bound).

min_processes and max_processes: These allow Horizon to dynamically scale the number of workers based on queue length. Set max_processes to a value that your server can handle. For 1 million jobs daily, you might need a significant number of processes, potentially hundreds, depending on job duration.

tries: The maximum number of times a job will be attempted. For critical jobs, a higher number might be needed, but for high volume, consider a lower number to avoid retrying problematic jobs indefinitely.

queue_data_retention

This setting controls how long job data is retained in Horizon’s database. For high throughput, you’ll want to prune this data regularly to prevent database bloat. A value of 24-72 hours is often sufficient.

Job Timeout and Retries

Long-running jobs can tie up workers and prevent other jobs from being processed. Set appropriate timeouts.

config/queue.php

Ensure your default queue connection is configured correctly.

config/app.php

Set the default queue connection to your Redis connection.

Systemd Service for Horizon

Properly configuring the systemd service for Horizon is crucial for its reliable operation and automatic restarts.

Creating the Horizon Systemd Service File

Create a file named /etc/systemd/system/horizon.service.

Enabling and Starting the Service

After creating the service file, reload systemd, enable the service to start on boot, and start it.

Monitoring and Diagnostics

Continuous monitoring is key to maintaining performance and identifying bottlenecks. Use a combination of system tools and Horizon’s dashboard.

Redis Monitoring

Use redis-cli to inspect Redis status.

Horizon Dashboard

The Horizon dashboard provides real-time insights into job processing, failed jobs, and worker activity. Regularly check:

  • Queue lengths
  • Processing times
  • Failed jobs
  • Worker utilization

System Monitoring Tools

Utilize tools like htop, iotop, and netstat to monitor CPU, memory, disk I/O, and network traffic on your Redis server and application servers.

Log Analysis

Regularly review Laravel logs and system logs for any errors or warnings that might indicate underlying issues.

Advanced Considerations

For extremely high throughput, consider these advanced strategies:

Sharding Redis

If a single Redis instance becomes a bottleneck, sharding Redis across multiple instances can distribute the load. This requires application-level changes or a Redis cluster setup.

Dedicated Redis Server

Running Redis on a dedicated server, separate from your web application, is highly recommended for production environments to avoid resource contention.

Job Prioritization

If certain jobs are more critical, implement prioritization mechanisms within your application and Horizon configuration.

Asynchronous Job Processing

For I/O-bound jobs, ensure your application code is optimized for asynchronous operations to maximize worker efficiency.

Reader Interactions

Leave a Reply Cancel reply

You must be logged in to post a comment.

Primary Sidebar

A little about the Author

Having 12+ Years of Experience in Software Development, Vinay is a principal software architect, senior systems engineer, and elite technical consultant. He specializes in bespoke PHP/WordPress development, high-performance Magento 2 & Shopify architectures, custom plugin/theme development from scratch, and legacy code modernization (including VB6, VB.NET, PyQt, and Crystal Reports). Known for solving complex database bottlenecks, speed optimization (Core Web Vitals), and advanced security code auditing, Vinay engineers production-ready systems designed to scale under heavy concurrent load conditions.



Chat on WhatsApp

Recent Posts

  • Debugging Guide: Diagnosing PHP-FPM child process pool exhaustion in multi-site network environments with modern tools
  • Debugging and Resolving complex namespace class loading collisions issues during heavy concurrent database traffic
  • Step-by-Step Guide: Offloading high-frequency customer support tickets metadata writes to a Redis KV store
  • How to refactor legacy event ticket registers queries using modern WP_Query and custom Transient caching
  • Step-by-Step Guide: Offloading high-frequency member profile directories metadata writes to a Redis KV store

Categories

  • apache (1)
  • Business & Monetization (390)
  • Centos (4)
  • Comparisons & Decision Making (55)
  • Debian (2)
  • Debugging & Troubleshooting (662)
  • Desktop Applications (14)
  • DevOps (7)
  • DevOps & Cloud Scaling (962)
  • Django (1)
  • Laravel (4)
  • Migration & Architecture (192)
  • Mobile Applications (24)
  • MySQL (1)
  • Performance & Optimization (873)
  • PHP (5)
  • PHP Development (49)
  • Plugins & Themes (244)
  • Programming Languages (9)
  • Python (20)
  • Ruby on Rails (1)
  • Security & Compliance (647)
  • SEO & Growth (492)
  • Server (118)
  • Ubuntu (9)
  • VB6 & VB.NET (8)
  • Web Applications & Frontend (19)
  • Web Assembly (Wasm) (2)
  • WordPress (22)
  • WordPress Plugin Development (726)
  • WordPress Theme Development (357)

Recent Posts

  • Debugging Guide: Diagnosing PHP-FPM child process pool exhaustion in multi-site network environments with modern tools
  • Debugging and Resolving complex namespace class loading collisions issues during heavy concurrent database traffic
  • Step-by-Step Guide: Offloading high-frequency customer support tickets metadata writes to a Redis KV store

Top Categories

  • DevOps & Cloud Scaling (962)
  • Performance & Optimization (873)
  • WordPress Plugin Development (726)
  • Debugging & Troubleshooting (662)
  • Security & Compliance (647)
  • SEO & Growth (492)

Our Products

  • ERP & LMS Systems (4)
  • Directories & Marketplaces (4)
  • Healthcare Portals (3)
  • Point of Sale (POS) (2)
  • E-Commerce Engines (2)

Our Services

  • E-Commerce Development (10)
  • WordPress Development (8)
  • Python & Desktop GUI (7)
  • General Consulting (7)
  • Legacy Modernization (5)
  • Mobile App Development (4)

Copyright © 2026 · Vinay Vengala