10/20 / 40Gbps nginx大文件cachingwebserver

我想在这个问题上find最好的configuration/硬件来从一台服务器提供40Gbps。

情况

我们有一个video共享代理服务器,可以从后面的慢速存储服务器上卸载峰值。 所有的stream量只是HTTP。 服务器充当反向代理(不在服务器上caching的文件)和Web服务器(存储在本地驱动器上的文件)。

目前有100TB的文件,并在后端存储服务器上增长。

caching机制是独立实现的,这个问题不是caching本身,因为它工作得很好 – 目前提供14Gbps,传递到后端服务器只有2Gbps。 所以caching使用情况良好。

目标

从一台机器实现40Gbps甚至更高的吞吐量。

硬件1

硬件:Supermicro SC825,X11SSL-F,Xeon E3-1230v5(4C/[email protected]),16GB DDR4内存,2x Supermicro 10G STGN-i1S(LACP L3 + 4)

SSD:1x 512GB三星,2x500GB三星,2x480GB Intel 535,1x 240GB Intel S3500

系统:

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

Nginx的:

  • sendfileclosures
  • aio线程
  • 指导1M
  • tcp_nopush上
  • tcp_nodelay上

在这里输入图像描述 在这里输入图像描述 在这里输入图像描述

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

有两件事引起了我的注意。 第一个是大量的IRQ。 在这种情况下,我不幸的是有/ proc / interrupts的图表。 第二件事是高系统负载,我认为这是由于kswapd0只能与16G的RAM工作有关。

硬件2

硬件:Supermicro SC119TQ,X10DRW-i,2x Xeon E5-2609v4(8C / [email protected]),128GB DDR4内存,2x Supermicro 10G STGN-i1S

SSD,系统configuration与硬件1相同.Nginx是sendfile on(aio / sendfile进一步比较)。

在这里输入图像描述 在这里输入图像描述 在这里输入图像描述

这似乎更好,所以现在,我们有一个服务器,在高峰期工作,我们可以尝试一些优化。

Sendfile vs aio线程

我试图禁用sendfile,而不是使用aio线程。

  • sendfileclosures
  • aio线程
  • directio 1M(匹配我们所有的文件)

VS

  • 发送文件

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

在这里输入图像描述 在这里输入图像描述 在这里输入图像描述

发送文件开启/closures

只是试图切换发送/closures。 除了重新调度中断之外,没有任何改变。

在这里输入图像描述 在这里输入图像描述

irqbalancer作为服务器/ cron /禁用

作为@lsd提到我试图设置irqbalancer通过cron执行:

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

不幸的是,这并没有帮助我的情况。 网卡之一开始performance奇怪:

在这里输入图像描述

我无法find图表中的错误,就像第二天发生的那样,我login到服务器,发现一个内核处于100%(系统使用率)。

我试图启动irqbalance作为服务,结果仍然是一样的。

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

硬件3

我们升级到新硬件:2U 24(+2)硬盘机箱(6xSFF),2个Xeon E5-2620v4,64GB DDR4 RAM(4x16GB模块),13x SSD,2个Supermicro(带Intel芯片)网卡。 新的CPU提高了性能。

目前的设置保持 – sendfile等。唯一的区别是我们只让一个CPU处理两个网卡(通过set_irq_affinity脚本)。

20Gbps的限制已经达到。

在这里输入图像描述 在这里输入图像描述

下一个目标? 30Gbps的。


随意射击我的想法如何提高性能。 我会很高兴现场testing它,并在这里分享一些沉重的图表。

任何想法如何在CPU上处理大量的SoftIRQs?

这不是关于容量规划的问题 – 我已经拥有硬件和stream量。 我总是可以把stream量分成几台服务器(我将来也要这样做),并用金钱解决问题。 然而,这是一个关于系统优化和性能调整的真实情况下的问题。

免责声明 :同样的build议适用于推动10Gbps以上的所有服务。 包括但不限于负载平衡器,caching服务器,Web服务器(HAProxy,Varnish,nginx,tomcat等)

你想做什么是错的,不要这样做

改用CDN

CDN旨在提供可caching的静态内容。 使用正确的工具(akamai,MaxCDN,cloudflare,cloudfront,…)

任何CDN,甚至是免费的CDN,都会比你自己做的更好。

而是水平放大

我希望单台服务器可以在不经过太多调整的情况下处理1-5Gbps的数据(注意:只提供静态文件)。 8-10Gbps通常在高级调整的范围内。

尽pipe如此,对于一个盒子可以采取多less硬性限制。 你应该喜欢水平缩放。

运行一个盒子,尝试一些东西,测量,基准testing,优化……直到盒子可靠可靠,其function已经确定,然后把更多的盒子放在前面的全局负载均衡器中。

