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

image.png

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

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_rmemTCP接收缓冲区大小
net.ipv4.tcp_wmemTCP发送缓冲区大小
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 processesnginx 进程数根据打开日志与否调整processes大小,日志开启,建议设为16进程,日志关闭,则越大越好。
tcp_nopush_on避免网络拥塞打开
tcp_nodelay_off避免网络拥塞tcp_nodelay off
sendfile on文件高效传输模式打开,并配合tcp_nopush使用
open file cache调整文件指定缓存功能的开关打开,并合理指定大小,建议max至少102400
reset time out connnginx关闭不响应的客户端连接开启此功能

  以上的调优手段,着重讲下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)
1285713
2282235
3286919
4285477
5289397
平均值285948

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

weighttp -n 3000000 -c 100 -t 50 -k <http://11.1.1.1:80>
测试次数结果(req/s)
1248677
2279867
3290159
4270982
5283741
平均值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)
1354322
2343963
3346928
4349629
5342861
平均值347540

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

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数结果(req/s)
1300276
2285604
3219688
4283422
5295507
平均值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)
1274568
2278908
3283300
4274235
5277759
平均值277754

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

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数结果(req/s)
1277621
2258456
3260107
4252588
5253443
平均值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)
1334128
2323585
3328500
4329572
5329261
平均值329009

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

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数结果(req/s)
1282196
2300277
3259707
4198777
5247318
平均值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)
1266764
2269377
3264932
4267018
5268114
平均值267241

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

weighttp -n 3000000 -c 100 -t 50 -k http://11.1.1.1:80
测试次数结果(req/s)
1240303
2254572
3266540
4229249
5242094
平均值246551

5 结论

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

不写日志
绑核不绑核
16 processes285948274687
22 processes347540276899
写日志(内存)
绑核不绑核
16 processes277754260443
22 processes329009257655
写日志(硬盘)
绑核不绑核
16 processes267241246551

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

image.png

  综上所述:

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

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


推荐阅读

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

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



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

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

商标声明

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

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

注意

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

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

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


飞腾开发者
6 声望3 粉丝

飞腾开发者技术小助手,定期分享飞腾技术文档,助力开发者打怪升级。更多材料获取:[链接]