速卖通素材
奋斗

WordPress搭配MySQL和Redis时,云服务器内存如何合理分配?

服务器

在 WordPress 搭配 MySQL 和 Redis 的架构中,云服务器内存分配的核心原则是:优先保障数据库(MySQL)性能,其次满足应用层(PHP/WordPress)需求,最后利用 Redis 做缓存优化。以下是具体的内存分配策略和建议:


1. 核心组件内存角色分析

  • MySQL

    • 主要消耗 innodb_buffer_pool_size(默认值通常为物理内存的 50%~70%),用于缓存数据和索引。
    • 其他关键参数包括 key_buffer_size(MyISAM 表)、query_cache_size(已废弃,不推荐)、sort_buffer_sizeread_buffer_size 等。
    • 建议:独占至少 50%~60% 的物理内存(根据数据量调整)。
  • Redis

    • 作为缓存层,存储热点数据(如会话、对象缓存、查询结果)。
    • 内存占用 = maxmemory 配置值 + 冗余开销(约 10%~20%)。
    • 建议:分配 15%~20% 物理内存,避免与 MySQL 争抢资源。
  • PHP-FPM + WordPress

    • PHP 进程数 × 单进程内存(通常 30MB~100MB/进程)。
    • WordPress 插件/主题可能增加额外内存消耗。
    • 建议:预留 20%~30% 物理内存,动态调整 PHP-FPM 进程数。

2. 典型场景内存分配方案

场景 1:小型网站(日 PV < 1 万)

  • 总内存:2GB
    • MySQL: 1.2GBinnodb_buffer_pool_size=1.2G
    • Redis: 400MBmaxmemory=400mb
    • PHP-FPM: 400MBpm.max_children=8,单进程 50MB)

场景 2:中型网站(日 PV 1 万~10 万)

  • 总内存:4GB
    • MySQL: 2.5GBinnodb_buffer_pool_size=2.5G
    • Redis: 800MBmaxmemory=800mb
    • PHP-FPM: 700MBpm.max_children=10,单进程 70MB)

场景 3:大型网站(日 PV > 10 万)

  • 总内存:8GB+
    • MySQL: 5GBinnodb_buffer_pool_size=5G
    • Redis: 1.5GBmaxmemory=1.5gb
    • PHP-FPM: 1.5GBpm.max_children=15,单进程 100MB)
    • 注意:若数据量极大,可考虑将 MySQL 独立部署到专用服务器。

3. 关键配置示例

MySQL 优化(my.cnf)

[mysqld]
innodb_buffer_pool_size = 2.5G          # 占物理内存 60%
innodb_log_file_size = 512M             # 日志文件,减少磁盘 IO
query_cache_type = 0                    # 禁用查询缓存(MySQL 8.0+ 已移除)
thread_cache_size = 10                  # 线程池缓存
tmp_table_size = 256M                   # 临时表大小
max_connections = 100                   # 连接数限制

Redis 优化(redis.conf)

maxmemory = 800mb                       # 限制最大内存
maxmemory-policy = allkeys-lru          # 淘汰策略:LRU
appendonly yes                          # AOF 持久化

PHP-FPM 优化(php-fpm.conf)

pm = dynamic
pm.max_children = 10                    # 最大子进程数
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500                   # 每个进程处理请求后重启

4. 监控与调优建议

  1. 实时监控工具

    • MySQL: SHOW STATUS LIKE 'Innodb_buffer_pool_read%'(命中率应 >95%)
    • Redis: INFO memory(检查 used_memory_humanevicted_keys
    • 系统级:tophtopvmstat 观察内存使用率。
  2. 动态调整

    • 若 MySQL 频繁换页(Swap),增加 innodb_buffer_pool_size
    • 若 Redis 内存溢出,调整 maxmemory 或启用更激进的淘汰策略。
    • 若 PHP-FPM 进程过多导致 OOM,减少 pm.max_children 或优化代码。
  3. 进阶优化

    • 启用 Query Cache(仅适用于低并发场景,MySQL 5.7 及以下版本)。
    • 使用 Percona Toolkit 进行 MySQL 深度调优。
    • 对 WordPress 启用 Object Cache(通过 Redis 替代 Memcached)。

5. 常见误区

  • 过度分配 Redis 内存:导致 MySQL 被压缩,反而降低整体性能。
  • 忽略 PHP-FPM 进程数:高并发下未设置 pm.max_children 会导致请求排队。
  • 未监控 Swap 使用:频繁 Swap 会严重拖慢 MySQL 性能。

通过以上策略,可以平衡 WordPress、MySQL 和 Redis 的资源竞争,最大化服务器性能。实际部署时,建议先按保守比例分配,再根据监控数据逐步调整。

未经允许不得转载:轻量云Cloud » WordPress搭配MySQL和Redis时,云服务器内存如何合理分配?