有几个全球负载平衡选项:大多数CDN可以做到这一点,DNS roundrobin,ELB /谷歌负载平衡器…

让我们忽略好的做法,并无论如何做

了解交通模式

  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,总stream量翻倍。

启用caching后会变得更复杂。 请求可能被转移到硬盘上,其数据可能被caching在内存中。

注意 :我将忽略这篇文章中的caching方面。 我们将专注于在networking上获得10-40 Gbps。 知道数据是否来自caching并优化caching是另一个话题,无论哪种方式,它都被推上了networking。

单核的限制

负载平衡是单一的(特别是TCP平衡)。 添加核心并不能使速度更快,但是可以使其变慢。

在简单模式(如IP,URL,基于cookie的HTTP平衡)下也是如此。反向代理在运行中读取头文件,不严格分析或处理HTTP请求。

在HTTPS模式下,SSL解密/encryption比代理所需的所有其他内容更encryption集。 SSLstream量可以并且应该分成多个核心。

SSL

鉴于你做了所有的SSL。 你会想要优化这个部分。

在运行中encryption和解密40 Gbps是相当成功的。

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

调整证书使用的algorithm。 有很多algorithm。 你需要一个在你的CPU上最有效的(做基准testing),而且被客户支持并且足够安全(没有必要的过度encryption)。

IRQ和核心固定

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

它可能是最大的CPU消费者,每个方向都有数十亿个数据包。

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

将反向代理绑定到其他核心。 我们不希望这两件事干涉。

以太网适配器

网卡正在做很多繁重的工作。 所有设备和制造商在表演方面都不相同。

忘记主板上的集成适配器(无论服务器还是消费者主板都无所谓),他们只是吮吸而已。

TCP卸载

TCP在处理(校验和,ACK,重传,重组包,…)方面是非常密集的协议。内核正在处理大部分工作,但是如果支持的话,一些操作可以被卸载到网卡上。

我们不需要一张相对较快的卡 ,我们希望有一个与所有的花里胡哨。

忘记英特尔,Mellanox,戴尔,惠普等等。 他们不支持所有这一切。

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

世界被分为两种:“ 知道太阳能的人 ”和“ 知道 的人 ”。 (第一套严格等同于“ 10Gbps联网,关心每一个人的人 ”)。 但是我离题了,让我们集中:D

内核TCP调整

内核networking缓冲区有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过度优化,合理path水平缩放)

一些身体上的限制

内存带宽

一些关于内存带宽的数字(主要以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规范中的连接器长度小于16x,则具有单个以太网端口的40 Gbps网卡比PCIe总线更有前景。

其他

我们可以超越其他限制。 重点在于硬件具有固有的物理定律固有的局限性。

软件不能比它运行的硬件做得更好。

networking骨干

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

另外,带宽必须是端到端的,所以你需要什么样的链接呢?

上次我和我的数据中心人员进行了一个10M的用户端项目检查时,他非常清楚,最多只有2个10 Gbit的互联网链接。

硬盘驱动器

iostat -xtc 3

指标通过读写分裂。 检查队列(<1是好的),延迟(<1毫秒是好的)和传输速度(越高越好)。

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

CPUselect

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

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

SSL可以从多个内核获益,因此可以实现多个内核。

长话短说:理想的CPU是可用频率最高,核心最多的最新CPU。 只要select最昂贵的,这可能是:D

发送文件()

Sendfile开启

现代内核的高性能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通向外部世界。 一个网卡通向内部networking。 分裂的责任总是很好(虽然双40 Gbps网卡可能是矫枉过正)。

这是很多事情要好好调整,其中一些可能是一本小书的主题。 有乐趣基准所有这一切。 回来发布结果。

我不能评论,因为声誉,所以不得不添加一个答案,而不是…

在第一个例子中,你说:

有两件事引起了我的注意。 第一个是大量的IRQ。 在这种情况下,我不幸的是有/ proc / interrupts的图表。 第二件事是高系统负载,我认为这是由于kswapd0只能与16G的RAM工作有关。

绝对认同这些都是重要的一点。

  1. 尝试使用collectd代理,它可以收集IRQ并使用RRD进行存储。

  2. 你有内存使用情况的图表吗?

    表面看来,这看起来像是一个CPU问题,如果出现大量的硬性或软性页面错误,高的softirq%可能只是指向内存。 我认为这个赠送是在中央处理器突然升级的情况下,在19:00左右以系统CPU为代价。

从规格中可以看出,除了:

  • 记忆
  • CPU模型 – 除非我错了,基准会表明它们应该是相似的,在这种情况下,我更喜欢使用更less核心的盒子。