[TOC]node
单个千兆网卡的机器,去压测 nginx 的性能,会存在带宽的瓶颈,这个时候观察 CPU 和带宽,发现 CPU 没有跑满,si 也没有满,可是网卡带宽流量已经达到了瓶颈,对于千兆网卡这个说的小 b,而不是大 B;而后理论上千兆网卡的上限是 128MB/s,可是因为种种因素,通常很难达到 128,可是通常而言到了 110MB/s 以上就已是瓶颈了。linux
千兆网卡基础上,网卡会存在瓶颈,在这个基础上Nginx 当作 Web Server 的话,针对 http:nginx
Nginx 直接 return 200 和 return 302,QPS 相差不少(千兆网卡基础上)git
当压测端的网卡有 4 个千兆网卡了以后,施压端的网卡流量就到瓶颈了,这个时候就须要调整施压端了。github
4 个网卡绑定后,压测短链接的时候,发现 si 已经到 100%,而且是固定的几个 CPU,这个就说明网卡绑定重复了。web
单机 24 核下,单千兆网卡的场景下,网卡先出现瓶颈; 4 个千兆网卡的场景下,CPU si 软中断先出现瓶颈。bash
压测时候,要关注大包、小包的不一样处理,对于小包,CPU 消耗会更多,由于软中断问题、解包头、校验包数据等层面的问题。 sar 观察数据的时候,通常而言,rxpck/s 和 txpck/s 只须要关注数据而不会存在瓶颈,这个的瓶颈会创建在 CPU 上;而须要关注的是 rxkB/s 和 txkB/s ,这个决定了网卡流量带宽的上限。不只仅是要观察服务端,还要看客户端是否有瓶颈(CPU、网卡带宽)、错误状况等微信
正常而言,nginx 的各个 worker 进程的 CPU 消耗应该都要比较均匀,若是相差 10% 以上,甚至 20% 以上,那么就必定存在 CPU 消耗不均的问题。nginx 目前的版本会使得 CPU 不均,由于关闭了 accept_mutex,正常的话,各个 worker 进程应该都是要差很少的 CPU 消耗,若是开启accept_mutex on;会均匀到前面几个 nginx worker 进程。并发
最优的姿式是开启 reuseport,可是这个须要注意要和 dynamic upstream 一块儿使用,不然若是出现频繁 reload 则会致使出现大量 RST。socket
压测的时候,要找到一个性能拐点;若是一上来就是瓶颈了,那么还须要往回调,直到找到一个最佳的性能拐点。
长链接的时候,若是 wrk 给的线程数、并发数太大,反而会使得 Nginx 只有 1 个 worker 进程的时候的性能下降; 短进程的时候,wrk 端的系统参数 net.ipv4.tcp_tw_recycle 要设置为 1,让端口复用,不然会出现一些链接错误
所以一个过程就是会将施压端的压力(线程数、并发数)会减小、增大,从而观察 Nginx 服务端的数据,而后获得最佳性能数据
wr 压力上不去? 要想为啥上不去? CPU遇到瓶颈了,仍是内存遇到瓶颈了? 若是cpu的话,那么怎么给更多CPU?固然的线程数。可是线程数也要和施压方的CPU核心数匹配。
top ,观察 CPU 消耗状况,同时也要观察每一个 CPU 核数的状况,而且关注 si 软中断的数据,si 到了 100% 就有问题了
sar -n DEV 1 100 |grep em1
观察网卡带宽状况,看网卡带宽是否到了瓶颈
而后能够 ifconfig 查看是否有丢包之类的。
netstat -s |grep active
6262441249 active connections openings
复制代码
经过 netstat -s |grep active
获取当前活跃的链接,而后作差值。
5W 短链接的 QPS, 若是还有upstream是短链接,那么每秒建连数应该是10W左右
ss -lnt
ss -lnt |grep -E ":6001|:6002"
State Recv-Q Send-Q Local Address:Port Peer Address:Port
复制代码
当套接字处于监听状态(Listening)时,
链接队列若是过小,那么须要调整系统和 nginx 的配置
相关基础指标:
Requests per second (RPS) : nginx 每秒处理的请求数(也就是: QPS)
RPS for HTTP Requests: nginx 每秒处理的 http 请求数
RPS for HTTPS Requests (SSL/TLS transactions per second )(TPS) : nginx 每秒处理的 https 请求数
要关注响应数据在 0 - 1 - 10 - 100 KB 的不一样状况的表现
Connections per Second (CPS) : nginx 每秒处理的新建链接请求数
Throughput:吞吐量,反应 nginx 能够处理的数据量的大小的能力
latency: 延迟和延迟分布
其余关注点:
关注 CPU 核数从 1 - n 下,nginx 性能的表现
关注 nginx 的角色是 webserver 或者 反向代理的不一样表现
链接数,有时候也会被称为并发数,指的是同时在服务中的请求数。也就是那些已经发送请求(Request),可是尚未收完应答(Response)的请求数量。
Nginx 必需要调整的参数:
worker_processes auto;
worker_rlimit_nofile 10240;
worker_connections 10240;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 300s;
keepalive_requests 1000000;
复制代码
建议调整的参数:
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
复制代码
通常,设置 nf_conntrack_max 为 200w, nf_conntrack_buckets 为 1/4 或者 1/2 倍 nf_conntrack_max,防止桶太大致使性能影响。
[wdb@BJZW-K8SM-ZW-1-23-25.meitu-inc.com ingress]$ cat /proc/sys/net/netfilter/nf_conntrack_buckets
524288
[wdb@BJZW-K8SM-ZW-1-23-25.meitu-inc.com ingress]$ cat /proc/sys/net/netfilter/nf_conntrack_max
2097152
复制代码
net.core.somaxconn
net.core.netdev_max_backlog
echo 32768 > /proc/sys/net/core/somaxconn
echo 819200 > /proc/sys/net/ipv4/tcp_max_syn_backlog
复制代码
sys.fs.file-max
nofile
/etc/security/limits.conf
文件net.ipv4.ip_local_port_range
对压测端而言,若是是短连接
单机 20-24 核下,单千兆网卡的场景下,网卡先出现瓶颈; 4 个千兆网卡的场景下,CPU si 软中断先出现瓶颈。
4 个网卡绑定后,压测短链接的时候,发现 si 已经到 100%,而且是固定的几个 CPU,这个就说明网卡绑定重复了。网卡从新绑定没有重复以后,si 有改善,总体性能也稍有提升
CPU idle 为 0 不会有问题,只有 si 为 100% 才会有问题
【"欢迎关注个人微信公众号:Linux 服务端系统研发,后面会大力经过微信公众号发送优质文章"】