c# - Owin.Websocket 超过消息大小导致 CPU 使用率高

标签 c# owin 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 网络套接字会出现意外行为,导致网络套接字转而使用空闲的 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/

相关文章:

c# - 构建用于测试的 HttpContext,如何指定 HttpRequest 是 POST?

c# - 如何重命名和重新映射具有非法 json 字段名称的字段

multithreading - 如何在 bash/replace text/CPU usage 中使函数在后台工作

c# - OwinStartup时如何使用DI容器

c# - 如何停止为图像请求调用 Identity Framework 的 OWIN Startup 类?

emacs - 在 emacs23 状态栏中显示 CPU 负载

计算 FLOP 次数和数据大小,并检查函数是受内存限制还是受 CPU 限制

c# - 如何从 python 脚本与 C# 暴露的接口(interface)进行通信?

c# - 使用C#删除硬盘驱动器上的可用空间

asp.net-web-api - 除了 OAuth OWIN/Web Api 之外的 API key