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);
}
}
}
诚信请教大
牛的解答