如标题中所述,我目前无法找到我的应用程序中瓶颈所在的位置。这个问题不是特定于硬件的,因为我使用不同的硬件在不同的计算机上进行了测试。
我的应用程序是使用Qt的
5.15
框架、C++语言和Windows 10或更高版本开发的。
应用程序的目标是通过 HTTP 网络连接连接到处理受控机器的数据模型的服务器(另一个应用程序)。数据模型是表示机器状态的参数列表。服务器还允许检索一些“较重”的数据,例如要向用户显示的图像。
“客户端”应用程序使用 HTTP 协议和 PUT HTTP 方法发送消息并从服务器读回答案。当我使用 Qt 的库时,我的连接基于
QNetworkRequest
、QNetworkReply
和 QNetworkAccessManager
类来执行网络操作。
客户端应用程序使用自动轮询(两次轮询之间至少间隔 100 毫秒)从服务器获取更新。自动轮询只是
PUT
一个“GetUpdate”请求:接下来,发送到服务器的确切数据以请求数据模型的简单更新。
<?xml version="1.0" encoding="UTF-8"?>
<Request requestType="GetUpdated"/>
如果服务器处理了机器参数的更新,则此请求的答案将包含具有新值的特定参数。
<?xml version="1.0" encoding="utf-8"?>
<Response responseType="GetUpdated">
<Device Name="ServerCore" type="0">
<Parameter Name="DateTime" type="String">
<Actual>2024-10-09T15:42:52</Actual>
</Parameter>
</Device>
</Response>
上面有一个更新答案的例子。数据大小可能会根据更新的参数数量而变化。但我所有的性能分析都是基于这种数据大小。
当请求发送到服务器应用程序时,我创建一个
QElapsedTimer
来估计发送请求和服务器处理回复之间经过的时间。
问题是,当我在服务器和客户端之间使用“专用网络”架构时,对于我的应用程序来说,所花费的时间太长了。即使我的网络处理交换机/rooter/等,所花费的时间也类似于最简单的网络:直接从服务器连接到客户端的电缆。
~50ms maximum
如果我在同一台计算机上运行服务器和客户端(使用127.0.0.1),则经过的时间更容易接受。
~3ms maximum
为了确保
Data Link & Physical Layer
是真正的瓶颈,我创建了一个独立的Python应用程序来连接到服务器并进行与我的客户端相同的进程。对于相同的请求,我的 python 应用程序比专用网络上的 My Qt 应用程序更高效 (~5ms maximum
)。我的 python 应用程序使用 http.client
库 (https://docs.python.org/3/library/http.client.html)
所以我断定Qt是问题所在,但是为什么我在本地网络上可以有等效的延迟我不知道这是否真的是Qt的错。
为了减少 Qt 延迟,我尝试:
QNetworkReply
类的同步方法:waitForReadyRead
(https://doc.qt.io/qt-5/qiodevice.html#waitForReadyRead)QThread
。Priority
级别 (https://doc.qt.io/qt-5/qnetworkrequest.html#setPriority)但是他们都没有减少延迟。我不知道这是否真的是Qt的错。
如果是网卡的问题,为什么我的Python应用程序可以提高性能?
我用 WireShark 嗅探了连接以量化网络传输时间。我在两台计算机上运行wireshark并匹配相应的数据包以确定传输时间。 结果是:
我对这些新信息的问题是:WireShark 正在嗅探哪一层?
要解决这个问题,您必须找出延迟发生的位置。 例如:
这些可以通过检查 Wireshark 记录的时间戳来确定。
这将使您能够确定性能瓶颈是否位于网络层或以上。
其他要做的事情包括: