温馨提示×

Linux LAMP服务器如何进行性能调优

小樊
33
2025-12-06 03:36:38
栏目: 云计算

Linux LAMP性能调优实战指南

一 基线测量与瓶颈定位

  • 建立可复现的压测基线:使用 ab/wrk/siege 对关键接口进行压测,记录 P95/P99 延迟、RPS、错误率,每次调优只变更一个变量以便归因。
  • 系统层观测:用 top/vmstat/iostat/netstat 观察 CPU 软硬中断、I/O 等待、上下文切换、连接队列 等;用 ss -s 查看 TIME_WAIT 与连接状态分布。
  • 组件日志与指标:打开 Apache 访问/错误日志MySQL 慢查询日志,配合 Prometheus + GrafanaPMM 做可视化与阈值告警,形成“指标—日志—链路”的闭环。
  • 代码与数据库剖析:用 Xdebug/Blackfire 定位 PHP 热点函数;用 EXPLAIN 分析慢 SQL 执行计划,优先处理高成本查询。

二 Linux 内核与文件系统优化

  • 文件描述符与进程限制:提升 ulimit -n(如 65535),为服务账户设置合理的 nofile 上限,避免“too many open files”。
  • 网络参数(/etc/sysctl.conf,按带宽与并发适度调整):
    • 连接复用与回收:net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_fin_timeout=30
    • 半开连接与队列:net.ipv4.tcp_max_syn_backlog=1024net.core.somaxconn=1024
    • 端口范围:net.ipv4.ip_local_port_range=“1024 65535”
    • 生效命令:sysctl -p
  • 内存与脏页:降低交换倾向 vm.swappiness=10;控制脏页刷写 vm.dirty_background_ratio=5vm.dirty_ratio=10,减少抖动。
  • 存储与挂载:优先 SSD;文件系统用 EXT4/XFS;挂载选项加 noatime 减少元数据写入。

三 Apache 与 PHP 调优

  • 选择并发模型:
    • Prefork:进程隔离、稳定,适合 mod_php 与有阻塞扩展的场景。
    • Worker/Event:多进程+多线程/事件驱动,适合高并发、I/O 密集型,通常配合 PHP-FPM
  • 关键参数范式:
    • 启用长连接:KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 5
    • 并发控制:依据内存与 MaxRequestWorkers(或 MaxClients)设定上限,避免过载。
    • 压缩与缓存:mod_deflate 开启 Gzip;启用 mod_cache/mod_expires 做页面与静态资源缓存。
  • PHP 运行时:
    • 使用 PHP-FPM 替代 mod_php,进程池按内存与并发规划(见下一节示例)。
    • 启用 OPcache(示例):
      • zend_extension=opcache.so
      • opcache.enable=1
      • opcache.memory_consumption=128
      • opcache.interned_strings_buffer=8
      • opcache.max_accelerated_files=4000
    • 代码与数据层:减少 **SELECT ***、合并/批量 SQL、使用 预处理语句Redis/Memcached 缓存热点数据。

四 MySQL MariaDB 调优

  • 内存与日志:
    • innodb_buffer_pool_size:建议为物理内存的 50%–80%(如 16GB 内存可先设 10G–12G)。
    • innodb_log_file_sizeinnodb_log_buffer_size 适度增大,减少日志写放大。
    • innodb_flush_log_at_trx_commit:主库设 1(强一致),从库可设 2 提升吞吐。
    • innodb_io_capacity:SSD 可设 2000 左右。
  • 连接与会话:
    • max_connections 结合应用峰值与线程池能力设定;thread_cache_size 减少线程创建销毁开销。
  • 索引与 SQL:
    • WHERE/JOIN/ORDER BY 建立合适索引,遵循最左前缀;避免隐式转换与函数导致索引失效。
    • 开启 慢查询日志,用 EXPLAIN 优化执行计划,优先处理高成本 SQL。
  • 架构演进:读多写少场景引入 读写分离(ProxySQL/MySQL Router);超大数据量考虑 分库分表

五 缓存、扩展与维护

  • 分层缓存:
    • 前端:Varnish/CDN 缓存整页与静态资源,降低源站压力。
    • 应用层:Redis/Memcached 缓存热点对象与计算结果。
    • 数据层:合理设置 InnoDB 缓冲池 与(如仍使用)查询缓存策略。
  • 扩展与高可用:
    • 流量增长时使用 Nginx/HAProxy 做反向代理与 负载均衡;数据库 主从复制 提升读能力与可用性。
  • 监控与告警:
    • 持续监控 CPU/内存/IOPS/连接数/QPS/延迟,对异常阈值(如 P95 突增、连接打满)设置告警。
  • 变更与回滚:
    • 任何参数调整前先备份配置与数据;采用灰度/逐步方式发布,变更后对比基线与日志,必要时快速回滚

附 关键配置示例

  • PHP-FPM 进程池(/etc/php/*/fpm/pool.d/www.conf,示例为 4GB 内存、动态模式)
    • pm = dynamic
    • pm.max_children = 50
    • pm.start_servers = 5
    • pm.min_spare_servers = 5
    • pm.max_spare_servers = 35
    • pm.max_requests = 500
  • Apache KeepAlive 与压缩(httpd.conf 或 apache2.conf 片段)
    • KeepAlive On
    • MaxKeepAliveRequests 100
    • KeepAliveTimeout 5
    • LoadModule deflate_module modules/mod_deflate.so
    • AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
  • MySQL InnoDB 关键项(my.cnf 片段,示例为 16GB 内存)
    • innodb_buffer_pool_size = 12G
    • innodb_log_file_size = 256M
    • innodb_log_buffer_size = 16M
    • innodb_flush_log_at_trx_commit = 1
    • innodb_io_capacity = 2000
    • max_connections = 500
    • slow_query_log = 1
    • long_query_time = 1
  • 提示:以上为起点值,需结合实例规格与压测结果微调,切勿一次性大幅变更生产参数。

0