【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《飞腾腾云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 性能影响因素分析
2.2 主要的优化方向
3 修改内核协议栈参数
3.1 优化措施
通过修改一些内核参数:
主要手段:通过调整以上参数的大小,以此来提高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 调优项目:
以上调优项目对应的调试手段见下表所示:
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的传统网络传输过程:
上面4个步骤有4次上下文切换,有4次拷贝,我们发现如果能减少切换次数和拷贝次数将会有效提升性能。
2)使用sendfile(socket,file, len)的IO过程:
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 |
优化前后的(最优状态下)性能对比图:
综上所述:
1、优化前后对比,性能提升近50%。
2、nginx不写日志时,性能明显高于写日志时,且不写日志时,随着进程数目增加,性能会越高。日志写入内存时,性能高于写入硬盘。同等条件下,weighttp绑核的性能要明显高于不绑核的性能,且weighttp不绑核时的性能波动很大。
推荐阅读
欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料
如开发者在使用飞腾产品有任何问题可通过在线工单联系我们
版权所有。飞腾信息技术有限公司 2023。保留所有权利。
未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。
商标声明
Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。