【问题标题】:Speeding up syscall in Go在 Go 中加速系统调用
【发布时间】:2019-06-01 02:11:33
【问题描述】:

我一直在研究一个用 go 编写的 vpn,我开始尝试优化数据流。粗略一看,实现代码似乎是合理的,因为没有内存泄漏问题,而且 CPU 似乎不是一个限制。

所以我转向 pprof,我看到的问题是大部分执行时间都花在了 syscall.Syscall 中。我对正在运行的 iperf 吞吐量测试进行了 6 秒的配置文件,这就是我所看到的:

此测试在 docker 容器内的客户端和服务器上运行,客户端获取到服务器的 --link。在基础网桥网络上运行 iperf 会产生大约 40Gbit 的吞吐量,iperf 在这个 vpn impl 上运行在相同的顶部,净吞吐量约为 500Mbit。

一个简单的 htop 显示 3/4 的时间都花在了系统上。

我尝试了几种方法来尝试加速单客户端情况,但我似乎找不到减轻在 vpn 服务器中写入数据包的方法...注意:iperf 使用完整的 MTU 大小的数据包在测试期间限制了一些明显的优化。

列出系统调用:

不知道为什么这表明 CMPQ 一直在占用,我认为这应该归因于 SYSCALL。

【问题讨论】:

    标签: sockets go optimization system-calls


    【解决方案1】:

    pprof 是一个过程采样分析器。它发现程序计数器(PC)经常在等待CMPQ在操作系统执行时执行。

    在 Go 中加速系统调用

    您可以减少SYSCALL 的频率。您可以改进操作系统SYSCALL 机制。您可以改进您要求SYSCALL 执行的操作系统代码。您可以使用更好的硬件。以此类推。

    【讨论】:

    • 我对大量 CMPQ 样本的最佳猜测是分析器在系统调用期间被阻塞,因此大多数样本都看到 CMPQ,因为它在系统调用返回时排队等待采样。如果是这种情况,那么使用 SYSCALL 进行序列化的采样意味着分析器输出所归因的时间是似是而非的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2014-09-23
    相关资源
    最近更新 更多