Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Dashboard] TcpServer high CPU usage #259

Closed
Dynesshely opened this issue May 21, 2023 Discussed in #258 · 1 comment · Fixed by Crequency/KitX-Dashboard#25
Closed

[Dashboard] TcpServer high CPU usage #259

Dynesshely opened this issue May 21, 2023 Discussed in #258 · 1 comment · Fixed by Crequency/KitX-Dashboard#25
Labels
bug Something isn't working fixed This problem has been fixed

Comments

@Dynesshely
Copy link
Member

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);
@Dynesshely Dynesshely added bug Something isn't working working on We are working on this issue labels May 21, 2023
@github-actions
Copy link

Tracked by #223 .

@github-actions github-actions bot added the tracking This issue is tracking by another issue label May 21, 2023
@Dynesshely Dynesshely moved this to In Progress in KitX Project Todo-Lists May 21, 2023
Dynesshely added a commit to Crequency/KitX-Dashboard that referenced this issue May 21, 2023
Dynesshely added a commit that referenced this issue May 21, 2023
@github-project-automation github-project-automation bot moved this from In Progress to Done in KitX Project Todo-Lists May 21, 2023
@Dynesshely Dynesshely added fixed This problem has been fixed and removed working on We are working on this issue tracking This issue is tracking by another issue labels May 29, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working fixed This problem has been fixed
Projects
Development

Successfully merging a pull request may close this issue.

1 participant