10/20 / 40Gbps nginx大文件缓存Web服务器[达到20Gbps]


10

在此问题中,我想找到最好的配置/硬件,以从单个服务器提供40Gbps的速度。

情况

我们有一个视频共享代理服务器,可以从背后的慢速存储服务器上卸载峰值。所有流量仅是HTTP。服务器充当反向代理(未缓存在服务器上的文件)和Web服务器(存储在本地驱动器上的文件)。

当前大约有100TB的文件,并且在后端存储服务器上正在增长。

缓存机制是独立实现的,这个问题与缓存本身无关,因为它运行良好-当前提供14Gbps的速度,仅传递给2Gbps的后端服务器。因此缓存使用率很好。

目标

一台机器即可达到40Gbps甚至更高的吞吐量。

硬件1

硬件:Supermicro SC825,X11SSL-F,Xeon E3-1230v5(4C/8T@3.4GHz),16GB DDR4 RAM,2个Supermicro 10G STGN-i1S(LACP L3 + 4)

固态硬盘:1个512GB三星,2个500GB三星,2个480GB英特尔535、1个240GB英特尔S3500

系统:

  • irqbalancer已停止
  • 每个接口的set_irq_affinity(通过ixgbe驱动程序tarball中的脚本)
  • ixgbe-4.3.15
  • I / O调度程序的截止日期
  • iptables为空(卸载模块)
  • 文件系统:XFS

Nginx:

  • 发送文件关闭
  • AIO线程
  • 指令1M
  • tcp_nopush开启
  • tcp_nodelay在

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

如图所示,我们能够推动12.5Gbps。不幸的是,服务器没有响应。

有两件事引起了我的注意。第一个是大量的IRQ。在这种情况下,不幸的是我没有来自/ proc / interrupts的图表。第二件事是系统负载过高,我认为这是由于kswapd0仅在使用16G RAM时遇到问题。

硬件2

硬件:Supermicro SC119TQ,X10DRW-i,2个Xeon E5-2609v4(8C/8T@1.70GHz),128GB DDR4 RAM,2个Supermicro 10G STGN-i1S

SSD,系统配置与硬件1相同。Nginx是sendfile上的文件(进一步比较aio / sendfile)。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

这似乎更好,所以现在有了一台可以在高峰期运行的服务器,我们可以尝试一些优化。

Sendfile与AIO线程

我试图禁用sendfile并改用aio线程。

  • 发送文件关闭
  • AIO线程
  • directio 1M(与我们拥有的所有文件匹配)

  • 发送文件

然后在15:00,我切换回sendfile并重新加载了nginx(因此花了一些时间才能完成现有连接)。驱动器利用率(由iostat衡量)很好,这很好。流量没有任何变化(不幸的是zabbix决定不从bond0收集数据)。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

发送文件开/关

刚刚尝试切换发送/关闭。除了重新安排中断外,什么都没有改变。

在此处输入图片说明 在此处输入图片说明

irqbalancer作为服务器/ cron /已禁用

正如@lsd所述,我尝试设置irqbalancer通过cron执行:

*/5 * * * *   root    /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null

不幸的是,这对我的情况没有帮助。其中一张网卡开始表现为奇怪:

在此处输入图片说明

我找不到图形中的问题,第二天又发生了这种情况,我登录到服务器,发现一个核心处于100%(系统使用率)的状态。

我尝试将irqbalance作为服务启动,结果仍然相同。

然后,我决定使用set_irq_affinity脚本,它立即解决了该问题,服务器再次将其推入17Gbps。

硬件3

我们确实升级了新硬件:2U 24(+2)驱动器机箱(6xSFF),2x Xeon E5-2620v4、64GB DDR4 RAM(4x16GB模块),13x SSD,2x Supermicro(使用Intel芯片)网卡。新的CPU大大提高了性能。

当前设置仍然保留-sendfile等。唯一的不同是,我们仅让一个CPU处理两个网卡(通过set_irq_affinity脚本)。

已达到20Gbps的限制。

在此处输入图片说明 在此处输入图片说明

下一个目标?30Gbps。


随时向我提出如何提高性能的想法。我将很乐意对其进行实时测试并在此处分享一些繁重的图表。

有什么想法如何处理CPU上的大量SoftIRQ?

这不是有关容量规划的问题-我已经有了硬件和流量。我总是可以将流量分成几台服务器(无论如何我将来都必须这样做),然后用钱解决问题。但是,这是一个关于实际场景中系统优化和性能调整的问题。



4
您说的不是容量规划,但是在我看来,通过单个服务器增加40 Gbps可能表明容量问题。
ceejayoz '16

5
除了一个有趣的事情,在一项旧工作中,他们关闭了irqbalance服务,但仍然运行了一项cron工作,每15分钟左右运行一次irqbalance。因此,我们仍然获得了irqbalance的优势,而不仅仅是在服务频率上。
lsd

