Laravel Octane、原生Docker与 WSL2:极端性能问题
我在Docker + WSL2上运行的Laravel应用遇到了严重的性能问题。尽管做了大量优化,所有页面的加载时间都在2-10秒之间。我希望有人遇到过类似情况,能指点我方向。
## Environment
- **OS:** Windows 11 with WSL2 (Ubuntu)
- **Framework:** Laravel 11 + Filament 3 + Livewire 3
- **Server:** Laravel Octane with Swoole (4 workers)
- **Setup:** Docker Compose (multi-container)
- **Database:** Microsoft SQL Server (Docker container)
- **Cache/Session:** Redis (local Docker container)
- **Project Location:** WSL2 native filesystem `/data/www/` (NOT `/mnt/c/`)
## The Problem
**Every single page** takes 2-10 seconds to load in the browser, despite server logs showing only 300-400ms PHP processing time.
**Performance Metrics:**
Server logs (`storage/logs/performance-*.log`):
```json
{
"total_ms": 300-400,
"database_ms": 0,
"app_logic_ms": 300-400
}
浏览器开发者工具(实际用户体验):
- 简单页面:2-4秒
- 仪表板:6-10秒
- 所有页面都持续变慢
服务器报告的时间(300ms)与实际用户体验(2-10s)之间存在约1.5-9.5秒的差距。
我已经尝试过的办法
我已经实现了我能找到的所有优化:
OPcache CLI已启用 - 已通过 opcache.enable_cli=1 验证,结果与 php -i 相符
Vendor目录放在Docker卷中 - 将 vendor/ 和 node_modules/ 移到命名的Docker卷(不是绑定挂载)
Swoole工作进程优化 - 使用4 个工作进程
Laravel缓存
调试工具禁用 - APP_DEBUG=false,Debugbar和 Clockwork关闭
本地Redis - REDIS_HOST=redis(Docker容器,本地而非远程)
本地存储 - 已将Azure Blob存储切换为本地磁盘
广播禁用 - BROADCAST_CONNECTION=log
=========================================
我观察到的情况
- 服务器日志始终显示 300-400ms 的处理时间
- 浏览器显示总加载时间为 2-10秒
- 1.5-9.5秒的差距没有解释清楚
- 所有页面 都受影响,而不仅仅是某些功能
- 随后刷新也不会变快(缓存没有帮助)
所以问题是
这是Docker + WSL2的正常开销吗?在这个栈下应该预期2-10秒的页面加载吗?
解决方案
你需要在完全脱离当前这套设置的情况下测试应用,以便逐个排除导致问题的环节
1- 在本地开发环境中使用Docker + Redis的应用会像这样慢吗?
2- 你是否在原生Linux VPS上试过?
3- 试着关闭HTTPS只用HTTP,看差异?
4- 我怀疑是Filament + Livewire?尝试用一个普通的视图(简单Blade,甚至简单的HTML)来测试差异。我会考虑移除Filament和 Livewire,然后再测试情况。
额外说明:我的生产环境有一个使用Octane的 Laravel应用,但我使用FrankenPHP,而不是Swoole;你也需要在两者都不使用的情况下测试应用;也许某些配置有误,导致这里变慢。