- 首页 >
- 问答 >
-
云计算 >
- Linux LAMP服务器如何进行性能调优
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 + Grafana 或 PMM 做可视化与阈值告警,形成“指标—日志—链路”的闭环。
- 代码与数据库剖析:用 Xdebug/Blackfire 定位 PHP 热点函数;用 EXPLAIN 分析慢 SQL 执行计划,优先处理高成本查询。
二 Linux 内核与文件系统优化
- 文件描述符与进程限制:提升 ulimit -n(如 65535),为服务账户设置合理的 nofile 上限,避免“too many open files”。
- 网络参数(/etc/sysctl.conf,按带宽与并发适度调整):
- 连接复用与回收:net.ipv4.tcp_tw_reuse=1、net.ipv4.tcp_fin_timeout=30
- 半开连接与队列:net.ipv4.tcp_max_syn_backlog=1024、net.core.somaxconn=1024
- 端口范围:net.ipv4.ip_local_port_range=“1024 65535”
- 生效命令:sysctl -p
- 内存与脏页:降低交换倾向 vm.swappiness=10;控制脏页刷写 vm.dirty_background_ratio=5、vm.dirty_ratio=10,减少抖动。
- 存储与挂载:优先 SSD;文件系统用 EXT4/XFS;挂载选项加 noatime 减少元数据写入。
三 Apache 与 PHP 调优
- 选择并发模型:
- Prefork:进程隔离、稳定,适合 mod_php 与有阻塞扩展的场景。
- Worker/Event:多进程+多线程/事件驱动,适合高并发、I/O 密集型,通常配合 PHP-FPM。
- 关键参数范式:
- 启用长连接:KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 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_size 与 innodb_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
- 提示:以上为起点值,需结合实例规格与压测结果微调,切勿一次性大幅变更生产参数。