Skip to content

[Dashboard] TcpServer high CPU usage #259

@Dynesshely

Description

@Dynesshely

Discussed in #258

经过初步检查, 初步判定并不是代码编写逻辑的问题, 而是 TcpListener.Pending 方法占用 CPU 资源过多, 相关代码如下:
Network/DevicesServer.cs

    /// <summary>
    /// 接收客户端
    /// </summary>
    private static void AcceptClient()
    {
        var location = $"{nameof(DevicesServer)}.{nameof(AcceptClient)}";

        try
        {
            while (keepListen && listener is not null)
            {
                if (listener.Pending()) // <- HERE
                {
                    var client = listener.AcceptTcpClient();

                    if (client.Client.RemoteEndPoint is not IPEndPoint endpoint) continue;

                    clients.Add(endpoint.ToString(), client);

                    Log.Information($"New device connection: {endpoint}");

                    ReceiveMessage(client);
                }
            }
        }
        catch (Exception ex)
        {
            Log.Error(ex, $"In {nameof(location)}: {ex.Message}");

            Status = ServerStatus.Errored;
        }
    }

Network/PluginsServer.cs

    /// <summary>
    /// 接收客户端
    /// </summary>
    private null void AcceptClient()
    {
        var location = $"{nameof(PluginsServer)}.{nameof(AcceptClient)}";

        try
        {
            while (keepListen && listener is not null)
            {
                if (listener.Pending()) // <- HERE
                {
                    var client = listener.AcceptTcpClient();

                    if (client.Client.RemoteEndPoint is not IPEndPoint endpoint) continue;

                    clients.Add(endpoint.ToString(), client);

                    Log.Information($"New plugin connection: {endpoint}");

                    ReceiveMessage(client);
                }
            }
        }
        catch (Exception ex)
        {
            Log.Error(ex, $"In {location}: {ex.Message}");

            Status = ServerStatus.Errored;
        }
    }

占用情况如图. 基本上占用一半的资源, 另一半则是 sockets 库

image

修改建议为适当增加线程休眠时间, 如:

Thread.Sleep(500);

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixedThis problem has been fixed

    Type

    No type

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions