我有一个弹性负载均衡器后面的EC2应用程序服务器。 所有应用程序服务器都可以访问共享存储服务器,尤其是集中式caching文件,日志logging等。共享存储服务器通过OpenVPN实现NFS来完成其工作。 所有的服务器都在同一个可用区域,并通过内部networking相互通话。 但是,共享存储解决scheme会导致exception高的CPU和延迟,如果存储是100%本地的,那么这通常不会存在。 预计这种设置有轻微的性能下降,但在这种情况下CPU已经上涨,输出已经减缓了2-3倍
所以,这是一个2部分的问题:
我能做些什么来更好地理解罪魁祸首是什么? 我知道这是OpenVPN和NFS的结合,但是我可以确定正在读取和写入的特定文件吗? 或者我可以轻松地告诉瓶颈在哪里?
有没有人有纯粹的以上信息的build议? 有没有更好的方式在基于云的环境中共享文件跨服务器? (请不要回答“使用S3”,因为这不适合即时/临时文件的要求)
谢谢!
确保openvpn隧道的链路MTU被准确地设置,这样你就不会得到两次碎片(一个在主机从8192字节到1500字节,一次在openvpn从1500字节到1400字节或其他)。 openvpn处理非常非常差的设置接口mtu(主动阻止尝试正确设置mtu)。
检查隧道周围的不同分组大小的延迟。 绘制和寻找问题。
在隧道外设置一个testingNFS,并进行一些性能testing,以确定openvpn是否成问题。
尝试不同版本的NFS,包括TCP和UDP。
尝试启用积极的caching和asynchronousI / O。
以下是关于openvpn WRT MTU的“主动阻碍”(由“请求”添加)
是。 设置tun-mtu导致openvpn生成WARNING: normally if you use --mssfix and/or --fragment, you should also set --tun-mtu 1500 (currently it is 1413). 我不使用--mssfix或--fragment 。
另外,在configuration中设置一个静态的MTU是愚蠢的,错误的,它需要是dynamic的。 所以,你使用“mtu-disc yes”,对吧? 当然,除了传递给启动脚本的值是14以外(尽pipe我使用的TAP支持IPv6,这可能会让它神秘地混淆)。 所以我需要/sbin/ifconfig $1 mtu $(($2-14)) up来获得正确的值(正确的意思是一个值,这将导致隧道数据包不会被分段或丢弃,因为它们太大)。
我很难想象一个情况,将接口MTU设置为正确的值不是一个好主意,至less如果你没有设置片段(你永远不应该有片段设置,至less你的networking罪恶来困扰你)。 如果在初始化之后由于networking改变而导致接口MTU稍后得到片段需要的错误,它也应该dynamic地改变接口MTU
MSS完全是错误的networking层做这个工作。 如果您正确configuration了接口MTU,则Path-MTU发现,MSS以及其他一切都可以正常工作。 如果你不这样做,有些东西可能会分类工作,其他的东西不会,并且哪些东西工作取决于真正的数据包是从openvpn主机还是其他主机发送的。 噢,如果MTU不对称(不是很less见),不要让我开始做什么失败。
我认为OpenVPN是由没有大量networking和系统pipe理经验的人编写的,他们的糟糕select在configuration和数据结构/ API中被硬编码。 他们的networkingconfiguration和集成灵活性和稳定性并不是很好(这只是几个例子之一)。 可悲的是,它比其他解决scheme好几百倍,这使我成为OpenVPN的支持者。 例如,Cisco VPN就是一个问题。
这里还有我的提示: NFS over OpenVPN:最佳性能提升
和完整版本在这里: http : //thegoodcodeinn.blogspot.it/2015/06/nfs-over-openvpn-over-adslor-slow.html