我的服务器通过网络每秒请求的速度非常低

时间:2018-01-04 16:41:41

标签: c performance networking optimization

我正在写一个目前进展顺利的HTTP / 2服务器。我现在正在尝试优化服务器,所以我在它和nginx之间做了一些基准测试。当在本地运行服务器,并在同一台机器上运行基准测试工具(h2load)时,nginx每秒获得约2200个请求,而我的服务器每秒获得约1600个请求,这与我的预期相符。我仍有很大的优化空间。

然而,当我通过网络进行测试时,即当基准工具从远程计算机运行时,nginx保持在大约1800个请求/秒,但我的服务器下降到大约90个请求/秒。这向我表明,与其他任何地方相比,我处理I / O都存在瓶颈。我用callgrind和gperftools进行了一些分析,但是我看不到任何明显会引起如此大幅减速的事情。我认为它可能与我处理传出写入的方式有关,因为我正在编写每个请求每个100-600字节的4个小TLS记录。我还决定使用TCP_NODELAY,因为如果我不使用它,那么它会再下降到3个请求/秒(如果我使用TCP_CORK则它会下降到相同的位置)。

我有两个问题:

1)如何找到导致性能下降的瓶颈?

2)让我们说我对传出写入的缓慢缓冲是造成大部分减速的原因。我可以使用哪些缓冲策略来提高性能?似乎无论哪种方式,我都会被分配远远超过实际需要的数据的可能性,或者最终重新分配太多次,或者由于在发送数据之前无法对数据进行重新排序而调度传出写入很差。是否有任何资源可以更详细地解释这一点?

如果您感兴趣,源代码为here

1 个答案:

答案 0 :(得分:0)

首先,祝贺您的项目并祝您好运,这看起来确实令人印象深刻。

现在:我预测您的并发套接字工程存在问题。我对Web服务器级别的套接字编程经验不足。但是我知道Linux套接字可以针对任何给定的情况进行大量优化。通过localhost优化使用的套接字并不总是通过网络进行优化(即TCP_CORK对localhost有奇效)。令人信服的是,某些套接字配置(和利用率)在多线程/多进程网络系统中效果最佳。

我建议你去找专家。我怀疑你会发现一个挂在StackOverflow上的人。