我买了一台基于 VIA 的路由器,唯一目的是运行 OpenVPN。不幸的是,Padlock 似乎没有被使用。以下是 dmesg 中的重要部分:
OpenBSD 4.8 (GENERIC) #136: Mon Aug 16 09:06:23 MDT 2010
[email protected]:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: VIA C7 Processor 1500MHz ("CentaurHauls" 686-class) 1.51 GHz
cpu0: FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,APIC,SEP,MTRR,PGE,CMOV,PAT,CFLUSH,ACPI,MMX,FXSR,SSE,SSE2,TM,SBF,SSE3,EST,TM2,xTPR
我的 OpenVPN-Config 具有与密码/挂锁相关的以下选项:
cipher AES-128-CBC
engine cryptodev
我可以通过使用 openssl speed 命令进行基准测试来验证 usercrypto 是否已启用。sysctl 还显示:
kern.usercrypto=1
我从这些以 40 Mbit/秒(最大 70/秒)的速度通过 VPN 隧道的顶级信息中推断出 Padlock 没有使用:
load averages: 0.66, 0.62, 0.54 crypto.b0nd4ge.de 21:03:04
28 processes: 2 running, 25 idle, 1 on processor
CPU states: 1.9% user, 0.0% nice, 2.9% system, 3.2% interrupt, 92.1% idle
Memory: Real: 30M/142M act/tot Free: 839M Swap: 0K/1214M used/tot
PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND
20161 root 59 0 1224K 2676K run - 116:45 53.42% openvpn
11092 named 2 0 18M 19M sleep select 67:50 0.10% named
我还能做什么才能让 Padlock 与 OpenVPN 配合使用?无法用此 VPN 最大限度地利用我的互联网连接真是太遗憾了。
请帮忙。任何建议都将不胜感激。几周以来我一直在谷歌搜索此内容。
答案1
我不熟悉 VIA Padlock,但是...
- OpenVPN 的 CPU 使用率最高时是否会攀升至约 100%?
- 封装的数据包平均大小是多少(加密加速对小数据包帮助不大)?
- 您能与我们分享“openssl speed aes”的结果吗?
作为参考,我可以为您提供在 Xeon E5530 2.40GHz 上使用 aes128-cbc 密码和 sha1 HMAC 的 OpenVPN 和 OpenSSL 性能数据,当加密发生在 CPU 上且平均数据包大小约为 1400 字节时:openssl=1360Mbit/s openvpn=320Mbit/s(使用相同的密码)
使用 Intel AES-NI 引擎,我只能获得 OpenVPN 30% 的提升,而 OpenSSL 速度测试提高了约 4 倍。
编辑:
您还可以使用“cipher none”对 OpenVPN 进行性能测试,以排除/证明非加密相关代码中的瓶颈。您将获得的带宽将是上限,OpenVPN 在任何加密引擎下都不会比这更快。
如果发现瓶颈在非加密代码中,我建议您使用 IPSec - 它的开销较少(没有 TUN、没有用户空间进程、上下文切换、不涉及 TCP/UDP 堆栈)。如果您仍想坚持使用 OpenVPN,请运行多个 OpenVPN 进程并尝试负载平衡流量(仅当您的路由器上有多个 CPU 核心时才有用)。
答案2
Google 并不总是你的朋友 :-)
请在此处搜索 misc@openbsd 邮件列表存档: http://marc.info/
我记得,VIA 的硬件实现有很多不足之处。
另外,为什么要使用 OpenVPN 包?OpenBSD 内置了 ipsec vpn 和 openSSH,并与网络堆栈和 pf 防火墙集成在一起。所有这些都由跨平台客户端支持,是的,即使在效率最低的客户端上也是如此 :-)
答案3
当发现 OpenVPN 的 CPU 使用率过高时,请记住它是一个用户空间应用程序,除了加密之外,还需要进行大量上下文切换来将封装和非封装的数据包来回内核,以及实际网络通信的 CPU 中断。假设从远程端到 OpenVPN 服务器提供的网络有一个 ICMP ping 数据包:
- 内核从远程客户端接收封装的数据包
- 内核将封装好的数据包发送给 OpenVPN
- OpenVPN 解密数据包并将有效载荷复制到内存中
- OpenVPN 创建一个包含有效负载的新数据包并将其交给内核
- 内核将数据包发送到本地网络
- 内核从本地网络接收响应数据包
- 内核将响应数据包发送给 OpenVPN
- OpenVPN 创建封装的数据包并将其交给内核
- 内核将封装好的数据包发送给远程客户端
每当执行从内核上下文切换到用户空间时,就会发生上下文切换,因此 2-3、4-5、7-8、8-9。与内核中的 IPSec 相比,所有封装/解封装都发生在内核上下文中。
这就是为什么,正如 Ansis 所说,增加加密吞吐量并不直接转化为更好的 OpenVPN 吞吐量。随着数据包速率的增加,上下文切换会压倒硬件加密加速带来的收益。