高流量下EC2与RDS实例资源占用低但网站仍卡顿
排查方向与解决方案
1. Nginx 连接数与进程配置瓶颈
- 检查
nginx.conf里的worker_processes(建议设为CPU核心数)和worker_connections(建议设为系统最大文件描述符的一半,用ulimit -n查看系统文件描述符上限),高流量下连接数不足会导致请求排队。 - 用
ss -tulnp | grep nginx查看连接状态,如果出现大量TIME_WAIT或SYN_RECV,调整keepalive_timeout、tcp_fin_timeout等TCP参数,比如把keepalive_timeout设为65s,tcp_fin_timeout设为30s。
2. PHP-FPM 进程与性能问题
- 查看PHP-FPM配置(比如
www.conf)的进程管理模式:如果是动态模式,检查pm.max_children、pm.start_servers等参数,高流量下pm.max_children太小会导致请求等待空闲PHP进程,即使EC2资源没跑满也会拖慢响应。 - 开启PHP-FPM慢日志:在配置里设置
slowlog = /var/log/php-fpm/slow.log和request_slowlog_timeout = 2s,定位执行超时的脚本,这类脚本在高流量下会累积拖慢整体Web响应。 - 检查PHP的
memory_limit,如果脚本内存占用接近上限,会触发频繁的内存回收或进程重启,间接导致延迟。
3. EC2 微型实例的带宽限制
- EC2微型实例(如t2.micro/t3.micro)是突发带宽模式,高流量时段可能耗尽带宽额度。通过CloudWatch查看
NetworkIn/NetworkOut指标,或用iftop实时监控带宽,若带宽跑满,即使CPU内存空闲,请求也会因数据传输延迟变慢。
4. Nginx 与 PHP-FPM 的通信优化
- 优先用Unix套接字代替TCP连接PHP-FPM,Unix套接字性能更高,注意设置正确的权限(比如
listen.mode = 0660);如果用TCP,检查本地回环的延迟(用ping 127.0.0.1或mtr 127.0.0.1),高流量下微小延迟也会被放大。 - 调整Nginx的FastCGI超时参数:
fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout,避免因超时中断请求,同时防止慢请求长期占用连接资源。
5. 缓存机制缺失
- 开启Nginx静态资源缓存:对CSS/JS/图片等静态文件设置
expires头部,让浏览器缓存,减少Nginx和PHP的重复处理。 - 启用PHP OPcache:在
php.ini里开启opcache.enable=1,缓存编译后的PHP脚本,避免重复解析编译,提升PHP执行速度。 - 检查应用层是否用了缓存(如Redis/Memcached),高流量下直接命中缓存能大幅减少PHP和数据库的请求量。
6. 系统内核参数调整
- 修改TCP相关内核参数,缓解高流量下的连接压力:
net.ipv4.tcp_tw_reuse=1:复用TIME_WAIT状态的连接net.core.somaxconn=1024:增大监听队列上限net.ipv4.tcp_max_tw_buckets=5000:减少TIME_WAIT队列长度
修改后执行sysctl -p生效。
内容的提问来源于stack exchange,提问作者wjNoh
相关产品推荐
相关产品推荐

