带或不带超线程的 webflux netty
webflux netty with or without hyperthreading
我使用反应式 mongo 创建了简单的 Webflux (kotlin) 应用程序。控制器有一个 GET 方法,它是 return Flow(来自一个集合的 2 个对象)。
我使用 Apache Benchmark 并注意到一件事:
我有 i7 10700(8+8 核)。如果我设置 System.setProperty("reactor.netty.ioWorkerCount", "8"),性能会提高。使用 16 个 netty-nio 线程,AB 显示每秒约 4800 个请求,一个请求时间大约需要 7-9 毫秒。使用 8 个 netty-nio 线程 AB 显示每秒约 5500 个请求,每个请求 3-5 毫秒。
将来在实际项目中仅使用物理内核是否值得?超线程在其他情况下是否有优势?
超线程和线程计数是一件微妙的事情,通常很难在给定的设置中进行推理。因此,与其采用一揽子规则来打开或关闭它,始终值得对您的特定设置进行基准测试,以了解最有效的恕我直言。
话虽这么说,我对它在这种情况下阻碍而不是帮助性能感到惊讶。超线程不会再为您的处理器提供 真实 处理能力,它只是让未使用的核心部分在另一个线程上同时使用。如果你的事件循环只是不停地做同样的工作,那么它可能不会产生很大的不同(因为每个线程都使用相同的核心部分) - 正如你所注意到的,有机会由于更多工作线程会增加上下文切换开销,因此会影响性能。
但是,如果您的应用程序可以对收到的每个请求进行有意义的不同工作,那就另当别论了,因此始终对您的具体情况进行基准测试以确保意义重大。
我使用反应式 mongo 创建了简单的 Webflux (kotlin) 应用程序。控制器有一个 GET 方法,它是 return Flow(来自一个集合的 2 个对象)。 我使用 Apache Benchmark 并注意到一件事: 我有 i7 10700(8+8 核)。如果我设置 System.setProperty("reactor.netty.ioWorkerCount", "8"),性能会提高。使用 16 个 netty-nio 线程,AB 显示每秒约 4800 个请求,一个请求时间大约需要 7-9 毫秒。使用 8 个 netty-nio 线程 AB 显示每秒约 5500 个请求,每个请求 3-5 毫秒。
将来在实际项目中仅使用物理内核是否值得?超线程在其他情况下是否有优势?
超线程和线程计数是一件微妙的事情,通常很难在给定的设置中进行推理。因此,与其采用一揽子规则来打开或关闭它,始终值得对您的特定设置进行基准测试,以了解最有效的恕我直言。
话虽这么说,我对它在这种情况下阻碍而不是帮助性能感到惊讶。超线程不会再为您的处理器提供 真实 处理能力,它只是让未使用的核心部分在另一个线程上同时使用。如果你的事件循环只是不停地做同样的工作,那么它可能不会产生很大的不同(因为每个线程都使用相同的核心部分) - 正如你所注意到的,有机会由于更多工作线程会增加上下文切换开销,因此会影响性能。
但是,如果您的应用程序可以对收到的每个请求进行有意义的不同工作,那就另当别论了,因此始终对您的具体情况进行基准测试以确保意义重大。