【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《飞腾腾云S2500基于LVS负载均衡模式下的Nginx性能方案》
1 背景
1.1 Nginx简介
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx相较于Apache/lighttpd具有占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。在Linux操作系统下,Nginx使用epoll事件模型,得益于此,Nginx在Linux操作系统下效率相当高。
Nginx简介部分可以参考百度百科:https://baike.baidu.com/item/nginx/3817705?fr=aladdin
1.2 现状
未调优前nginx性能
服务器 | nginx性能(req/s) |
---|---|
飞腾腾云S2500 2路(单路单网卡) | 30w+ |
1.3 本文意义
本文主要重点介绍LVS,通过搭建LVS,实现代理以及负载均衡,发挥多路并行优势,提升Nginx综合服务性能。同时,这一模型的搭建对于其他的项目,也具有借鉴意义。
2 方案实施
2.1 技术背景
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
以上关于LVS的详细介绍可以参考文章:https://www.51cto.com/article/601351.html
相比于Nginx只能用于7层负载均衡,LVS就比较强大了,能在4层做负载均衡,而且性能和稳定性上LVS也比较占优。
2.2 本方案思路
受限于单核性能与跨路带宽等诸多因素,经过多次测试,飞腾腾云S2500单路单网卡条件下,Nginx性能的极限在30w req/s左右,想要继续提升Nginx综合性能,必须发挥多路多网卡并行的优势,即:采用多路多网卡策略,通过负载均衡,充分发挥多核并行优势,达到性能叠加的效果,从而使总体性能提升。以飞腾腾云S2500 2路设备为例大概的示意图:
整个方案可以概括为:
FT-2000+/64 与飞腾腾云S2500 2路搭建一个LVS,FT-2000+/64充当调度器的角色,可以将X86发来的http请求流量做负载均衡,平均分配给飞腾腾云S2500的每一路。然后飞腾腾云S2500的每一路各起一个nginx服务,监听一个端口,FT-2000+/64调度器输入的http请求,分别处理,然后原路返回(此过程飞腾腾云S2500需要配置静态路由).
以上图飞腾腾云S2500 2路设备为例,每路CPU下外设一张网卡,另外每路CPU起一个nginx服务,监听不同的端口和IP。
X86服务器起发起请求。即:
12.1.1.2 向12.1.1.1 发起http请求,请求报文:pkt1: 12.1.1.2-\>12.1.1.1
14.1.1.2 向14.1.1.1 发起http请求,请求报文:pkt2: 14.1.1.2-\>14.1.1.1
http请求流量来了以后,先经过FT-2000+/64(Load Balnacer)通过该服务器进行分流,通过负载均衡的策略,将流量均分成2份(本过程同时做NAT)。报文做完NAT以后:测试报文变成:
pkt1:12.1.1.2-\>13.1.1.2
pkt2:14.1.1.2-\>11.1.1.2
请求报文分别进入每一路下的网卡(即NIC1、NIC2),然后经过每一路下的nginx服务的响应,再返回响应。
2.3 主要实施步骤
2.3.1 LVS环境搭建
在FT-2000+/64上(调度器),第一步,安装ipvadm;第二步,关闭ICMP重定向;第三步,打开路由转发;第四步,清理ipvsadm tables;第五步,添加load banlance 服务器和real server;第六步,启动ipvsadm服务,查看此时ipvsadm状态,具体地,可以如下图所示:
以上两个状态说明ipvsadm服务正常,配置也正确。在飞腾腾云S2500上,配置路由,操作如下所示:
route add -net 14.1.1.0 netmask 255.255.255.0 gw 11.1.1.1
route add -net 12.1.1.0 netmask 255.255.255.0 gw 13.1.1.1
2.3.2 具体步骤
本小节步骤,均是按照如上图飞腾腾云S2500 2路的配置,进行搭建:
1)在飞腾腾云S2500上起原来固有的nginx
systemctl start nginx.service
这个nginx 会去读默认路径下的配置文件:/etc/nginx/nginx.conf
该通过配置该配置文件通里面的相关参数,实现nginx绑核处理、日志关闭打开、绑核数量限制、监听端口设置、sendfile启用等,具体修改如下表所示:
修改项目 | 作用 | 修改方法 |
---|---|---|
worker_processes | Nginx的绑核数量 | 修改worker_processes 的数量,本文设置为28 |
worker_cpu_affinity | 绑核限制 | 修改worker_cpu_affinity 的掩码,绑定在0-27核 |
日志 | 记录访问和错误信息 | 将log写入dev/null |
sendfile | 零拷贝 | 置为on |
open_file_cache max | 打开文件描述符的个数 | 2048000 |
Listen | Nginx 监听的端口号 | 80 default_sever |
2)在飞腾腾云S2500上,直接copy 原来安装好的Nginx可执行文件(如果nginx是yum安装的话,可执行文件在/usr/bin/目录下,可以用命令 which nginx查看具体在哪个目录下),找到nginx可执行文件存放路径以后,将nginx可执行文件copy到一个指定的目录。本文是拷贝到了/root/目录下,然后在/root/目录下,放置一个nginx.conf ,这nginx.conf
配置要求如下表所示:
修改项目 | 作用 | 修改方法 |
---|---|---|
worker_processes | Nginx的绑核数量 | 修改worker_processes 的数量,本文设置为28 |
worker_cpu_affinity | 绑核限制 | 修改worker_cpu_affinity 的掩码,绑定在64-91核 |
日志 | 记录访问和错误信息 | 将log写入dev/null |
sendfile | 零拷贝 | 置为on |
open_file_cache max | 打开文件描述符的个数 | 2048000 |
listen | Nginx 监听的端口号 | 10000 default_sever |
3)在飞腾腾云S2500上,以上准备工作就绪以后,启动第二个nginx:
taskset -c 64-95 /root/mxb/nginx –c /root/mxb/nginx.conf
4)在飞腾腾云S2500上, ,进入目录/usr/share/nginx/html下,执行以下命令:
cp -rf index.html index1.html
同时执行:
cp –rf /etc/nginx/mimi.type /root/mxb/
5)中断亲和性设置
在飞腾腾云S2500上 :
网卡1(cpu0 下的网卡)中断绑定到0-7。
./set_irq_affinity 0-7 ens3f1
网卡2(cpu1 下的网卡)中断绑定到64-71。
./set_irq_affinity 64-71 enP1s8f0
FT-2000+/64上:
在FT-2000+/64上,通过lspci可以看出X710网卡插在NUMA6上,Mallanoxcx4网卡插在NUMA0上,因此在FT-2000+/64上,通过如下方式进行网卡中断绑核:
./set_irq_affinity 0-7 enp33s0f0
./set_irq_affinity 0-7 enp33s0f1
./set_irq_affinity 48-55 enp81s0f0
./set_irq_affinity 48-55 enp81s0f1
6)以上飞腾腾云S2500作为Nginx服务端的环境就准备好了,X86作为客户端,在X86服务器上运行以下脚本test.sh:
taskset -c 0-47 weighttp -n 3000000 -c 4096 -t 247 -k http://14.1.1.1:10000 > 123.test &
taskset -c 48-95 weighttp -n 3000000 -c 4096 -t 247 -k http://12.1.1.1:80 > 124.test &
以上脚本通过taskset邦核,分别启动两个weighttp,发起http请求,并将测试结果分别打印至123.test和124.test文件中。
本文使用的X86服务器是96个核,读者可根据实际使用的X86服务器的配置情况,合理分配核给两个weighttp服务,如果X86性能足够优越,可以直接并行执行两个weighttp,无需通过taskset进行邦核。
3 测试情况
根据第2章的方案进行环境搭建,并进行多次测试,取平均值
测试时飞腾腾云S2500的cpu负载情况:
测试结果
项目 | 性能(req/s) |
---|---|
weighttp1 :80 | 33.2W+ |
weighttp2 10000 | 32.7W+ |
累加 | 65.9W |
测试结论:相对于初始的性能,已经提升100%以上。这就给飞腾腾云S2500多路设备(4路或者8路)提供了一种可能,就是通过多路并发,每路外设一张甚至多张网卡,通过搭建LVS负载均衡服务器的方法,将流量负载均衡至每一路上的多个网卡中,充分发挥多路网卡并行优势,通过性能叠加,最终提升Nginx服务的综合服务性能。
推荐阅读
欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料
如开发者在使用飞腾产品有任何问题可通过在线工单联系我们
版权所有。飞腾信息技术有限公司 2023。保留所有权利。
未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。
商标声明
Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。