更新:添加了sendfile开/关测试。@lsd:下周,我将尝试通过cron将irqbalance单独使用。让我们看看会产生什么影响。
Yarik Dot

1
您用什么制作了图表?
约翰尼五世

Answers:


9

免责声明:相同的建议适用于所有推速超过10Gbps的服务。包括但不限于负载均衡器,缓存服务器,Web服务器(HAProxy,Varnish,nginx,tomcat等)

你想做的是错的,不要做

改用CDN

CDN旨在传递可缓存的静态内容。为工作使用正确的工具(akamai,MaxCDN,cloudflare,cloudfront等)

任何CDN,甚至是免费的CDN,都将比您自己可以实现的效果更好。

改为水平缩放

我希望一台服务器可以直接处理1-5Gbps,而无需进行大量调整(注意:仅提供静态文件)。通过高级调整通常可以达到8-10Gbps。

但是,单个盒子可以承受很多硬性限制。您应该更喜欢水平缩放。

运行单个框,尝试进行测试,度量,基准测试,优化...,直到该框可靠且可靠且功能确定为止,然后再将更多类似的框放在全局负载平衡器前面。

全局负载平衡选项有几种:大多数CDN可以做到这一点,DNS轮询,ELB / Google负载平衡器...

让我们忽略良好做法,无论如何都要这样做

了解流量模式

            WITHOUT REVERSE PROXY

[request ]  user ===(rx)==> backend application
[response]  user <==(tx)===     [processing...]

有两件事要考虑:带宽和方向(发射或接收)。

小文件为50/50 tx / rx,因为HTTP标头和TCP开销大于文件内容。

大文件为90/10 tx / rx,因为请求大小与响应大小相比可以忽略不计。

            WITH REVERSE PROXY

[request ]  user ===(rx)==> nginx ===(tx)==> backend application
[response]  user <==(tx)=== nginx <==(rx)===     [processing...]

反向代理在两个方向上中继所有消息。负载始终为50/50,总流量增加了一倍。

启用缓存后,它变得更加复杂。请求可能会转移到硬盘驱动器,其数据可能会缓存在内存中。

注意:在本文中,我将忽略缓存方面。我们将专注于在网络上获得10-40 Gbps。知道数据是否来自缓存并优化该缓存是另一个主题,因此可以通过两种方式进行推送。

单核限制

负载平衡是单核的(尤其是TCP平衡)。添加内核并不能使其更快,但是可以使其变得更慢。

使用简单模式(例如,基于IP,URL,Cookie的HTTP平衡)也是如此。反向代理会即时读取标头,严格意义上讲,它不会解析也不处理HTTP请求。

在HTTPS模式下,SSL解密/加密比代理所需的其他所有操作都要密集。SSL流量可以并且应该在多个内核之间分配。

SSL协议

假设您通过SSL进行所有操作。您将需要优化该部分。

快速地加密和解密40 Gbps是相当大的成就。

使用带有AES-NI指令(用于SSL操作)的最新一代处理器。

调整证书使用的算法。有很多算法。您希望在客户端支持的同时又足够安全(没有必要的过度加密)的情况下,在CPU上最有效的处理器(执行基准测试)。

IRQ和核心固定

当有新的数据要读取并且CPU被抢占以立即处理队列时,网卡将生成中断(IRQ)。这是在内核和/或设备驱动程序中运行的操作,严格来说是单核的。

它可能是最大的CPU消耗者,向各个方向发送数十亿个数据包。

为网卡分配一个唯一的IRQ号,并将其固定在特定的内核上(请参阅linux或BIOS设置)。

将反向代理固定到其他内核。我们不希望这两件事干扰。

以太网适配器

网卡正在做很多繁重的工作。在性能方面,所有设备和制造商都不平等。

不用理会主板上的集成适配器(无论服务器主板还是消费级主板都无所谓),它们只是糟透了。

TCP卸载

就处理(校验和,ACK,重传,重组数据包等)而言,TCP是一个非常密集的协议。内核正在处理大部分工作,但是如果支持,某些操作可以转移到网卡上。

我们不想要一张相对较快的卡,我们想要一张带有所有花哨的卡片

忘掉英特尔,Mellanox,戴尔,惠普等等。他们不支持所有这些。

桌上只有一个选项:SolarFlare - HFT公司和CDN的秘密武器。

世界分为两种人:“ 了解SolarFlare的人 ”和“ 不了解的人 ”。(第一组严格等同于“ 进行10 Gbps网络并关心每一个比特的人 ”)。但是我离题了,让我们集中精力:D

内核TCP调整

sysctl.conf内核网络缓冲区中有一些选项。这些设置做什么或不做什么。我真的不知道

