我想在这个问题上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
系统:
Nginx的:
如图所示,我们能够推动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线程。
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旨在提供可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。 你会想要优化这个部分。
在运行中encryption和解密40 Gbps是相当成功的。
采用带有AES-NI指令的最新一代处理器(用于SSL操作)。
调整证书使用的algorithm。 有很多algorithm。 你需要一个在你的CPU上最有效的(做基准testing),而且被客户支持并且足够安全(没有必要的过度encryption)。
当有新数据要读取时,网卡正在产生中断(IRQ),并且CPU被抢占以立即处理队列。 这是一个在内核和/或设备驱动程序中运行的操作,严格意义上来说是单一的。
它可能是最大的CPU消费者,每个方向都有数十亿个数据包。
为网卡分配一个唯一的IRQ号码并将其固定在特定的内核上(请参阅linux或BIOS设置)。
将反向代理绑定到其他核心。 我们不希望这两件事干涉。
网卡正在做很多繁重的工作。 所有设备和制造商在表演方面都不相同。
忘记主板上的集成适配器(无论服务器还是消费者主板都无所谓),他们只是吮吸而已。
TCP在处理(校验和,ACK,重传,重组包,…)方面是非常密集的协议。内核正在处理大部分工作,但是如果支持的话,一些操作可以被卸载到网卡上。
我们不需要一张相对较快的卡 ,我们希望有一个与所有的花里胡哨。
忘记英特尔,Mellanox,戴尔,惠普等等。 他们不支持所有这一切。
桌子上只有一个选项: SolarFlare – HFT公司和CDN的秘密武器。
世界被分为两种:“ 知道太阳能的人 ”和“ 不 知道 的人 ”。 (第一套严格等同于“ 10Gbps联网,关心每一个人的人 ”)。 但是我离题了,让我们集中:D
内核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总线更有前景。
其他
我们可以超越其他限制。 重点在于硬件具有固有的物理定律固有的局限性。
软件不能比它运行的硬件做得更好。
所有这些数据包最终都要经过交换机和路由器。 10 Gbps交换机和路由器几乎是一种商品。 40 Gbps绝对不是。
另外,带宽必须是端到端的,所以你需要什么样的链接呢?
上次我和我的数据中心人员进行了一个10M的用户端项目检查时,他非常清楚,最多只有2个10 Gbit的互联网链接。
iostat -xtc 3
指标通过读写分裂。 检查队列(<1是好的),延迟(<1毫秒是好的)和传输速度(越高越好)。
如果磁盘速度较慢,则解决方法是在RAID 10中放置更多,更大的SSD。(请注意,SSD带宽随SSD大小线性增加)。
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工作有关。
绝对认同这些都是重要的一点。
尝试使用collectd代理,它可以收集IRQ并使用RRD进行存储。
你有内存使用情况的图表吗?
表面看来,这看起来像是一个CPU问题,如果出现大量的硬性或软性页面错误,高的softirq%可能只是指向内存。 我认为这个赠送是在中央处理器突然升级的情况下,在19:00左右以系统CPU为代价。
从规格中可以看出,除了: