LNMP在Debian上的性能测试
小樊
45
2025-12-10 20:28:14
LNMP在Debian上的性能测试与调优
一、测试目标与准备
- 明确目标:评估Nginx静态文件、PHP动态页面、MySQL数据库与系统资源的吞吐、延迟与稳定性,形成可复现的基线。
- 基线环境:更新系统并安装组件
- sudo apt update && sudo apt install -y nginx mysql-server php-fpm php-mysql
- 启动与开机自启:sudo systemctl enable --now nginx mysql php-fpm
- 验证连通:创建测试页 /var/www/html/info.php
-
- 访问:http://服务器IP/info.php 确认返回 PHP 信息页
- 监控准备:安装基础监控工具
- sudo apt install -y nmon htop sysstat
- 实时观测:nmon(CPU/内存/磁盘/网络)、htop(进程)、iostat -x 1(磁盘)、ss -s(连接)
二、分层测试步骤与命令
- 静态文件(Nginx)
- 准备大文件:dd if=/dev/zero of=/var/www/html/big.bin bs=1M count=100
- 测试:ab -n 10000 -c 200 http://服务器IP/big.bin
- 动态页面(Nginx + PHP-FPM)
- 测试:ab -n 2000 -c 100 http://服务器IP/info.php
- 长时与并发:wrk -t12 -c400 -d30s http://服务器IP/info.php
- 数据库(MySQL/MariaDB)
- 准备库表:
- mysql -u root -p -e “CREATE DATABASE sbtest;”
- sysbench oltp_read_write --db-driver=mysql --mysql-host=127.0.0.1 --mysql-user=root --mysql-password=YOUR_PASS --mysql-db=sbtest --tables=10 --table-size=100000 prepare
- 运行:sysbench oltp_read_write --db-driver=mysql --mysql-host=127.0.0.1 --mysql-user=root --mysql-password=YOUR_PASS --mysql-db=sbtest --tables=10 --table-size=100000 --threads=8 --time=60 --report-interval=10 run
- 清理:sysbench oltp_read_write --db-driver=mysql --mysql-host=127.0.0.1 --mysql-user=root --mysql-password=YOUR_PASS --mysql-db=sbtest cleanup
- 系统资源与网络
- CPU/内存:sysbench cpu --threads=4 --events=10000 --time=60 run;sysbench memory --threads=4 --time=60 run
- 磁盘I/O:fio --name=randread --ioengine=libaio --rw=randread --bs=4k --size=1G --numjobs=4 --runtime=60 --time_based --filename=/tmp/fio.log
- 网络带宽/延迟:netperf -H 目标IP -t TCP_STREAM;netperf -H 目标IP -t UDP_STREAM
- 说明:上述工具与命令适用于 Debian 上的 LNMP 性能测试,包含 ab、wrk、sysbench、fio、netperf 等常用组合
三、关键指标与结果判读
- 吞吐与并发
- Requests per second(RPS):越高越好;随并发上升出现拐点时,说明瓶颈出现(应用/DB/网络/磁盘)。
- Time per request(平均/90%/95%/99%):P95/P99 能反映长尾延迟,生产更关注。
- 数据库
- TPS/QPS、事务延迟、错误/重试率;慢查询与锁等待是主要优化方向。
- 资源
- CPU:用户态/系统态占比、软硬中断;内存:可用与缓存命中;磁盘:await、svctm、util;网络:带宽占用、丢包/重传。
- 稳定性
- 错误率(5xx/4xx/超时)、连接失败、进程崩溃;长时测试(≥30分钟)更能暴露稳定性问题
四、常见瓶颈与快速优化
- Nginx
- worker_processes auto;worker_rlimit_nofile 65535;sendfile on;keepalive_timeout 65;keepalive_requests 100000;gzip 可按需开启;server_tokens off;tcp_nodelay on。
- PHP-FPM
- 进程模型与池配置:合理设置 pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers;启用 opcache(示例:opcache.enable=1;opcache.memory_consumption=256;opcache.max_accelerated_files=10000;按需开启 JIT)。
- MySQL/MariaDB
- 内存:innodb_buffer_pool_size 设为内存的50%–80%;连接:max_connections 与业务匹配;开启慢查询日志并定期分析;必要时使用 Percona Toolkit 深入诊断。
- Linux 系统
- 文件描述符:ulimit -n 65535;内核网络:net.core.somaxconn 65535;net.ipv4.ip_local_port_range 1024 65535;net.ipv4.tcp_fin_timeout 30;net.core.netdev_max_backlog 65535;如用防火墙/连接跟踪,适当提升 nf_conntrack_max。
- 监控与日志
- 实时:nmon/htop/vmstat/iostat/ss;服务状态:systemctl status nginx/mysql/php-fpm;日志:/var/log/nginx/error.log、/var/log/mysql/error.log、PHP 错误日志(php.ini 中 error_log 指定)
五、测试流程与注意事项
- 流程建议
- 基线:低并发→逐步提升并发(如 50→100→200→400),每档至少5–10分钟;记录 RPS、P95/P99、错误率与资源曲线。
- 专项:静态文件、动态 PHP、数据库分开展开;必要时做“仅数据库”“仅应用”隔离测试。
- 回归:每次调参后重复相同场景,验证是否带来稳定提升。
- 注意事项
- 生产环境避免直接压测;在隔离环境或维护窗口进行。
- 预热:长时测试前先跑1–2分钟暖机,避免冷缓存影响。
- 结果可复现:固定测试文件大小、SQL 语句、并发模型与监控采集间隔。
- 安全:限制压测来源 IP;数据库使用专用测试账号与隔离库;避免泄露真实数据。