问题描述
我正在编写一个网络密集型 WebFlux 应用程序。 当收到请求时,应用程序向另一个外部服务器请求和接收一些东西,然后回复原始请求者。 我说的是 WebFlux 应用程序,我在调用外部服务器时使用 WebClient。
应用程序的性能不是那么令人满意。 我认为它应该触及最大 cpu 资源,最大 cpu 时的最大 TPS。 但它显示出低 tps,cpu 仅为 30 或 40%。 为什么它不再使用 cpu 来获得更多 TPS,即使它有更多空间来执行更多请求。
我将它与没有外部调用(WebClient)的任务进行了比较,它在最大 cpu 资源使用率下显示了完整的 TPS。
====
示例代码:https://github.com/mouse500/perfwebf
perfwebf WebClient 性能示例项目
/workloadwexcall : 使用外部调用的工作负载
/workloadwoexcall : 仅使用 cpu 作业的工作负载(但有 1 毫秒延迟)
外部调用是通过内部的简单节点服务器实现的 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 内存)上进行了测试,
我认为外部服务器足够简单和强大,可以做出反应
当测试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","lineNumber": 148,"nativeMethod": false
},"lineNumber": 141,{
"methodName": "epollWaitNoTimerChange","fileName": "EpollEventLoop.java","lineNumber": 290,"className": "io.netty.channel.epoll.EpollEventLoop",{
"methodName": "run","lineNumber": 347,{
======
我不知道,
netty epoll 没有遇到困难的情况?
docker net 机制不符合? (我也在没有 docker 的情况下进行了测试,结果相同)
Linux 内核不满足硬性要求?
AWS EC2 网络带宽性能低?
问题是,为什么它不再使用 cpu 来获得更多 TPS,即使它有更多空间来执行更多请求。
希望为此找到一些解决方案...
解决方法
这个问题在 Github 上交叉发布:
https://github.com/netty/netty/issues/11492
您似乎对那里的答案感到满意。
,Nitesh 很好地说明了情况。
现在我将后端服务器从简单的 Node 应用程序更改为简单的 WebFlux 应用程序。 Noode的单核是瓶颈, 当我将后端服务器更改为 WebFlux 应用程序时,它显示了最大 tps,
现在我觉得这个示例项目没有什么奇怪的地方。
谢谢大家。
-- 顺便说一句,现在我需要回到我公司项目的原始问题。 ,它的低性能。 现在它调整了 WebClient 不是问题。
谢谢大家