Throughput TCP OpenVPN yang sangat rendah (port 100Mbit, utilisasi CPU rendah)

27

Saya mengalami kecepatan transfer OpenVPN yang sangat lambat antara dua server. Untuk pertanyaan ini, saya akan memanggil server Server A dan Server B.

Server A dan Server B menjalankan CentOS 6.6. Keduanya terletak di pusat data dengan garis 100Mbit dan transfer data antara dua server di luar OpenVPN berjalan hampir ~ 88Mbps.

Namun, ketika saya mencoba mentransfer file apa pun melalui koneksi OpenVPN yang telah saya buat antara Server A dan Server B, saya mendapatkan throughput yang benar sekitar 6,5Mbps.

Hasil tes dari iperf:

[  4] local 10.0.0.1 port 5001 connected with 10.0.0.2 port 49184
[  4]  0.0-10.0 sec  7.38 MBytes  6.19 Mbits/sec
[  4]  0.0-10.5 sec  7.75 MBytes  6.21 Mbits/sec
[  5] local 10.0.0.1 port 5001 connected with 10.0.0.2 port 49185
[  5]  0.0-10.0 sec  7.40 MBytes  6.21 Mbits/sec
[  5]  0.0-10.4 sec  7.75 MBytes  6.26 Mbits/sec

Selain dari tes iperf OpenVPN ini, kedua server ini hampir sepenuhnya kosong tanpa beban.

Server A diberikan IP 10.0.0.1 dan itu adalah server OpenVPN. Server B diberi IP 10.0.0.2 dan itu adalah klien OpenVPN.

Konfigurasi OpenVPN untuk Server A adalah sebagai berikut:

port 1194
proto tcp-server
dev tun0
ifconfig 10.0.0.1 10.0.0.2
secret static.key
comp-lzo
verb 3

Konfigurasi OpenVPN untuk Server B adalah sebagai berikut:

port 1194
proto tcp-client
dev tun0
remote 204.11.60.69
ifconfig 10.0.0.2 10.0.0.1
secret static.key
comp-lzo
verb 3

Apa yang saya perhatikan:

1. Pikiran pertama saya adalah bahwa saya bottlenecking CPU di server. OpenVPN adalah single-threaded dan kedua server ini menjalankan prosesor Intel Xeon L5520 yang bukan yang tercepat. Namun, saya menjalankan topperintah selama salah satu tes iperf dan menekan 1untuk melihat pemanfaatan CPU oleh inti dan menemukan bahwa beban CPU sangat rendah pada setiap inti:

top - 14:32:51 up 13:56,  2 users,  load average: 0.22, 0.08, 0.06
Tasks: 257 total,   1 running, 256 sleeping,   0 stopped,   0 zombie
Cpu0  :  2.4%us,  1.4%sy,  0.0%ni, 94.8%id,  0.3%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.3%st
Cpu3  :  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu8  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu9  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu10 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu11 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu12 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu13 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu14 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu15 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    946768k total,   633640k used,   313128k free,    68168k buffers
Swap:  4192188k total,        0k used,  4192188k free,   361572k cached

2. Waktu ping meningkat jauh di atas terowongan OpenVPN saat iperf berjalan. Ketika iperf tidak berjalan, waktu ping di atas terowongan secara konsisten 60ms (normal). Tetapi ketika iperf berjalan dan mendorong lalu lintas yang padat, waktu ping menjadi tidak menentu. Anda dapat melihat di bawah ini bagaimana waktu ping stabil hingga ping ke-4 ketika saya memulai tes iperf:

PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=60.1 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=60.1 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=60.2 ms
** iperf test begins **
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=146 ms
64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=114 ms
64 bytes from 10.0.0.2: icmp_seq=6 ttl=64 time=85.6 ms
64 bytes from 10.0.0.2: icmp_seq=7 ttl=64 time=176 ms
64 bytes from 10.0.0.2: icmp_seq=8 ttl=64 time=204 ms
64 bytes from 10.0.0.2: icmp_seq=9 ttl=64 time=231 ms
64 bytes from 10.0.0.2: icmp_seq=10 ttl=64 time=197 ms
64 bytes from 10.0.0.2: icmp_seq=11 ttl=64 time=233 ms
64 bytes from 10.0.0.2: icmp_seq=12 ttl=64 time=152 ms
64 bytes from 10.0.0.2: icmp_seq=13 ttl=64 time=216 ms

3. Seperti yang disebutkan di atas, saya menjalankan iperf di luar terowongan OpenVPN dan throughputnya normal - ~ 88Mbps secara konsisten.

Apa yang saya coba:

1. Saya pikir kompresi mungkin mengotori segalanya, jadi saya mematikan kompresi dengan menghapus comp-lzodari kedua konfigurasi dan memulai kembali OpenVPN. Tidak ada perbaikan.

2. Meskipun saya sebelumnya menemukan bahwa utilisasi CPU rendah, saya pikir cipher default mungkin sedikit terlalu intensif untuk dapat diikuti oleh sistem. Jadi saya menambahkan cipher RC2-40-CBCke kedua konfigurasi (cipher yang sangat ringan) dan memulai kembali OpenVPN. Tidak ada perbaikan.

3. Saya membaca di berbagai forum tentang bagaimana mengubah fragmen, mssfix dan mtu-tun dapat membantu kinerja. Saya bermain dengan beberapa variasi seperti yang dijelaskan dalam artikel ini , tetapi sekali lagi, tidak ada peningkatan.

Adakah ide tentang apa yang dapat menyebabkan kinerja OpenVPN yang buruk?

Elliot B.
sumber
Apakah ada tautan, komentar dari sini membantu? forums.openvpn.net/topic10593.html
Matt
Sebagian besar saran dalam hal-hal yang sudah saya coba: 1. memeriksa kemacetan CPU, 2. memverifikasi kecepatan transfer tanpa VPN, 3. beralih kompresi, 4. memilih cipher yang lebih cepat, dll. Tidak beruntung dengan salah satu dari mereka Belum: - / Ini aneh. Selain dari kecepatan lambat dan waktu ping yang tinggi / tidak stabil, saya tidak melihat indikasi di mana kemacetan mungkin terjadi.
Elliot B.
Apakah kedua mesin di pusat data yang sama? 60ms dalam pusat data yang sama cukup tinggi. Saya mungkin tergoda untuk mencoba cipher nonemeskipun saya ragu itu akan membantu.
Zoredache
@Zoredache Maaf - Saya tidak jelas tentang lokasi server - server A di Dallas dan server B di Seattle.
Elliot B.
Sudahkah Anda memeriksa MTU? Esp: parameter tun-mtu, fragmen dan mssfix? Dokumentasi
Lenniey

Jawaban:

26

Setelah banyak Googling dan konfigurasi tweak file, saya menemukan solusinya Saya sekarang mendapatkan kecepatan berkelanjutan 60Mbps dan meledak hingga 80Mbps. Ini sedikit lebih lambat daripada kecepatan transfer yang saya terima di luar VPN, tapi saya rasa ini akan sebagus yang didapat.

Langkah pertama adalah mengatur sndbuf 0dan rcvbuf 0dalam konfigurasi OpenVPN untuk server dan klien.

Saya membuat perubahan itu setelah melihat saran untuk melakukannya pada posting forum publik (yang merupakan terjemahan bahasa Inggris dari posting asli Rusia ) yang akan saya kutip di sini:

Ini Juli, 2004. Kecepatan internet rumah biasa di negara maju adalah 256-1024 Kbit / dtk, di negara-negara kurang berkembang adalah 56 Kbit / dtk. Linux 2.6.7 telah dirilis belum lama ini dan 2.6.8 di mana TCP Windows Size Scaling akan diaktifkan secara default dirilis hanya dalam sebulan. OpenVPN sedang dalam pengembangan aktif selama 3 tahun, versi 2.0 hampir dirilis. Salah satu pengembang memutuskan untuk menambahkan beberapa kode untuk buffer soket, saya pikir untuk menyatukan ukuran buffer antara OS. Di Windows, ada yang salah dengan MTU adaptor jika ukuran buffer kustom diatur, jadi akhirnya diubah menjadi kode berikut:

#ifndef WIN32
o->rcvbuf = 65536;
o->sndbuf = 65536;
#endif

Jika Anda menggunakan OpenVPN, Anda harus tahu bahwa itu dapat bekerja melalui TCP dan UDP. Jika Anda menetapkan nilai penyangga soket TCP serendah 64 KB, algoritma Penskalaan Ukuran Jendela TCP tidak dapat menyesuaikan Ukuran Jendela hingga lebih dari 64 KB. Apa artinya? Itu berarti bahwa jika Anda terhubung ke situs VPN lain melalui tautan panjang, yaitu AS ke Rusia dengan ping sekitar 100 ms, Anda tidak bisa mendapatkan kecepatan lebih dari 5,12 Mbit / dtk dengan pengaturan penyangga standar OpenVPN. Anda memerlukan setidaknya 640 KB buffer untuk mendapatkan 50 Mbit / s melalui tautan itu. UDP akan bekerja lebih cepat karena tidak memiliki ukuran jendela tetapi juga tidak akan bekerja dengan sangat cepat.

Seperti yang sudah Anda duga, rilis OpenVPN terbaru masih menggunakan ukuran buffer soket 64 KB. Bagaimana seharusnya kita memperbaiki masalah ini? Cara terbaik adalah melarang OpenVPN untuk mengatur ukuran buffer kustom. Anda harus menambahkan kode berikut di file konfigurasi server dan klien:

sndbuf 0
rcvbuf 0

Penulis selanjutnya menjelaskan cara mendorong penyesuaian ukuran buffer ke klien jika Anda tidak mengendalikan konfigurasi klien sendiri.

Setelah saya melakukan perubahan itu, laju throughput saya mencapai 20Mbps. Saya kemudian melihat bahwa utilisasi CPU sedikit tinggi pada satu inti jadi saya menghapus comp-lzo(kompresi) dari konfigurasi pada klien dan server. Eureka! Kecepatan transfer melonjak hingga 60Mbps berkelanjutan dan 80Mbps meledak.

Saya harap ini membantu orang lain menyelesaikan masalah mereka sendiri dengan kelambatan OpenVPN!

Elliot B.
sumber
4

Setelah beberapa kali mencoba, saya telah mencapai solusi yang baik. Dalam kasus saya, jawaban @ Elliot tidak membantu. Googling lebih lanjut, saya menemukan potongan ini untuk menambahkan konfigurasi server yang membuat pekerjaan

sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"

Saya memiliki server OpenVPN kecil yang berjalan pada Raspberry PI3 dan sekarang saya mendapatkan 71 Mbps downlink dan 16Mbps uplink . Pengunduhan terbatas karena kekuatan CPU. Saat ini, konfigurasi saya adalah sebagai berikut:

client-to-client
duplicate-cn
keepalive 10 120
cipher AES-128-CBC
#cipher AES-256-CBC <<<---- lowers the speed to around 50Mbps, still not bad
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
tun-mtu 9000

OpenVPN 2.4.0 arm-unknown-linux-gnueabihf dengan OpenSSL 1.0.2l

Rasanya sangat aneh sehingga masalah tentang konfigurasi default buffer masih ada.

[EDIT] File client.ovpn saya terstruktur seperti ini:

