在 Ubuntu 上,PHP-FPM 并不是用“线程数”来调优,而是用 进程(worker)数 来控制并发(PHP-FPM 默认是 prefork 模式,无多线程)。
下面按常见场景说明如何调整。
Ubuntu 常见路径:
# PHP 7.4 示例
/etc/php/7.4/fpm/pool.d/www.conf
# PHP 8.1 示例
/etc/php/8.1/fpm/pool.d/www.conf
如果你不确定版本:
php -v
在 www.conf 中,重点是这几个:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
| 模式 | 说明 |
|---|---|
| dynamic | 动态调整子进程(最常用) |
| static | 固定进程数(性能稳定但耗内存) |
| ondemand | 按需启动(节省内存,响应稍慢) |
例如:
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_children公式(粗略):
max_children ≈ 总内存 / 单个 PHP 进程内存
查看单个 PHP 进程内存:
ps aux | grep php-fpm
例如:
max_children ≈ 4096 / 40 ≈ 100pm = static
pm.max_children = 120
适合:
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s
适合:
sudo systemctl restart php7.4-fpm
# 或
sudo systemctl restart php8.1-fpm
查看状态:
systemctl status php*-fpm
Nginx 的 worker_processes 和 PHP-FPM 是分开的:
worker_processes auto;
events {
worker_connections 1024;
}
PHP-FPM 才是真正执行 PHP 的。
pm = dynamic
pm.max_children = 80
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
如果你愿意,可以告诉我:
我可以帮你算一套 精确配置。