在Xen下,我的服务器接受()新传入TCP连接的速度确实很差。在裸金属硬件上进行的同样测试显示,速度提高了3-5倍。
最近,我一直在研究在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倍?
当进一步研究这个问题并找出问题时,我发现涅珀夫性能测试工具可以模拟我正在经历的类似场景。使用netperf的TCP_CRR测试,我从不同的服务器(虚拟化和非虚拟服务器)收集了各种报告。如果您想提供一些发现或查阅我目前的报告,请参阅https://gist.github.com/985475
在ESN (我的雇主),我是Beaconpush的项目负责人,这是一个用Java编写的Comet/Web服务器。尽管它具有很强的性能,并且可以在最优条件下满足几乎所有给它的带宽,但它仍然仅限于建立新的TCP连接的速度。也就是说,如果您有一个用户频繁进出的大用户,那么许多TCP连接将不得不设置/删除。我们试图减轻这种情况,尽可能延长连接的存活时间。但是最终,accept()性能是阻止内核旋转的原因,我们不喜欢这样做。
有人把这个问题发到黑客新闻上,这里也有一些问题/答案。不过,我会尽量让这个问题与我所发现的最新信息保持一致。
我在硬件/平台上测试过这一点:
我正在重新运行这些测试,并在https://gist.github.com/985475填写报告,如果您愿意的话,请提供您的数字。很简单!
发布于 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
发布于 2011-05-22 19:56:25
也许您可以澄清一点--您是在自己的服务器上运行Xen下的测试,还是只在EC2实例上运行这些测试?
接受只是另一个syscall,而新的连接只是不同的,因为前几个数据包将有一些特定的标志--像Xen这样的管理程序绝对不会看到任何区别。您的设置的其他部分可能会:例如,在EC2中,如果安全组与它有关系,我不会感到惊讶;连接路径也是报告将新连接接受率减半(PDF)。
最后,似乎有一些CPU /内核组合会在EC2 (通常也可能是Xen )上引起奇怪的CPU使用/混乱,比如Librato最近的博客。
发布于 2012-02-11 11:35:27
确保禁用了dom0中桥接代码中的iptables和其他挂钩。显然,它只适用于网桥网络Xen设置。
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并将其固定。管理程序引导选项:
dom0_max_vcpus=1 dom0_vcpus_pin dom0_mem=<at least 512M>您是否尝试过将物理以太网PCI设备传递给domU?应该有很好的性能提升。
https://serverfault.com/questions/272483
复制相似问题