首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Xen下TCP accept()性能如此糟糕?

为什么在Xen下TCP accept()性能如此糟糕?
EN

Server Fault用户
提问于 2011-05-22 16:39:01
回答 3查看 17.5K关注 0票数 89

在Xen下,我的服务器接受()新传入TCP连接的速度确实很差。在裸金属硬件上进行的同样测试显示,速度提高了3-5倍。

  1. 为什么Xen的情况这么糟?
  2. 您能调整Xen以提高新TCP连接的性能吗?
  3. 还有其他虚拟化平台更适合这种用例吗?

背景

最近,我一直在研究在Xen下运行的内部开发的Java服务器的一些性能瓶颈。服务器使用HTTP并回答简单的TCP连接/请求/响应/断开调用。

但是,即使在向服务器发送大量流量的同时,它也不能每秒接受超过7000个TCP连接(在一个8核的EC2实例上,c1.xlarge正在运行Xen)。在测试期间,服务器还表现出一种奇怪的行为,其中一个内核(不一定是cpu 0)的负载量超过80%,而其他内核几乎处于空闲状态。这使我认为这个问题与内核/底层虚拟化有关。

当在一个普通的、非虚拟化的平台上测试同样的场景时,我得到的测试结果显示TCP accept()速率超过35000/秒。这是在核心i5 4核心机器上运行的Ubuntu,所有核心几乎完全饱和。在我看来,这样的数字似乎是对的。

在Xen实例上,我已经尝试过启用/调整sysctl.conf中的几乎所有设置。包括启用接收包引导接收流转向,并将线程/进程固定在CPU上,但没有明显的收益。

我知道,在运行虚拟化时,性能下降是可以预期的。但到了这个程度?一台速度较慢、光秃秃的金属服务器,性能优于环境。8-核心是5倍?

  1. 这真的是Xen的预期行为吗?
  2. 您能调整Xen以提高新TCP连接的性能吗?
  3. 还有其他虚拟化平台更适合这种用例吗?

复制此行为

当进一步研究这个问题并找出问题时,我发现涅珀夫性能测试工具可以模拟我正在经历的类似场景。使用netperf的TCP_CRR测试,我从不同的服务器(虚拟化和非虚拟服务器)收集了各种报告。如果您想提供一些发现或查阅我目前的报告,请参阅https://gist.github.com/985475

我怎么知道这个问题不是由于软件写得不好造成的?

  1. 服务器已经在裸金属硬件上进行了测试,它几乎饱和了所有可用的核心。
  2. 当使用“保持活跃的TCP连接”时,问题就消失了.

为什么这很重要?

ESN (我的雇主),我是Beaconpush的项目负责人,这是一个用Java编写的Comet/Web服务器。尽管它具有很强的性能,并且可以在最优条件下满足几乎所有给它的带宽,但它仍然仅限于建立新的TCP连接的速度。也就是说,如果您有一个用户频繁进出的大用户,那么许多TCP连接将不得不设置/删除。我们试图减轻这种情况,尽可能延长连接的存活时间。但是最终,accept()性能是阻止内核旋转的原因,我们不喜欢这样做。

更新1

有人把这个问题发到黑客新闻上,这里也有一些问题/答案。不过,我会尽量让这个问题与我所发现的最新信息保持一致。

我在硬件/平台上测试过这一点:

  • 实例类型为c1.xlarge (8核,7 GB RAM)和cc1.4xlarge (2 x Intel Xeon X5570,23 GB RAM)。所用AMIs分别为ami-08f40561和ami-1cad5275。有人还指出,“安全组”(即EC2s防火墙)也可能影响。但是对于这个测试场景,我只尝试在localhost上消除这样的外部因素。我听到的另一个传闻是,EC2实例不能超过100000个PPS。
  • 两个运行Xen的私有虚拟服务器。其中一个在测试前负荷为零,但没有产生任何影响。
  • 专用专用Xen服务器在Rackspace。同样的结果。

我正在重新运行这些测试,并在https://gist.github.com/985475填写报告,如果您愿意的话,请提供您的数字。很简单!

(行动计划已被移动到单独的、综合的答案中)

EN

回答 3

Server Fault用户

发布于 2011-05-22 19:09:04

有趣的是,我发现关闭NIC硬件加速大大提高了Xen控制器的网络性能(LXC也是如此):

分散-收集accell:

/usr/sbin/ethtool -K br0 sg off

TCP分段卸载:

/usr/sbin/ethtool -K br0 tso off

其中br0是虚拟机管理程序主机上的桥或网络设备。你得把它设置好在每次启动时都关机。YMMV

票数 22
EN

Server Fault用户

发布于 2011-05-22 19:56:25

也许您可以澄清一点--您是在自己的服务器上运行Xen下的测试,还是只在EC2实例上运行这些测试?

接受只是另一个syscall,而新的连接只是不同的,因为前几个数据包将有一些特定的标志--像Xen这样的管理程序绝对不会看到任何区别。您的设置的其他部分可能会:例如,在EC2中,如果安全组与它有关系,我不会感到惊讶;连接路径也是报告将新连接接受率减半(PDF)

最后,似乎有一些CPU /内核组合会在EC2 (通常也可能是Xen )上引起奇怪的CPU使用/混乱,比如Librato最近的博客

票数 3
EN

Server Fault用户

发布于 2012-02-11 11:35:27

确保禁用了dom0中桥接代码中的iptables和其他挂钩。显然,它只适用于网桥网络Xen设置。

代码语言:javascript
复制
echo 0 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 0 > /proc/sys/net/bridge.bridge-nf-call-arptables

它取决于服务器的大小,但取决于较小的服务器(4核处理器),将一个cpu核专用于Xen dom0并将其固定。管理程序引导选项:

代码语言:javascript
复制
dom0_max_vcpus=1 dom0_vcpus_pin dom0_mem=<at least 512M>

您是否尝试过将物理以太网PCI设备传递给domU?应该有很好的性能提升。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/272483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档