nginx 真的支持高并发么

2020-10-22 11:58:17 +08:00
 kokol
号称百万并发,但是我用 ab 压测的时候,发现如果 nginx 从后端服务获取的文件大小很大的话, 响应的延迟就很高
1 、如果请求 nginx,后端就返回几个字节的信息,那么上万并发没啥问题
2 、如果请求 nginx,后端返回 100K 的信息,可能就只有 5000 并发,然后日志就有 upstream timed out 的错误,再继续增加并发的话,基本全是 upstream timed out 错误
3 、如果请求 nginx,后端返回 700K 的信息,可能就只有 500 并发,然后日志也有 upstream timed out 的错误

4 、如果 nginx 配置文件里添加了 proxy_cache 缓存的话,并发会高点,但是也只有个几千并发,而且查看日志即使缓存 HIT 命中了,响应延迟仍然很高,竟然有好几秒,无法理解,从缓存中获取数据也要这么长时间,而且并发越高,响应延迟就越高,upstream timed out 也会很多,这都没有去后端请求了,直接拿的 nginx 缓存都这么慢

以下是我 nginx 的部分配置文件:
worker_processes auto;
worker_rlimit_nofile 65536;

events {
worker_connections 45000;
accept_mutex off;
multi_accept on;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
resolver 8.8.8.8;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$proxy_host" "$upstream_addr" '
'"$upstream_response_time" "$request_time" "$upstream_cache_status"';

access_log logs/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;

send_timeout 10s;
keepalive_timeout 65;
keepalive_requests 10000;

#gzip on;
proxy_cache_path /usr/local/openresty/nginx/cache levels=1:2 keys_zone=gcdn:10m max_size=100g inactive=10m use_temp_path=off;

upstream {
xxxxx
keepalive 1000;
}
server{

proxy_pass xxxxxx;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $upstream_host;
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 4 1M;
proxy_busy_buffers_size 2M;
}

linux 系统内核的修改参考的这篇文章:
https://www.jb51.net/article/157985.htm


nginx 的并发跟后端返回数据量的大小有关么,大家有做过这方面的测试么,如果后端返回的数据基本在几百 K 到 1M 的话,怎样提高 nginx 的并发
7553 次点击
所在节点    NGINX
37 条回复
wjhjd163
2020-10-22 12:01:57 +08:00
nginx 缓存爆了的情况下会写硬盘
不如你看看压测的时候硬盘读写如何?
superrichman
2020-10-22 12:06:53 +08:00
不走 nginx 你的服务并发是多少?
sadfQED2
2020-10-22 12:09:22 +08:00
我大学老师曾经说过,代码编译通不过先检查你代码,编译器没错。

我觉得你这个也差不多
hakono
2020-10-22 12:13:48 +08:00
upstream timed out

我怎么感觉是你上游的服务器的问题?

上有服务器压测 100K/700K 的并发是多少?
nightwitch
2020-10-22 12:26:54 +08:00
proxy_pass xxxxxx;

先对 proxy_pass 的地址来个压测看看能到多少?
Lax
2020-10-22 12:28:00 +08:00
ab 和 nginx 是同一台服务器吗?
测试时的网络带宽有没有跑满?
测试时 nginx/后端 /ab 所在机器的 cpu 利用率达到了多少? io 利用率呢?
eason1874
2020-10-22 12:38:08 +08:00
Nginx 高并发是经过验证的,不少 CDN 厂商都在用就是例证。

缓存命中还是慢的话,我首先会怀疑硬盘 IO 然后才是其他,先去掉后端,直接用服务器本地文件压测,逐一排除。
bruceliang
2020-10-22 12:49:07 +08:00
内存搞大点
virusdefender
2020-10-22 12:54:47 +08:00
看上去你的 upstream 撑不住了
xuanbg
2020-10-22 13:06:08 +08:00
upstream {
xxxxx
keepalive 1000;
}

就这???不多来几台机器做负载均衡么?譬如:
upstream xxxxx {
ip_hash;
server x.y.z.1 max_fails=2 fail_timeout=60s;
server x.y.z.2 max_fails=2 fail_timeout=60s;
……
}
misaka19000
2020-10-22 13:18:11 +08:00
先把你测试的机器的配置报出来,这是最基本的
ctOS1H
2020-10-22 13:57:14 +08:00
先测 upstream 吧
lazyfighter
2020-10-22 14:07:09 +08:00
这不是拉不出屎来怪茅坑吗~
est
2020-10-22 14:11:37 +08:00
1M 的文件,怕不是楼主 1M 出口带宽爆了
Jooooooooo
2020-10-22 15:50:10 +08:00
遇到这种问题, 首先怀疑被大规模使用东西的问题肯定不行

从别的地方找原因, 都排除了再看
polymerdg
2020-10-22 15:55:14 +08:00
700K * 500
340 多 MB/S
帶寬夠用?
kiddingU
2020-10-22 15:56:28 +08:00
你的 upstream 能承受多大并发?
kokol
2020-10-22 16:03:41 +08:00
感谢大家的回答, 我目前用的 8 核 8G 的配置,用的云上的虚拟机来测试,都是私有子网来测试,硬盘就配了几百 G,估计就是因硬盘 IO 的问题,我加大配置,提升 IO 再来测试一下看看
newmlp
2020-10-22 16:07:51 +08:00
地球真的是圆的吗
lvzhiqiang
2020-10-22 16:08:50 +08:00
nginx 更多的时候作为中间人,中间人转发请求效率能到上万,但是这个请求真正处理还是交给上游服务器去做,上游服务器能否处理过来才决定你网站性能。 我们说 nginx 能到百万并发,是有前提的。。。IO/网络带宽 /CPU

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/717398

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX