OpenVPN – почему тормозит сервер?

Проведем простую аналогию. Нам нужно перевезти некий груз из пункта A в пункты Б и В, в пункт Б ведет хорошая автомагистраль со средней скоростью 90 км/ч, а в пункт B грунтовка, разогнаться на которой можно до 45 км/ч. Понятно, что, используя один и тот-же транспорт за одно и тоже время в пункт Б удастся доставить в два раза больше груза, чем в пункт В.

В сетях все происходит аналогично. Исторически сложилось так, что размер буфера OpenVPN составляет 64 КБ, в Linux системах это значение устанавливается принудительно, в Windows вроде бы как отдается на откуп ОС, но по факту чаще всего мы имеем все те же 64 КБ. В этом несложно убедиться заглянув в лог:

Socket Buffers: R=[65536->65536] S=[65536->65536]

Теперь вооружимся калькулятором и посчитаем. Объем данных отправляемых или принимаемых за одну передачу не может превышать объем буфера, а количество отправок в единицу времени ограничено скоростью прохождения пакетов (пингом). Таким образом при пинге в 50 мс мы можем осуществить 20 передач в секунду, а при 200 мс только пять. Отправить за один раз мы можем 64 КБ, считаем, при 50 мс это будет 1280 КБ/сек (1,25 МБ/с) или 10 Мбит/с. Результат довольно неплохой и при общей скорости канала филиалов в 15-20 Мбит/с данное ограничение легко списать на служебный трафик, шифрование и т.п.

При пинге в 200 мс все гораздо более печально, мы упремся в потолок 320 КБ/с или 2,5 Мбит/с. Таким образом, путем несложных математических вычислений мы ответили на главный вопрос: “Почему тормозит OpenVPN”. Как видим, ни шифрование, ни “накладные расходы” тут не причем, проблема в физических ограничениях канала.

Что же делать? Ответ прост – увеличивать размер буферов. Сделать это просто, откройте конфигурационный файл сервера и добавьте туда строки:

sndbuf 524288
rcvbuf 524288

Это установит объем буферов в размере 512 КБ и позволит достичь скоростей при 50 мс – 80 Мбит/с, а при 200 мс – 20 Мбит/с.

В большинстве руководств советуют добавить такие же строки и в конфигурационный файл клиента, но как выяснилось на практике, со стороны клиента данные опции не работают, поэтому следует передать размеры буферов со стороны сервера, поэтому в конфигурацию сервера добавим еще две строки:

push "sndbuf 524288"
push "rcvbuf 524288"

Чтобы убедиться, что настройки работают заглянем в лог на клиенте, там мы должны обнаружить примерно следующее:

Socket Buffers: R=[65536->524288] S=[65536->524288]

Также в ряде источников выражается мнение, что данная проблема (размеров буфера) актуальна только для Linux систем, а в Windows все должно работать быстро, однако уже у другого клиента мы обнаружили что в одном из филиалов, при проводном подключении, Windows Server 2008 R2 устанавливал размеры буферов в 8 КБ:

Socket Buffers: R=[8192->8192] S=[8192->8192]

А это даже при хорошем пинге в 50 мс не более 1,25 МБит/с, при скорости канала в десятки раз превышающем это значение.

В нашем же случае увеличение буфера до 512 КБ позволило достичь скоростей 11-12 Мбит/с, что вполне соответствует реальной скорости канала.

https://interface31.ru/tech_it/2017/04/pochemu-tormozit-openvpn-razmer-buferov-priema-i-otpravki.html

image_pdfimage_print

Leave a Reply

Your email address will not be published. Required fields are marked *