Я работал над vpn, написанным на go, и я начинаю пытаться оптимизировать поток данных. На первый взгляд, код реализации кажется надежным, поскольку нет никаких проблем с утечкой памяти, а процессор не является ограничением.
Итак, я перешел на pprof, и проблема, с которой я сталкиваюсь, заключается в том, что большая часть времени выполнения тратится на syscall.Syscall. Я выполнил 6-секундный профиль теста производительности iperf, и вот что я вижу:
Этот тест выполняется как с клиентом, так и с сервером внутри докеров, и клиент получает ссылку - на сервер. Запуск iperf в сети с базовым мостом обеспечивает пропускную способность около 40 Гбит, iperf по сравнению с этим vpn подразумевает около 500 Мбит.
Простой htop показывает, что 3/4 времени проводится в системе.
Я попробовал несколько подходов, чтобы попытаться ускорить работу с одним клиентом, но я не могу найти способ смягчить запись пакетов на сервере vpn ... Примечание: iperf использует полные пакеты размера MTU во время теста, который ограничивает некоторые очевидные оптимизации.
список системных вызовов:
Не уверен, почему это показывает, что CMPQ занимает все время, я думаю, это следует отнести к SYSCALL.