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服务,解决mysql soft nofile 65535 mysql hard nofile 65535max_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 = 65535sysctl -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
相关产品推荐
相关产品推荐

