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

image.png

本文分享至飞腾开发者平台《飞腾腾云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模式。

image.png

  以上关于LVS的详细介绍可以参考文章:https://www.51cto.com/article/601351.html

  相比于Nginx只能用于7层负载均衡,LVS就比较强大了,能在4层做负载均衡,而且性能和稳定性上LVS也比较占优。

2.2 本方案思路

  受限于单核性能与跨路带宽等诸多因素,经过多次测试,飞腾腾云S2500单路单网卡条件下,Nginx性能的极限在30w req/s左右,想要继续提升Nginx综合性能,必须发挥多路多网卡并行的优势,即:采用多路多网卡策略,通过负载均衡,充分发挥多核并行优势,达到性能叠加的效果,从而使总体性能提升。以飞腾腾云S2500 2路设备为例大概的示意图:

image.png

  整个方案可以概括为:

  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状态,具体地,可以如下图所示:

image.png

image.png

  以上两个状态说明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_processesNginx的绑核数量修改worker_processes 的数量,本文设置为28
worker_cpu_affinity绑核限制修改worker_cpu_affinity 的掩码,绑定在0-27核
日志记录访问和错误信息将log写入dev/null
sendfile零拷贝置为on
open_file_cache max打开文件描述符的个数2048000
ListenNginx 监听的端口号80 default_sever

  2)在飞腾腾云S2500上,直接copy 原来安装好的Nginx可执行文件(如果nginx是yum安装的话,可执行文件在/usr/bin/目录下,可以用命令 which nginx查看具体在哪个目录下),找到nginx可执行文件存放路径以后,将nginx可执行文件copy到一个指定的目录。本文是拷贝到了/root/目录下,然后在/root/目录下,放置一个nginx.conf ,这nginx.conf
配置要求如下表所示:

修改项目作用修改方法
worker_processesNginx的绑核数量修改worker_processes 的数量,本文设置为28
worker_cpu_affinity绑核限制修改worker_cpu_affinity 的掩码,绑定在64-91核
日志记录访问和错误信息将log写入dev/null
sendfile零拷贝置为on
open_file_cache max打开文件描述符的个数2048000
listenNginx 监听的端口号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上:

image.png

image.png

  在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章的方案进行环境搭建,并进行多次测试,取平均值

image.png

  测试时飞腾腾云S2500的cpu负载情况:

image.png

  测试结果

项目性能(req/s)
weighttp1 :8033.2W+
weighttp2 1000032.7W+
累加65.9W

  测试结论:相对于初始的性能,已经提升100%以上。这就给飞腾腾云S2500多路设备(4路或者8路)提供了一种可能,就是通过多路并发,每路外设一张甚至多张网卡,通过搭建LVS负载均衡服务器的方法,将流量负载均衡至每一路上的多个网卡中,充分发挥多路网卡并行优势,通过性能叠加,最终提升Nginx服务的综合服务性能。


推荐阅读

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

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



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

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

商标声明

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

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

注意

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

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

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


飞腾开发者
6 声望3 粉丝

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