【问题标题】:Very low requests per second in my server over a network [closed]通过网络在我的服务器中每秒的请求非常低[关闭]
【发布时间】: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


    【解决方案1】:

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

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

    我建议你去找专家。我怀疑你会在 StackOverflow 上找到一个闲逛的人。

    【讨论】:

    • 非常感谢您的客气话!我会在几个小时内接受这个答案,以防其他人想在此期间提交答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多