You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Octane RPS无法突破140,如何优化提升请求处理能力?

问题

我将使用MySQL(宿主机运行)和Redis(容器运行)的Laravel应用进行了Docker化部署。使用Locust压测时,每秒请求数(RPS)达到140后,新增请求开始失败;例如RPS达500时仅140个请求成功,360个失败。使用loader.io测试时,6000用户/分钟一切正常,但超过该数值后多数请求超时。

VM配置:宿主机Ubuntu 22.04、60GB内存、47核CPU,资源远未耗尽。

Dockerfile

FROM php:8.2-fpm as php

# Set environment variables
ENV PHP_OPCACHE_ENABLE=1
ENV PHP_OPCACHE_ENABLE_CLI=0
ENV PHP_OPCACHE_VALIDATE_TIMESTAMP=0
ENV PHP_OPCACHE_REVALIDATE_FREQ=0

# Install dependencies
RUN apt-get update && apt-get install -y \
    unzip \
    libpq-dev \
    libcurl4-gnutls-dev \
    libonig-dev \
    libgd-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libfreetype6-dev \
    libwebp-dev \
    zlib1g-dev \
    git \
    supervisor \
    libaio1 \
    libpcre3-dev

# Install PHP extensions
RUN docker-php-ext-install \
    mysqli \
    pdo \
    pdo_mysql \
    bcmath \
    curl \
    opcache \
    mbstring \
    gd \
    pcntl

# Install Swoole extension
RUN pecl install swoole && docker-php-ext-enable swoole

# Copy composer executable
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer


# Set working directory to /var/www
WORKDIR /var/www

# Copy files from current folder to container current folder (set in workdir)
COPY --chown=www-data:www-data . .

# Install Laravel Octane
RUN composer require laravel/octane --dev

# Create a script to run octane install in non-interactive mode
RUN echo 'php artisan octane:install --server="swoole"' > install_octane.sh && \
    chmod +x install_octane.sh && \
    ./install_octane.sh

RUN php artisan vendor:publish --tag=octane-config

# Create laravel caching folders
RUN mkdir -p /var/www/storage/framework/{cache,testing,sessions,views}
RUN mkdir -p /var/www/resources/views

# Fix files ownership
RUN chown -R www-data /var/www/storage \
    && chown -R www-data /var/www/storage/framework \
    && chown -R www-data /var/www/storage/framework/sessions \
    && chown -R www-data /var/www/resources/views

# Set correct permission
RUN chmod -R 755 /var/www/storage \
    && chmod -R 755 /var/www/storage/logs \
    && chmod -R 755 /var/www/storage/framework \
    && chmod -R 755 /var/www/storage/framework/sessions \
    && chmod -R 755 /var/www/bootstrap \
    && chmod -R 755 /var/www/resources/views


# Adjust user permission & group
RUN usermod --uid 1000 www-data \
    && groupmod --gid 1001 www-data

# Run the entrypoint file
ENTRYPOINT [ "docker/entrypoint2.sh" ]

docker-compose.yml

version: "3.8"
services:

    # PHP Service
    php:
        image: laravel.octan.optimizer:3

        environment:
          APP_NAME: appname
          APP_ENV: local
          APP_KEY: 
          APP_DEBUG: "false"
          LOG_CHANNEL: stack
          LOG_DEPRECATIONS_CHANNEL: "null"
          LOG_LEVEL: debug
          DB_CONNECTION: mysql
          DB_HOST: [HOST_IP]
          DB_PORT: 3306
          DB_DATABASE: dbname
          DB_USERNAME: root
          DB_PASSWORD: 123
          SMSIR_API_KEY: KfENDZ4xfjepFKKJL64peTEzfuJUxX9j6trxklaZTDDBC4v2eYBULibyMSAaDHpx
          SMSIR_LINE_NUMBER: 30007732903708
          REDIS_HOST: [HOST_IP]
          REDIS_PASSWORD: null
          REDIS_PORT: 6379
          CONTAINER_ROLE: app

        working_dir: /var/www
        
        ports:
          - 6001:6001
          - 8000:8000

已尝试的操作:

  • 将MySQL的max_connections调至100000,但实际最多只能到9190,仅将RPS从120提升至140,效果甚微。
  • 使用composer create-project laravel/laravel example-app创建全新Laravel项目测试,同样无法突破140RPS,超过后请求大量失败。
  • 尝试用PHP-FPM+Nginx进行Docker化部署,但RPS超过110就会失败。

预期目标:应用能达到500RPS,且可处理15000+并发用户/分钟。


分析与解决方案

1. 解除Docker容器资源限制

默认Docker不会给容器分配全部宿主机资源,即使宿主机资源充足,容器可能被CPU/内存限制:

  • 在docker-compose.yml的php服务中添加资源配置:
    deploy:
      resources:
        limits:
          cpus: '40.0'
          memory: 50G
        reservations:
          cpus: '20.0'
          memory: 20G
    
  • 或启动容器时用--cpus和--memory参数直接指定资源上限,确保容器能利用足够的宿主机资源。

2. 优化Octane/Swoole配置

当前仅安装了Octane和Swoole,但未配置核心参数:

  • 修改config/octane.php中的Swoole配置:
    'swoole' => [
        'options' => [
            'worker_num' => 40, // 设为宿主机CPU核心数的1-2倍
            'max_connection' => 100000,
            'open_tcp_nodelay' => true,
            'enable_reuse_port' => true,
            'package_max_length' => 20 * 1024 * 1024,
        ],
    ],
    
  • 在entrypoint脚本中修改Octane启动命令,指定足够工作进程:php artisan octane:start --server=swoole --workers=40

3. 优化MySQL连接与资源

  • 启用Octane数据库连接复用:在config/octane.php中开启预热配置,预创建数据库连接:
    'warm' => [
        'workers' => true,
        'connections' => ['mysql'],
    ],
    
  • 调整MySQL文件句柄限制:宿主机/etc/security/limits.conf添加:
    mysql soft nofile 65535
    mysql hard nofile 65535
    
    重启MySQL服务,解决max_connections无法调至预期值的问题。同时调大wait_timeout和interactive_timeout,避免连接被过早回收。

4. 优化宿主机网络

Docker端口映射(NAT模式)会带来性能损耗,且宿主机默认网络参数可能限制并发:

  • 改用host网络模式:在docker-compose.yml的php服务中添加:
    network_mode: "host"
    
    此时无需配置ports映射,直接用宿主机端口访问应用。
  • 调整宿主机内核网络参数:修改/etc/sysctl.conf:
    net.core.somaxconn = 65535
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_max_syn_backlog = 65535
    net.core.netdev_max_backlog = 65535
    
    执行sysctl -p使配置生效。

5. PHP-FPM模式优化(若使用)

如果切换回PHP-FPM+Nginx,需调整进程数和连接数:

  • 修改PHP-FPM配置/usr/local/etc/php-fpm.d/www.conf:
    pm = dynamic
    pm.max_children = 200
    pm.start_servers = 40
    pm.min_spare_servers = 20
    pm.max_spare_servers = 60
    pm.max_requests = 1000
    
  • 修改Nginx配置:
    worker_processes auto;
    worker_connections 65535;
    keepalive_timeout 65;
    

6. 应用层缓存优化

  • 执行php artisan config:cache和php artisan view:cache启用配置与视图缓存。
  • 将静态资源(CSS/JS/图片)托管到Nginx或CDN,避免应用容器处理静态请求。
  • 用Redis缓存数据库查询结果、会话数据,减少MySQL压力。

内容的提问来源于stack exchange,提问作者Mohammad Yazdani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:45:54