【发布时间】:2018-01-04 16:41:41
【问题描述】:
我正在编写一个目前进展顺利的 HTTP/2 服务器。我现在正在尝试优化服务器,所以我在它和 nginx 之间做了一些基准测试。在本地运行服务器并在同一台机器上运行基准测试工具 (h2load) 时,nginx 每秒获得大约 2200 个请求,而我的服务器每秒获得大约 1600 个请求,这与我的预期差不多。我还有很大的优化空间。
但是,当我通过网络进行测试时,即从远程机器上运行基准测试工具时,nginx 保持在大约 1800 个请求/秒,但我的服务器下降到大约 90 个请求/秒。这向我表明,与其他任何地方相比,我在处理 I/O 方面存在瓶颈。我对 callgrind 和 gperftools 进行了一些分析,但我看不到任何明显会导致如此大幅减速的东西。我认为这可能与我处理传出写入的方式有关,因为我正在编写大约 4 个小 TLS 记录,每个请求每个记录 100-600 字节。我还决定使用 TCP_NODELAY,因为如果我不使用它,它会下降到另外 3 个请求/秒(如果我使用 TCP_CORK,它会下降到相同)。
我有两个问题:
1) 如何找到导致性能下降的瓶颈?
2) 假设我对传出写入的缓冲不佳是造成这里速度下降的主要原因。我可以使用哪些缓冲策略来提高性能?似乎无论哪种方式,我都可能会分配比我实际需要的数据多得多的数据,或者最终重新分配太多次,或者由于无法在发送数据之前重新排序数据而糟糕地安排传出写入.是否有任何资源可以更详细地解释这一点?
如果您有兴趣,源代码是here。
【问题讨论】:
标签: c performance networking optimization