我在弹性负载均衡器后面有 EC2 应用程序服务器。所有应用程序服务器都可以访问共享存储服务器,特别是用于集中缓存文件、日志记录等。共享存储服务器通过 OpenVPN 实现 NFS 来完成其工作。所有服务器都位于同一可用区,并通过内部网络相互通信。但是,共享存储解决方案会导致异常高的 CPU 和延迟,如果存储是 100% 本地的,则通常不会出现这种情况。此设置预计性能会略有下降,但在这种情况下 CPU 已上升且输出速度减慢了 2-3 倍
因此,这是一个由两部分组成的问题:
我该怎么做才能更好地了解罪魁祸首?我知道这是 OpenVPN 和 NFS 的组合,但我能识别出最常读取和写入的特定文件吗?或者我可以轻松分辨出瓶颈在哪里吗?
有人能根据以上信息提出建议吗?在基于云的环境中,有没有更好的跨服务器共享文件的方法?(请不要回答“使用 S3”,因为这不适合即时/临时文件要求)
谢谢!
答案1
确保准确设置 openvpn 隧道的链路 MTU,以免出现两次碎片(一次在主机上从 8192 字节到 1500 字节,一次在 openvpn 上从 1500 字节到 1400 字节或其他)。openvpn 处理接口 mtu 的设置非常非常差(主动阻碍正确设置 mtu 的尝试)。
检查通过隧道和绕过隧道时不同大小数据包的延迟。绘制图表并查找问题。
在隧道外设置一个测试 NFS,并以此方式进行一些性能测量,以隔离 openvpn 是否存在问题。
尝试不同版本的 NFS,包括 TCP 和 UDP。
尝试启用积极缓存和异步 I/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
。
此外,在配置中设置静态 MTU 是愚蠢且容易出错的,它应该是动态的。所以,你使用“mtu-disc yes”,对吗?当然,除了它传递给启动脚本的值是 off-by-14(虽然我使用 TAP 来支持 IPv6,这可能会使它莫名其妙地感到困惑)。所以我需要/sbin/ifconfig $1 mtu $(($2-14)) up
获得正确的值(正确的意思是一个值,它将导致隧道数据包不会因为太大而成为碎片或被丢弃)。
我很难想象在什么情况下将接口 MTU 设置为正确的值不是一个好主意,至少在您没有设置片段的情况下(您永远不应该设置片段,否则您的网络故障会困扰您)。如果在初始化后由于网络变化而出现需要片段的错误,它还应该动态更改接口 MTU。
MSS 完全不是完成这项工作的网络层。如果您正确配置了接口 MTU,则 Path-MTU 发现、MSS 和所有东西都可以正常工作。如果您没有正确配置,某些东西可能会工作,其他东西则不会,而哪些东西可以工作取决于实际数据包是从 openvpn 主机还是其他主机发送的。哦,不要让我开始说如果 MTU 不对称(这并不罕见)会发生什么故障。
我认为 OpenVPN 是由缺乏大量网络和系统管理经验的人编写的,他们的糟糕选择被硬编码在配置和数据结构/API 中。他们在灵活和合理的网络配置和集成方面确实做得不好(这只是几个例子中的一个)。可悲的是,它比其他解决方案好几百倍,这让我成为了 OpenVPN 的支持者。例如,思科 VPN 就是一个祸害。