net.core.wmem_max
net.core.rmem_max
net.core.wmem_default
net.core.rmem_default

net.ipv4.tcp_mem
net.ipv4.tcp_wmem
net.ipv4.tcp_rmem

使用这些设置是过度优化的明确标志(即通常无用或适得其反)。

鉴于极端的要求,这也许是合理的。

(注意:单个机箱上的40Gbps速度过高。合理的方法是水平扩展。)

一些身体上的限制

记忆体频宽

有关内存带宽的一些数字(大多数以GB / s为单位):http : //www.tweaktown.com/articles/6619/crucial-ddr4-memory-performance-overview-early-look-vs-ddr2-ddr3/index.html

假设内存带宽范围为150-300 Gbps(理想条件下的最大限制)。

所有数据包都必须在某个时刻位于内存中。仅以40 Gbps的线速摄取数据对系统来说是沉重的负担。

剩下的数据处理能力了吗?好吧,我们不要对此抱有太大期望。只是说^^

PCI-Express总线

PCIe 2.0是每个通道4 Gb / s。PCIe 3.0每通道的速率为8 Gbps(并非所有PCI卡都可用)。

如果连接器的长度小于v3.0规格的16倍,则具有单个以太网端口的40 Gbps NIC的前景要优于PCIe总线。

其他

我们可以超越其他限制。关键是,硬件具有物理定律固有的硬限制。

软件不能比其所运行的硬件更好。

网络骨干

所有这些数据包最终都必须经过交换机和路由器。10 Gbps交换机和路由器几乎是一种商品。40 Gbps绝对不是。

另外,带宽必须是端到端的,那么您与用户之间拥有什么样的链接?

上次我与数据中心人员一起检查了一个1000万用户端项目时,他很清楚,最多最多只有2个10 Gbits的互联网链接。

硬盘驱动器

iostat -xtc 3

指标按读写划分。检查队列(<1好),等待时间(<1 ms好)和传输速度(越高越好)。

如果磁盘速度慢,解决方案是在RAID 10中放置更多和更大的SSD(请注意,SSD带宽随SSD大小线性增加)。

CPU选择

IRQ和其他瓶颈仅在一个内核上运行,因此目标是具有最高单核性能(即最高频率)的CPU。

SSL加密/解密需要AES-NI指令,因此仅针对CPU的最新版本。

SSL受益于多个核心,因此针对多个核心。

长话短说:理想的CPU是具有最高可用频率和多个内核的最新CPU。只要选择最昂贵的就可以了:D

发送文件()

发送文件开启

简而言之,是现代内核对高性能Web服务器的最大进步。

最后说明

1 SolarFlare NIC 40 Gbps (pin IRQ and core)
2 SolarFlare NIC 40 Gbps (pin IRQ and core)
3 nginx master process
4 nginx worker
5 nginx worker
6 nginx worker
7 nginx worker
8 nginx worker
...

一件事固定在一个CPU上。那是要走的路。

一个通往外部世界的NIC。一个通向内部网络的NIC。划分职责总是很不错的(尽管双40 Gbps NIC可能会过大)。

有很多东西需要微调,其中一些可能只是一本小书的主题。享受基准测试的乐趣。回来发布结果。


Solarflare网络卡已在几周前订购以进行测试。我现在等待建议solarflare支持如何调整系统以达到最大。可能的性能。测试完成后,我将共享配置和结果。
Yarik Dot

1
站立的行动....
詹姆斯·普利

只是对硬盘进行快速更新-在这种情况下使用任何形式的RAID(SSD驱动器)都无法正常工作。由于SSD的磨损方式不同,因此它们具有不同的性能,而RAID中只有一个缓慢的SSD,整个RAID性能可能很差。最适合我们的最佳方案是使用单个驱动器,而不进行任何硬件/软件突袭。
Yarik Dot'2

0

由于声誉我还无法发表评论,因此必须添加答案...

在第一个示例中,您说:

有两件事引起了我的注意。第一个是大量的IRQ。在这种情况下,不幸的是我没有来自/ proc / interrupts的图表。第二件事是系统负载过高,我认为这是由于kswapd0仅在使用16G RAM时遇到问题。

绝对同意,这些都是要点。

  1. 尝试使用收集的代理,该代理可以收集IRQ并使用RRD存储。

  2. 您有一张内存使用情况图表吗?

    从表面上看,这看起来像是CPU问题,如果发生很多硬页或软页错误,那么较高的softirq%可能只是将手指指向内存。我认为赠品是IRQ的突然升级,以大约19:00的系统CPU为代价。

从规范中可以看出,除以下几点外,其他所有内容均相同:

  • 记忆
  • cpu模型-除非我弄错了,否则基准测试将表明它们应该是相似的,在这种情况下,我希望使用速度更快的内核较少的机器。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.