PHP 多进程 ≠ MySQL 多进程。
二者虽都使用“多进程”模型,但设计目标、架构层次、资源管理方式完全不同,混淆会导致对系统性能和并发模型的根本误判。
一、核心差异概览
| 维度 | PHP 多进程(如 PHP-FPM) | MySQL 多进程 |
|---|---|---|
| 本质 | 应用层并发模型 | 数据库内核架构 |
| 目的 | 并行处理多个 HTTP 请求 | 并行处理 SQL 查询 + 后台任务 |
| 进程角色 | 所有 Worker 进程同质(执行 PHP 脚本) | 进程异构(连接、IO、InnoDB、复制等) |
| 数据共享 | 无共享(每个进程独立内存) | 共享内存池(Buffer Pool、Query Cache 等) |
| 生命周期 | 请求驱动(FPM Worker 长期存活) | 服务驱动(主进程常驻,子进程按需创建) |
✅关键认知:
- PHP 进程 = 应用逻辑执行单元
- MySQL 进程 = 数据库内部任务调度单元
二、PHP 多进程详解(以 FPM 为例)
1.进程模型
- Master 进程:监听端口,管理 Worker 生命周期。
- Worker 进程:
- 数量由
pm.max_children控制 - 每个 Worker 一次处理一个请求
- 进程间完全隔离:全局变量、OPcache(opcode 共享,但符号表不共享)、内存不互通
- 数量由
2.并发机制
- 靠进程数量实现并发:100 个 Worker ≈ 100 并发请求。
- 无共享状态:若需跨进程通信,必须依赖外部存储(Redis、DB、APCu)。
3.资源消耗
- 每个进程占用独立内存(RSS 通常 30~100 MB)。
- 内存总占用 ≈
max_children × 单进程内存。
三、MySQL 多进程详解(Linux 下)
⚠️ 注意:MySQL 在 Linux 上实际是“多线程”为主,“多进程”为辅。
(Windows 版才是纯多进程)
1.主进程(Threaded Architecture)
- 单进程 + 多线程模型(Linux 默认):
psaux|grepmysqld# 仅看到 1 个 mysqld 进程(PID 相同)# 但 /proc/PID/task/ 下有多个线程 - 线程类型:
- Connection Threads:每个客户端连接一个线程
- InnoDB Threads:读写、日志、purge 等后台线程
- Replication Threads:IO Thread、SQL Thread
2.真正的多进程场景
- mysqld_safe:启动脚本进程(监控 mysqld)
- 外部工具:
mysql,mysqldump等客户端是独立进程 - 插件/UDF:某些扩展可能 fork 子进程(罕见)
3.资源共享
- 所有线程共享:
- InnoDB Buffer Pool
- Query Cache(已废弃)
- Table Cache
- 内存池(如
innodb_buffer_pool_size)
- 线程私有:
- 连接上下文
- 临时表
- 排序缓冲区(
sort_buffer_size)
四、关键对比:为什么不能类比?
| 场景 | PHP 多进程 | MySQL 多进程/线程 |
|---|---|---|
| “100 并发”含义 | 100 个 FPM Worker 进程 | 100 个连接线程(同一 mysqld 进程内) |
| 内存增长 | 线性增长(100×45MB = 4.5GB) | 非线性增长(共享 Buffer Pool,线程私有内存小) |
| 上下文切换开销 | 高(进程切换) | 低(线程切换) |
| 故障隔离 | 一个 Worker 崩溃不影响其他 | 一个连接线程崩溃可能导致整个 mysqld 退出(严重 bug) |
| 扩展方式 | 增加 Worker 数量 | 增加连接数(max_connections),优化共享内存 |
💡典型误解纠正:
- ❌ “PHP 开 100 进程,MySQL 也要开 100 进程” → ✅ MySQL 只需1 个进程 + 100 线程
- ❌ “PHP 和 MySQL 进程数要 1:1” → ✅无直接关系,PHP 并发由 FPM 控制,MySQL 并发由
max_connections控制
五、协同工作时的实际交互
- 每个 PHP Worker 进程可能建立1 个或多个 MySQL 连接。
- MySQL 看到的是多个连接线程,而非多个进程。
- 瓶颈点:
- PHP 侧:
pm.max_children不足 → 请求排队 - MySQL 侧:
max_connections不足 →Too many connections
- PHP 侧:
六、工程调优原则
| 组件 | 调优目标 | 关键参数 |
|---|---|---|
| PHP-FPM | 避免进程不足或 OOM | pm.max_children,pm.max_requests |
| MySQL | 避免连接耗尽或内存溢出 | max_connections,innodb_buffer_pool_size |
✅黄金法则:
PHP 并发能力由 FPM 进程数决定,MySQL 并发能力由连接线程数决定,二者通过连接池解耦。
(如 Laravel 使用DB_CONNECTION_POOL减少 MySQL 连接数)
总结
- PHP 多进程:应用层并行执行模型,进程隔离,内存不共享。
- MySQL 多进程:在 Linux 上实为多线程,共享核心内存结构,线程处理连接。
- 二者不在同一抽象层级:
- PHP 进程是你的代码运行环境
- MySQL 线程是数据库内部任务单元
- 正确理解:才能合理分配服务器资源,避免“PHP 开 50 进程,MySQL 只配 20 连接”的配置失衡。