1. 核心限制因素
(1)内存资源
系统占用:1gb内存中,操作系统和其他进程需占用约300-500mb,剩余给nginx的可能仅500mb左右。
连接内存开销:
- 空闲连接:约1-2kb/连接(仅存储基础信息)。
- 活跃请求:需额外缓冲区(如请求头、响应体),可能增至10-50kb/连接。
(2)nginx配置
worker_processes
:通常设为cpu核心数(1gb电脑多为1-2核)。worker_connections
:默认512-1024,可手动调高(需配合内存)。- 缓冲区设置:
client_body_buffer_size
、fastcgi_buffers
等参数影响内存占用。
(3)操作系统限制
- 文件描述符数:linux默认约1024,需通过
ulimit -n 65536
调高。 - 端口范围:需确保可用端口充足(
net.ipv4.ip_local_port_range
)。
2. 并发能力估算
(1)静态文件服务(无ssl)
内存计算:
- 假设每连接占10kb,500mb内存可支持约 5,000并发。
- 若优化缓冲区(如
client_body_buffer_size 4k
),可能提升至 8,000-10,000并发。
实际瓶颈:
- 可能因磁盘i/o或cpu饱和(如高并发小文件请求)提前达到极限。
(2)反向代理/动态内容
内存计算:
- 每连接需额外处理请求头、响应缓存,约20-50kb/连接。
- 500mb内存支持约 2,000-5,000并发。
后端影响:
- 若代理到慢速后端(如php-fpm),并发能力受限于后端处理速度。
(3)ssl加密场景
性能损耗:
- ssl握手需额外计算(cpu)和内存(会话缓存)。
- 并发能力可能降至 1,000-3,000(依赖cpu型号和ssl配置)。
3. 优化建议
调整nginx配置:
worker_processes auto; # 自动匹配cpu核心数 events { worker_connections 4096; # 根据内存调整(如设为4k) use epoll; # linux高性能模式 multi_accept on; # 同时接受多个新连接 } http { client_body_buffer_size 4k; client_max_body_size 8m; keepalive_timeout 15; # 保持连接减少重建开销 }
系统优化:
- 调高文件描述符限制:
echo "ulimit -n 65536" >> /etc/profile
。 - 关闭不必要的后台服务,释放内存。
场景适配:
- 静态文件:启用
gzip
压缩和缓存头(cache-control
)。 - 动态内容:使用连接池(如数据库、redis)减少阻塞。
4. 压力测试方法
使用工具模拟并发请求,观察内存和连接数:
# 使用 ab 测试静态文件 ab -n 100000 -c 5000 http://localhost/static.jpg # 使用 wrk 测试动态接口 wrk -t4 -c1000 -d30s http://localhost/api # 监控内存和nginx状态 watch -n1 "free -m && nginx -t"
总结
在1gb内存环境下:
- 静态文件:优化后可能支持 5,000-10,000并发。
- 动态内容/ssl:约 1,000-5,000并发。
- 实际极限:需通过测试确定,通常内存耗尽前可能因cpu或i/o瓶颈提前限制性能。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论