我正在使用 Owin.WebSocket库接收图像流到 Asp.Net WebAPI 应用程序。我已经使用 Owin.Websocket.WebSocketConnection
创建了一个 websocket 以从我的前端接收消息。
public class MyWebScoket : WebSocketConnection
{
protected MyWebScoket(int maxMessageSize = 65536) : base(maxMessageSize)
{
//logic
}
public override void OnClose(WebSocketCloseStatus? closeStatus, string closeStatusDescription)
{
//logic
}
public override Task OnMessageReceived(ArraySegment<byte> message, WebSocketMessageType type)
{
//logic
}
public override void OnOpen()
{
//logic
}
public override void OnReceiveError(Exception error)
{
//logic
}
}
当消息大小低于设置的消息大小时,API的CPU使用率正常,一切正常,但是当消息大小超过限制时,API的CPU使用率急剧增加,导致我的机器停止响应甚至鼠标点击。
这看起来很奇怪,因为消息发送速率总是相同的。
这种行为的原因是什么?
我在所有被覆盖的方法中添加了断点,但没有达到它们,我认为如果超过消息限制大小,执行应该转到 OnReceiveError。
欢迎任何解决方法/想法或替代方案。
最佳答案
我自己在测试时一直在努力解决这个问题,因为我不是专业人士。 看起来,如果不超过消息大小,owin web 套接字将不会使用太多 CPU 使用率,而是依赖于 RAM 内存,这样,当不超过时 - cpu 使用率在 2-4% 并且在顶部,10%,我的公羊在 5-8% 之间,并跃升至 13-14% 顶部。
但是,如果超出大小,owin 网络套接字会出现意外行为,导致网络套接字转而使用空闲的 CPU。
我在我的个人电脑上试过 - i7 -7700k 4 cors 8 线程,每个线程都被 100% 使用,我的内存保持在大约 2-3%,每两分钟跳到 10-14%左右。
我不知道这种行为的原因,只知道现在你不应该超过消息大小,因为它会导致非常不可能的行为,我也在尝试查看是否有人发布了关于它的官方问题.
我可以(从逻辑上)看到这种行为的一个原因是,当消息超过大小时,owin 机制“担心”RAM 内存不足以运行操作和粉碎,因此它依赖于 cpu处理压力,但这只是我的假设。
关于c# - Owin.Websocket 超过消息大小导致 CPU 使用率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48496697/