client
dev tun
proto tcp
remote SERVER.IP.ADDRESS.HERE
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
tun-mtu 9000
key-direction 1
cipher AES-128-CBC
comp-lzo
verb 1
mute 20
<ca>
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----
</key>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
[...]
-----END OpenVPN Static key V1-----
</tls-auth>
Inti
sumber
Pengaturan ukuran buffer membantu saya.
Rolf
apa yang Anda masukkan dalam file .ovpn klien?
Patoshi パ ト シ
@ Patoshi パ ト シ Saya sudah berkomentar sndbuf dan recbuf, meletakkan cipher dan kompresi yang sesuai dan meninggalkan parameter default.
Kernel
@Kernel dapatkah Anda menunjukkan apa yang Anda miliki di klien Anda? Saya sedang melakukan koneksi OpenVPN dari Hong Kong ke NYC dan secara lambat lambat dan kadang-kadang terputus. Saya tidak yakin mengapa.
Patoshi パ ト シ
@ Patoshi パ ト シ Saya telah mengedit balasan saya, periksa lagi. Meskipun demikian, saya akan menyarankan Anda untuk mencoba menggunakan UDP, karena itu dapat membantu Anda mengatasi masalah tautan yang tidak stabil dengan server Anda. Memang, itu hanya asumsi, saya belum pernah mencoba membandingkan solusi ini dalam situasi ini.
Kernel
1

Menurut Config, Anda menggunakan TCP sebagai transportasi untuk Tunnel. Pertimbangkan untuk menggunakan UDP daripada TCP karena koneksi TCP yang ditumpuk membuat masalah dalam situasi packet loss.

Sebagai referensi, lihat Mengapa TCP Lebih dari TCP Adalah Ide Buruk

Lairsdragon
sumber
Sayangnya UDP bukan pilihan bagi kami. Kami perlu memastikan bahwa paket data yang kami kirimkan tiba seperti yang diharapkan. Namun demikian kami melakukan percobaan dengan UDP sebelumnya dan tingkat transfer yang buruk masih menjadi masalah.
Elliot B.
6
We need to ensure that the data packets we transmit arrive as expected.dan bukankah itu ditangani oleh protokol yang sedang digali? Menurut Anda mengapa terowongan Anda perlu menjadi hal yang menegakkan itu?
Zoredache
Mungkin itu masalahnya, tetapi kami menggunakan OpenVPN untuk implementasi DRBD asinkron jarak jauh (yaitu, replikasi sistem file). Integritas data sangat penting, jadi meskipun DRBD mungkin memiliki mekanisme internal untuk memverifikasi integritas transfer, saya lebih suka menyimpannya di TCP. Either way, ketika kami memilikinya di UDP kami masih memiliki throughput yang rendah.
Elliot B.
3
@ElliotB. Karena DRBD sendiri menggunakan TCP untuk replikasi, ia akan mengirim ulang jika paket UDP OpenVPN hilang. Sebenarnya menggunakan TCP dalam hal ini Anda akan melakukan dua pengiriman ulang alih-alih satu ... salah satunya akan dibuang. Dan Anda mungkin membuat jendela yang cukup panjang tanpa lalu lintas DRBD (bahkan replikasi rusak karena ini). Setelah Anda mendapatkan beberapa packetloss di rute, Anda akan melihat betapa buruknya pemikiran ini.
Fox
@Fox Terima kasih telah memberikan klarifikasi! Memang DRBD memang menggunakan TCP (drbd.linbit.com/users-guide/s-prepare-network.html). Saran Lairsdragon sebelumnya untuk beralih ke UDP tidak relevan pada saat itu karena UDP juga mengalami tingkat transfer yang sangat rendah, tetapi karena menerapkan solusi yang saya posting di atas, kami benar-benar beralih ke UDP dan mengalami peningkatan kinerja beberapa Mbps.
Elliot B.
1

Kami memiliki dua server antarbenua yang terhubung satu sama lain, kecepatan di antara mereka berkisar sekitar 220 Mbit / s.

Di dalam terowongan OpenVPN (UDP), kecepatan rata-rata 21 Mbit / dtk - sekitar 10x lebih lambat.

(Ada latensi yang signifikan antara server: sekitar 130 ms, dan transfer diukur menggunakan Iperf3 dalam mode TCP.)

Sudah mencoba semua saran jawaban di sini pada tulisan ini, dan tidak ada yang membantu.

Satu hal yang akhirnya membantu adalah sedikit ini:

--txqueuelen 4000

Menurut manual referensi OpenVPN:

–txqueuelen n 
(Linux only) Set the TX queue length on the TUN/TAP interface. Currently defaults to 100.

