Yii2的虚拟化部署性能调优_容器内存和CPU限制【实战】

冬芳小哥_9294

冬芳小哥_9294

2026-03-26

327人浏览

原创

这是典型的「资源限制未对齐」问题:docker cpu 限制与 yii2 缓存、php-fpm 配置不匹配,导致频繁失效、调度争抢;mysql 持久连接堆积、assetmanager 路径错位、redis 时间不同步等共同引发性能下降。

yii2的虚拟化部署性能调优_容器内存和cpu限制【实战】

容器里 Yii2 应用响应变慢,docker stats 显示 CPU 飙高但 PHP 进程没满载

这是典型的「资源限制未对齐」问题:Docker 的 --cpus 或 cgroups 限制了 CPU 时间片,但 Yii2 的 opcache 和 APCu 缓存策略仍按物理机逻辑配置,导致频繁缓存失效、重复编译。PHP-FPM 子进程数若还沿用 pm.max_children = 50 这类旧值,反而会加剧调度争抢。

实操建议:

  • 在 php-fpm.conf 中把 pm.max_children 改为容器内存的 1/40(单位 MB),比如 512MB 容器 → 设为 12;同时启用 pm = ondemand
  • 强制关闭 opcache.validate_timestamps(设为 0),容器镜像构建阶段就预热 opcache,运行时不再检查文件修改时间
  • 确认宿主机内核开启 CONFIG_MEMCG_SWAP_ENABLED,否则 Docker 的 --memory 限制在 swap 溢出时会静默失效,Yii2 大数组序列化可能直接 OOM 而不报错

MySQL 连接池耗尽,yii\db\Exception 报 “Too many connections” 却查不到活跃连接

容器网络下,Yii2 默认的 PDO::ATTR_PERSISTENT => true 会与 Docker 的 DNS 缓存、连接复用机制冲突——每个 PHP-FPM worker 持有独立持久连接,而容器重启后旧连接未被 MySQL 主动回收,wait_timeout 又设得过大(默认 28800 秒),连接堆积在服务端却显示为 Sleep 状态。

实操建议:

  • 在 common/config/main-local.php 的数据库组件中显式关闭持久连接:'attributes' => [PDO::ATTR_PERSISTENT => false]
  • 把 MySQL 容器的 wait_timeout 降到 300(5 分钟),配合 Yii2 的 Connection::setActive(false) 手动释放,避免长 Sleep 占位
  • 用 docker exec -it mysql mysql -e "show processlist;" | grep Sleep | wc -l 实时盯住 Sleep 连接数,超过 20 就要查 Yii2 的事务是否未正确 commit/rollback

AssetManager 生成的 JS/CSS 文件 404,本地开发正常但容器里报错

根本原因是 AssetManager::basePath 默认指向 @webroot/assets,而容器中 Nginx 的 root 配置若写成 /app/web,但实际代码挂载路径是 /var/www/html,导致生成的 asset 路径和 Nginx 可访问路径错位。更隐蔽的是,chmod 权限在 Docker build 阶段被覆盖,assets/ 目录不可写,Yii2 静默失败却不报错。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载

实操建议:

  • 在 web.php 中硬编码 asset 路径:'assetManager' => ['basePath' => '/var/www/html/assets', 'baseUrl' => '@web/assets']
  • Dockerfile 构建最后加一句:RUN mkdir -p /var/www/html/assets && chown -R www-data:www-data /var/www/html/assets
  • 删掉 assets/ 目录后,用 ./yii asset/compress 预生成静态资源包,避免运行时动态生成——这对 CI/CD 流水线尤其关键

Redis 缓存命中率骤降,redis-cli info keyspace 显示 db0 key 数暴涨但业务量没变

Yii2 的 CacheDependency 在容器时间不同步时会出问题:宿主机时间快于容器,导致依赖时间戳早于当前时间,缓存永远不更新;反过来,容器时间慢,则所有依赖过期判断失效,缓存被大量误判为“已过期”,反复重建。另外,yii\caching\RedisCache 默认 keyPrefix 是空字符串,多实例共用一个 Redis 时 key 冲突,互相覆盖。

实操建议:

  • 启动容器时必须加 --volume /etc/localtime:/etc/localtime:ro,禁止容器使用 UTC 时间
  • 在 Redis 缓存组件配置中强制指定 'keyPrefix' => 'yii2-prod-',前缀带环境标识
  • 把 CacheDependency::ensureCheck 改为 false,改用 TagDependency + 主动标记失效,规避时间判断逻辑

调优不是堆参数,而是让 Yii2 的缓存、连接、资产三套机制真正理解自己跑在受限的、隔离的、时间可能漂移的容器里——漏掉任意一环,性能瓶颈就会以最意想不到的方式冒出来。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

yii

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2293

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1399

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

835

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3192

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5428

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1199

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5711

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4982

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6634

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习