我正在编写一个网络密集型 WebFlux 应用程序。当收到请求时,应用程序向另一个外部服务器请求并接收一些东西,然后回复原始请求者。我说的是 WebFlux 应用程序,我在调用外部服务器时使用的是 WebClient。
应用程序的性能不是那么令人满意。我认为它应该触及最大 CPU 资源,最大 CPU 下的最大 TPS。但它显示低 tps,cpu 仅为 30 或 40%。为什么它不再使用 CPU 来获得更多的 TPS,即使它有更多的空间来执行更多的请求。
我将它与没有外部调用(WebClient)的任务进行了比较,它显示了最大 CPU 资源使用情况下的完整 TPS。
====
示例代码:https ://github.com/mouse500/perfwebf
用于 WebClient 性能的 perfwebf 示例项目
/workloadwexcall : 使用外部调用的工作负载
/workloadwoexcall : 仅使用 cpu 作业的工作负载(但有 1ms 延迟)
外部调用是用 prj 内的简单节点服务器实现的,包括所有内容。
您可以构建 Dockerfile 并使用 docker 运行
并准备jmeter什么的,
test1 : 使用超过 200 个线程调用 /workloadwexcall api => 在 perfwebf 服务器上显示 30~40% 的 cpu 级别
test2 : 使用超过 200 个线程调用 /workloadwoexcall api => 在带有 m 的 perfwebf 服务器上显示几乎 100% 的 cpu 级别
======
到目前为止的观察,
我在 AWS EC2(8 核,16 G Mem)上进行了测试,
我认为外部服务器足够简单和强大来做出反应
当测试1,
服务器的大量线程等待
{
"threadName": "reactor-http-epoll-3",
"threadId": 20,
"blockedTime": -1,
"blockedCount": 8,
"waitedTime": -1,
"waitedCount": 0,
"lockName": null,
"lockOwnerId": -1,
"lockOwnerName": null,
"inNative": true,
"suspended": false,
"threadState": "RUNNABLE",
"stackTrace": [
{
"methodName": "epollWait",
"fileName": "Native.java",
"lineNumber": -2,
"className": "io.netty.channel.epoll.Native",
"nativeMethod": true
},
{
"methodName": "epollWait",
"fileName": "Native.java",
"lineNumber": 148,
"className": "io.netty.channel.epoll.Native",
"nativeMethod": false
},
{
"methodName": "epollWait",
"fileName": "Native.java",
"lineNumber": 141,
"className": "io.netty.channel.epoll.Native",
"nativeMethod": false
},
{
"methodName": "epollWaitNoTimerChange",
"fileName": "EpollEventLoop.java",
"lineNumber": 290,
"className": "io.netty.channel.epoll.EpollEventLoop",
"nativeMethod": false
},
{
"methodName": "run",
"fileName": "EpollEventLoop.java",
"lineNumber": 347,
"className": "io.netty.channel.epoll.EpollEventLoop",
"nativeMethod": false
},
{
======
我不知道,
netty epoll 遇到困难的情况?
docker net机制不满足?(我也在没有 docker 的情况下进行了测试,结果相同)
Linux内核不能满足困难的情况?
AWS EC2 网络带宽性能低?
问题是,为什么它不再使用 CPU 来获得更多的 TPS,即使它有更多的空间来执行更多的请求。
希望为此找到一些解决方案...