Skip to content

Latest commit

 

History

History
61 lines (49 loc) · 5.06 KB

OptimizePPTPVPN.md

File metadata and controls

61 lines (49 loc) · 5.06 KB

介绍

之前双线VPN只是打游戏用到,最近因为写该系列,将上网也改成了双线,发现一些问题:

  • 目前我使用的 pptp 性能并不好, 连接局域网内的VPN服务器,用iperf测试下载速度只有 10Mbits/s
  • 该软件同时还存在内存泄漏,不能释放收到的重复包所占内存

因此决定升级到内核pptp,解决 DualLinePPTPVPN 中提到的不支持缓存数据包问题,同时优化下性能。

解决方法

  • 首先为不想升级到内核pptp的同学提供3个补丁 userland_pptp_patch 如果你打算使用内核pptp可以跳过这部分 其中 100-default_timeout.patch 修改了默认的超时时间和窗口大小,你可以根据具体需要再修改;101-dup_fix.patch修复了内存泄漏的问题;102-high_perf_packet_queue.patch优化了缓存数据包的算法,不过比起内核pptp,速度的瓶颈不在这里
  • 其次我用的固件没有内核pptp的软件包,所以我将其backport到我目前用的固件上了 ppp_package 如果使用的是最新版Openwrt请跳过这部分
  • 最后就是最重要的内核pptp及优化了 kernel_pptp_patch
    989-pptp_add_seq_window.patch 为内核pptp加入了缓存数据包的功能,默认是最多缓存0.333秒和最多2048个包,如果你修改该值,请务必保证其为2的N次方,否则在序列号由0xffffffff变为0的时候会出bug。另外判断超时没有使用timer,而是需要有数据包到达,这么做的理由是如果数据包重要的话,对方也会重新发送的,即使对方不发,链路上的定时echo请求也会触发超时判断。
    990-arc4_add_ecd.patch991-arc4_use_u32_for_ctx.patch 是backport上游的修改到Openwrt 12.09所用的内核,提升了mppe加密的性能
    992-arc4_openssl_high_perf.patch 是将openssl的加密代码移植到内核,加/解密性能提升在路由器上非常明显

性能测试

关于pptp在路由器上的性能:

  • 不使用VPN直连局域网的测试机器,用iperf(以下测试均在路由器上使用该工具)下载速度 220Mbits/s
  • 使用用户态pptp不打任何补丁,下载速度 10Mbits/s
  • 使用内核pptp,但不打arc4相关补丁,下载速度 41Mbits/s
  • 使用内核pptp,打了990和991两个arc4的补丁,下载速度 46Mbits/s
  • 使用内核pptp,打了992的arc4的补丁,下载速度 52Mbits/s
  • 不使用VPN直连局域网的测试机器,但测试机器使用tc设置发包延迟为3ms±1ms(会造成乱序包,以下均记为3ms±1ms)下载速度 95Mbits/s
  • 3ms±1ms,使用内核pptp,但不打arc4相关补丁,下载速度 38Mbits/s

关于arc4在路由器上的性能:

  • 打了990和991两个补丁,arc4 19.4MBytes/s,对比测试了 AES 128位 8.3MBytes/s,AES 256位 6.1MBytes/s
  • 打了992补丁后,arc4 28.8MBytes/s,提升接近50%
  • 使用 openssl speed测试用户态加密结果为:arc4 34.2MBytes/s; AES 128位 8.4MBytes/s;AES 256位 6.5MBytes/s

路由器上的测试做得不多,因为一旦出问题,我就无网可上了,大部分的测试都是在虚拟机中做的,测试环境为主机E3-1230,虚拟机ubuntu 12.04分配双核及虚拟机openwrt 12.09基于官方固件编译分配单核

关于内核加密在ubuntu 12.04上的性能:
AES-128: 233MBytes/s
AES-256: 166MBytes/s
未打任何补丁的arc4: 182MBytes/s
打了990和991补丁的arc4: 449MBytes/s 提升147%
打了992补丁的arc4: 515MBytes/s 可以看到在x86上992补丁的性能提升远没有在路由器上的提升多,其实补丁里的注释已经解释了原因

openssl的用户态加密在ubuntu 12.04上的性能:
AES-128: 258MBytes/s
AES-256: 189MBytes/s
arc4: 761MBytes/s

以下测试是虚拟机ubuntu 12.04做VPN服务器(使用用户态pptp),虚拟机openwrt 12.09做客户端,raw表示不经过VPN直连,kvpn表示使用12.09自带的内核VPN,不打任何补丁,pkvpn表示使用打过989但是没有打990-992补丁的内核pptp,以下速度均为在openwrt上测试的下载速度(tcp窗口大小256k)

raw kvpn pkvpn
无延迟 4.5Gb/s 320Mb/s 350Mb/s
3ms 延迟 300Mb/s 250Mb/s 260Mb/s
3ms±1ms 延迟 200Mb/s 3Mb/s 210Mb/s
200ms 延迟 3Mb/s 3Mb/s 4.5Mb/s
200ms±50ms 延迟 3Mb/s 0.2Mb/s 3.5Mb/s
将tcp窗口大小改为8M后
200ms 延迟 12Mb/s 12Mb/s 16Mb/s
200ms±50ms 延迟 9Mb/s 2Mb/s 9Mb/s

可见在有乱序包的情况下,打了补丁的内核vpn速度提升了1-2个数量级。