首页 > 解决方案 > socket通信时间成本太长

问题描述

我在Linux开发板上运行一段程序,发现CPU负载低的时候还可以,但是如果CPU负载达到高峰,时间会长很多。

下面是它的样子: 船上有 2 个程序正在运行。消费者应用程序有多个线程,它们会调用 func1 向生产者进程请求一些信息。生产者是一个守护进程,它将信息反馈给消费者进程。

示例代码如下所示:

消费者:

static int send_to_service(msg_t *cmd)
{
    int cnt = send(fd, cmd, sizeof(msg_t), MSG_WAITALL);
    if (cnt != sizeof(msg_t)) {
        log(L_ERROR, "send failed");
        return -1;
    }
    return 0;
}


static int func1(int aaa)
{
    struct_t msg = {...};
    msg.a = ...;
    msg.b = ...;    
    gettimeofday(time1, NULL);
    send_to_service(&msg);

    ...
}

制片人:

while(1) {

    gettimeofday(time2, NULL);
    int ret = select(maxfd+1, &fd_list, NULL, NULL, NULL);  
    gettimeofday(time3, NULL);
    for (int fd = 0; fd <= maxfd; fd ++) {
        if (!FD_ISSET(fd, &fd_list))                                            
           continue;
        ...
    }
}

在 CPU 高负载时间期间,time1 和 time3 之间的时间差可以超过 30ms+。而且它不会一直发生,只会偶尔发生一次。

我之前尝试过单进程方式,消费者调用驱动程序并直接获取信息。效果很好。现在我必须向系统添加另一个进程来获取相同的信息,所以我必须使用一个守护进程来为这两个进程提供数据。性能不如单一工艺方法。即使只有一个消费者。

我使用的系统是 Linux 版本 4.14.74,我不确定套接字类型和网络,两个消费者进程都在同一个系统中等待获取图像信息。我只是使用了提供的“发送、接收和选择”系统。

标签: clinuxsocketsselectcpu-load

解决方案


推荐阅读