[英]Owin.Websocket exceeding message size causes high CPU usage
我正在使用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 Web套接字会产生意外行为,导致Web套接字使用空闲CPU。
我在我的个人电脑上尝试过它 - i7 -7700k 4个8线程,每个线程100%使用,我的记忆保持在2-3%左右,每两分钟左右跳跃到10-14%。
我不知道这种行为的原因,只知道你现在不应该超过消息大小,因为它会导致一个非常不可能的行为,我也试图看看是否有人发布了关于它的官方问题。
我可以(逻辑上)看到这种行为的一个原因是,当消息超出大小时,owin机制“担心”RAM内存不足以运行操作并且压碎因此它依靠cpu来处理虽然这只是我的假设。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.