epoll_wait()高占用

mongoose_V7.8搭httpServer服务器长时间运行后,CPU出现高占用
程序运行在开发板中:aarch64 aarch64 GNU/Linux

使用gstack捕捉到的堆栈信息如下:

#0 0x0000ffff8f3fdf44 in epoll_pwait () from /lib/libc.so.6 
#1 0x000000000053bd84 in mg_iotest (mgr=0xffff78000b40, ms=1000) at /home/gaojie/RSU/common/net/mongoose/mongoose.c:4500 
#2 0x000000000053bf08 in mg_mgr_poll (mgr=0xffff78000b40, ms=1000) at /home/gaojie/RSU/common/net/mongoose/mongoose.c:4604 
#3 0x0000000000513e24 in HttpServer::Start (this=0xffff78000b20) at /home/gaojie/RSU/common/net/Http/Http.cpp:200 

相关代码段(参考官方示例:mongoose/examples/multi-threaded/

void thread_function(void *param)
{
    struct userdata *p = (struct userdata *) param;
    // Respond, wakeup event manager
    std::string url = std::string(p->uri.ptr, p->uri.len);
    std::string body = std::string(p->body.ptr, p->body.len);
    INF(RSUSTATE, "thread_function start pthreadId:%lu url:%s", pthread_self(), url.c_str());
    auto it = s_handler_map.find(url);
    if (it != s_handler_map.end()){
        ReqHandler handle_func = it->second;
        handle_func(url, body, p, sendHttpRsp);
        INF(RSUSTATE, "thread_function doing success url:%s", url.c_str());
    }
    else{
        // 未注册url-发送错误信息
        send(p->sock, RSP_ERR, strlen(RSP_ERR), 0);
    }
    close(p->sock);               // Close the connection
    free((void *) p->body.ptr);   // free body
    free((void *) p->uri.ptr);   // free uri
    free(p);                      // free userdata
    INF(RSUSTATE, "thread_function doing close url:%s", url.c_str());
}

void onHttpEvent(mg_connection *c, int ev, void *ev_data, void *fn_data)
{
    if (ev == MG_EV_HTTP_MSG) {
        mg_http_message *hm = (struct mg_http_message *) ev_data;
        userdata *data = (userdata *)calloc(1, sizeof(*data));  // worker will free it
        data->body = mg_strdup(hm->body);              // worker will free it
        data->uri = mg_strdup(hm->uri);                 // worker will free it
        data->sock = mg_mkpipe(c->mgr, _pipeEvent, c, true);  // Create pipe
        start_thread(thread_function, data);  // Start thread and pass data
    }
      else if (ev == MG_EV_CLOSE) {
        if (c->fn_data != NULL){
            _unlink_conns(c, (mg_connection *)c->fn_data);
        }    
      }
}
诚信请教大

img


牛的解答