在此问题中,我想找到最好的配置/硬件,以从单个服务器提供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?
这不是有关容量规划的问题-我已经有了硬件和流量。我总是可以将流量分成几台服务器(无论如何我将来都必须这样做),然后用钱解决问题。但是,这是一个关于实际场景中系统优化和性能调整的问题。