飞腾腾云S2500 Nginx单机环回测试性能调优方法

 【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。 点击这里开始你的技术升级之旅吧

image.png​​

 本文分享至飞腾开发者平台《飞腾腾云S2500 Nginx单机环回测试性能调优方法》

1 背景介绍

1.1 Nginx 简介

  Nginx是一个高性能HTTP和反向代理服务器,由俄罗斯程序员伊戈尔·赛索耶夫开发。Nginx 可以在大多数UNIX Linux OS 上编译运行,并有Windows移植版。

  Nginx特点是占有内存少,并发能力强,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。在Linux操作系统下,Nginx使用epoll事件模型使得在Linux操作系统下效率相当高。

  Nginx简介的详细内容可参考:https://baike.baidu.com/item/nginx/3817705?fr=aladdin

1.2 未优化前性能

  测试环境:飞腾腾云S2500 2路服务器

  测试方法:在飞腾腾云S2500环回访问本地nginx服务

  未优化前的nginx(日志写入硬盘)性能:16-17w req/s。

  未优化前的nginx(日志写入内存)性能:21-23w req/s。

  未优化前的nginx(不写日志情况)性能:24-25w req/s。

2 问题分析

2.1 性能影响因素分析

image.png

2.2 主要的优化方向

image.png

3 修改内核协议栈参数

3.1 优化措施

  通过修改一些内核参数:

image.png

  主要手段:通过调整以上参数的大小,以此来提高tcp连接时的带宽和时延,从而提升服务性能。

调优项目 作用
net.ipv4.tcp_mem 确定 TCP 栈应该如何反映内存使用
net.ipv4.tcp_rmem TCP接收缓冲区大小
net.ipv4.tcp_wmem TCP发送缓冲区大小
net.core.somamaxconn 表示socket监听的backlog(监听队列)上限
net.ipv4.tcp_syn_retries 发起TCP SYN连接超时重传的次数
net.ipv4.tcp_max_orphans 所能处理不属于任何进程的TCPsockets最大数

3.2 测试结论

  结论:经测试验证,以上优化措施均未见明显的性能提升,距离目标300000 req/s相距甚远。

4 Nginx主要的优化工作

4.1 调优工作

  Nginx 调优项目:

image.png

  以上调优项目对应的调试手段见下表所示:

nginx 参数 作用 建议
log 记录nginx 日志 关闭
nginx worker processes nginx 进程数 根据打开日志与否调整processes大小,日志开启,建议设为16进程,日志关闭,则越大越好。
tcp_nopush_on 避免网络拥塞 打开
tcp_nodelay_off 避免网络拥塞 tcp_nodelay off
sendfile on 文件高效传输模式 打开,并配合tcp_nopush使用
open file cache 调整文件指定缓存功能的开关 打开,并合理指定大小,建议max至少102400
reset time out conn nginx关闭不响应的客户端连接 开启此功能

  以上的调优手段,着重讲下sendfile 与open file cache,此两项的配置对性能提升最为明显:

  1、sendfile:

  sendfile实际上是Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用sendfile这个系统调用。
  1)先来看一下不用 sendfile的传统网络传输过程:

image.png

  上面4个步骤有4次上下文切换,有4次拷贝,我们发现如果能减少切换次数和拷贝次数将会有效提升性能。

  2)使用sendfile(socket,file, len)的IO过程:

image.png

  sendFile 整个过程只有两次上下文切换和两次 DMA 拷贝,很重要的一点是这里完全不需要CPU 来进行拷贝了,所以才叫做零拷贝,这里的拷贝指的就是操作系统的层面。
  以上关于sendfile的内容可以参考:https://blog.csdn.net/YL3126/article/details/117468640

  2、open_file_cache max=102400 inactive=20s:

  Nginx 的 open_file_cache 相关配置可以缓存静态文件的元信息,在这些静态文件被频繁访问时可以显著提升性能。缓存了文件句柄就意味着不用每次都close一个文件再open一个文件,减少了系统调用的操作。
  上表中的调优手段,可以通过更改Nginx的配置文件nginx.conf 来实现。

4.2 测试记录

4.2.1 关闭 Ngnix日志功能测试

  1、worker_processes==16

  绑核测试,在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

taskset -c 32-63 weighttp -n 3000000 -c 100 -t 50 -k <http://11.1.1.1:80>
测试次数 结果(req/s)
1 285713
2 282235
3 286919
4 285477
5 289397
平均值 285948

  不绑核测试,在飞腾腾云S2500 服务器本地输入命令,该命令如下所示:

weighttp -n 3000000 -c 100 -t 50 -k <http://11.1.1.1:80>
测试次数 结果(req/s)
1 248677
2 279867
3 290159
4 270982
5 283741
平均值 274687.4

  2、worker_processes==22

  绑核测试:在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

taskset -c 32-63 weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数 结果(req/s)
1 354322
2 343963
3 346928
4 349629
5 342861
平均值 347540

  不绑核测试:在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数 结果(req/s)
1 300276
2 285604
3 219688
4 283422
5 295507
平均值 276899
4.2.2 打开Ngnix日志功能测试

4.2.2.1 日志写入内存

  1、worker_processes==16

  绑核测试,在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

taskset -c 32-63 weighttp -n 3000000 -c 100 -t 50 -k <http://11.1.1.1:80>
测试次数 结果(req/s)
1 274568
2 278908
3 283300
4 274235
5 277759
平均值 277754

  不绑核测试,在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数 结果(req/s)
1 277621
2 258456
3 260107
4 252588
5 253443
平均值 260443

  2、worker_processes==22

  绑核测试,在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

taskset -c 32-63 weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数 结果(req/s)
1 334128
2 323585
3 328500
4 329572
5 329261
平均值 329009

  不绑核测试,在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数 结果(req/s)
1 282196
2 300277
3 259707
4 198777
5 247318
平均值 257655

4.2.2.2 日志写入硬盘

  性能测试时,通过perf查看热点函数,在worker_processes大于16时,随worker_processes不断增大,热点函数”osq_lock”占比逐渐增大,吞吐量基本没有提升,每个进程还都满负载,多余的CPU性能都被osq_lock给消耗了。
  综上,日志写在硬盘的情况下,选择16进程,性能最佳。

  测试记录:
  绑核测试,在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

taskset -c 32-63 weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
次数 结果(req/s)
1 266764
2 269377
3 264932
4 267018
5 268114
平均值 267241

  不绑核测试,在飞腾腾云S2500服务器本地输入命令,该命令如下所示:

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数 结果(req/s)
1 240303
2 254572
3 266540
4 229249
5 242094
平均值 246551

5 结论

  经过优化后的具体测试结果见下表:

不写日志
绑核 不绑核
16 processes 285948 274687
22 processes 347540 276899
写日志(内存)
绑核 不绑核
16 processes 277754 260443
22 processes 329009 257655
写日志(硬盘)
绑核 不绑核
16 processes 267241 246551

  优化前后的(最优状态下)性能对比图:

image.png

  综上所述:

  1、优化前后对比,性能提升近50%。

  2、nginx不写日志时,性能明显高于写日志时,且不写日志时,随着进程数目增加,性能会越高。日志写入内存时,性能高于写入硬盘。同等条件下,weighttp绑核的性能要明显高于不绑核的性能,且weighttp不绑核时的性能波动很大。

推荐阅读

欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料

如开发者在使用飞腾产品有任何问题可通过在线工单联系我们


版权所有。飞腾信息技术有限公司 2023。保留所有权利。

未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。

商标声明

Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。

本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。

猜你喜欢

转载自blog.csdn.net/developersupport/article/details/140529468