Setelah mengatur parameter ini di server dan klien, saya dapat mencapai kecepatan 'tautan langsung' yang sama (~ 250Mbit / dtk) juga di bawah terowongan OpenVPN.

Saya sudah menggunakan rcvbuf 0dan sndbuf 0, tapi setidaknya sendirian , mereka tidak membantu sama sekali.

Saya telah menemukan rekomendasi ini di keduanya: halaman ini di forum OpenVPN , dan juga di halaman ini di wiki UDPspeeder .

Pada catatan lain: Saya dapat mencapai kecepatan yang lebih tinggi menggunakan transfer UDP di iperf, tetapi melakukan hal itu juga akan menimbulkan paket-loss yang cukup tinggi.

Jika kebetulan Anda perlu menggunakan VPN untuk menggali dua tempat dengan tautan yang hilang, saya sarankan untuk mempertimbangkan menggunakan semacam terowongan Forward-Error-Correction (FEC) di bawah VPN itu sendiri. Dua yang berhasil saya temukan dan bekerja adalah:

  • Kecepatan UDP tersebut di atas , yang menghubungkan koneksi UDP;
  • kcptun , yang menghubungkan koneksi TCP;

Keduanya dapat banyak membantu dengan packetloss (dengan menghabiskan lebih banyak bandwidth di tempat pertama), dan akhirnya bahkan mengarah ke throughput data yang lebih tinggi, bahkan dengan overhead tambahan, yang benar-benar rapi jika Anda bertanya kepada saya.

(Itu karena packet-loss benar-benar dapat mengacaukan jaringan , khususnya TCP . Lihat halaman 6.)

Saya lebih suka menggunakan OpenVPN pada UDP, untuk semua alasan yang biasa, tetapi saya merasa sulit untuk berurusan dengan UDPspeeder ketika Anda memiliki latensi lebih dari 100 ms &> 10 Mbit / s.

Namun kcptun bekerja dengan sangat baik dengan sedikit penyesuaian, dan sebenarnya benar - benar meningkatkan throughput server kami satu sama lain. =)

Pada catatan yang diperluas, di sini Anda dapat menemukan beberapa penjelasan yang lebih terperinci tentang men-tweak beberapa bagian kinerja OpenVPN.

Vinícius M
sumber
0

Bagi saya, saya memiliki server VPS dengan pengaturan server openvpn di Jepang dan koneksi klien saya menggunakan DDWRT dalam mode klien OpenVPN di NYC. Saya hanya mendapatkan 1-2mbps pada koneksi 100mbit. Yang terbaik yang saya bisa mengoptimalkannya adalah 5mbps yang cukup untuk apa yang saya butuhkan yang dioptimalkan karena saya bisa membuatnya saya percaya.

Pengaturan server OpenVPN saya:

tun-mtu 9000
sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"
comp-lzo
txqueuelen 4000
######
port 10111
proto udp
dev tun
user nobody
group nobody
persist-key
persist-tun
keepalive 10 120
topology subnet
server x.x.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 1.0.0.1"
push "dhcp-option DNS 1.1.1.1"
push "redirect-gateway def1 bypass-dhcp"
dh none
ecdh-curve prime256v1
#tls-crypt tls-crypt.key 0
crl-verify crl.pem
ca ca.crt
cert server_IzA1QdFzHLRFfEoQ.crt
key server_IzA1QdFzHLRFfEoQ.key
auth SHA256
#cipher AES-128-GCM
#cipher AES-128-CBC
#ncp-ciphers AES-128-GCM
#ncp-ciphers AES-128-CBC
#tls-server
#tls-version-min 1.2
#tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
#tls-cipher TLS-DHE-RSA-WITH-AES-128-CBC-SHA
status /var/log/openvpn/status.log
verb 3

Pengaturan klien DDWRT OpenVPN saya juga terlihat di tangkapan layar saya:

tun-mtu 9000
comp-lzo
##########
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server_IzA1QdFzHLRFfEoQ name
auth SHA256
auth-nocache
setenv opt block-outside-dns # Prevent Windows 10 DNS leak
verb 3

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Patoshi パ ト シ
sumber