Ускорение системного вызова в Go - PullRequest
0 голосов
/ 06 января 2019

Я работал над vpn, написанным на go, и я начинаю пытаться оптимизировать поток данных. На первый взгляд, код реализации кажется надежным, поскольку нет никаких проблем с утечкой памяти, а процессор не является ограничением.

Итак, я перешел на pprof, и проблема, с которой я сталкиваюсь, заключается в том, что большая часть времени выполнения тратится на syscall.Syscall. Я выполнил 6-секундный профиль теста производительности iperf, и вот что я вижу:

enter image description here

Этот тест выполняется как с клиентом, так и с сервером внутри докеров, и клиент получает ссылку - на сервер. Запуск iperf в сети с базовым мостом обеспечивает пропускную способность около 40 Гбит, iperf по сравнению с этим vpn подразумевает около 500 Мбит.

Простой htop показывает, что 3/4 времени проводится в системе.

Я попробовал несколько подходов, чтобы попытаться ускорить работу с одним клиентом, но я не могу найти способ смягчить запись пакетов на сервере vpn ... Примечание: iperf использует полные пакеты размера MTU во время теста, который ограничивает некоторые очевидные оптимизации.

список системных вызовов:

enter image description here

Не уверен, почему это показывает, что CMPQ занимает все время, я думаю, это следует отнести к SYSCALL.

1 Ответ

0 голосов
/ 06 января 2019

pprof - профилировщик выборки процесса. Он обнаруживает, что программный счетчик (ПК) часто ожидает выполнения CMPQ во время выполнения ОС.

Ускорение системного вызова в Go

Вы можете сделать SYSCALL реже. Вы можете улучшить механизм OS SYSCALL. Вы можете улучшить код ОС, который вы попросили SYSCALL выполнить. Вы можете использовать лучшее оборудование. И так далее.

...