嵌入式linux, sched: RT throttling activated问题求助大神
各位大神:
我最近升级嵌入式linux程序,结果出现这个错误: sched: RT throttling activated。出现的时机,就是我socket程序,select时收到数据时。我的Recv程序片段如下:
while(1)
{
FD_ZERO(&sfFds);
FD_SET(dwSckHandler,&sfFds);
stTmrOut.tv_sec = 5;
stTmrOut.tv_usec = 0;
if(select(dwSckHandler + 1,&sfFds,NULL,NULL,&stTmrOut) > 0)
{
dwRdLen = recv(dwSckHandler,ucRxBuf,(sizeof(ucRxBuf) - 1),0);
if(dwRdLen > 0)
{
uint8_t ucFrm[1024];
int32_t dwFrmLen = 0;
queue_push(sg_piTgNetRxQue,ucRxBuf,dwRdLen);
while((dwFrmLen = queue_has_tg_frame(sg_piTgNetRxQue)) > 0)
{
if(dwFrmLen < 1024)
{
queue_pop(sg_piTgNetRxQue,ucFrm,dwFrmLen);
LOGNOTICE("Parser 1 frame.Len:%d",dwFrmLen);
hdzlog_debug(ucFrm,dwFrmLen);
//Handle TG Rx Queue
tg_handle_rx(ucFrm,dwFrmLen);
}
else //Max frame len should be less than SCK_MAX_FRM_LEN,Queue Maybe err,
{
LOGERROR("Socket Rx Queue Err,flush rx queue.\n");
queue_flush(sg_piTgNetRxQue);
}
}
}
else
{
LOGNOTICE("SckDown.Errno:%d\n",errno);
if((dwRdLen < 0) && (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)) //Recv INTR
{
continue; //Continue Recv
}
else
{
LOGNOTICE("Recv Data Fail.Maybe Socket Down.\n");
br_tg_sckdown(pthread_self()); //Notify BusREq Tsk that this NET Recv Sck is down
while(1) //This sck is down, wait until BR-Tsk delete this tsk
{
pthread_testcancel();
}
}
}
}
else //No data comes,so output system state
{
char ucIP[PEER_IP_LENGTH] = {0};
if(getpeer_inf(dwSckHandler,ucIP) == 0)
{
LOGNOTICE("DevIP:%s is connected.",ucIP);
}
}
}
}
这个是一个pthread线程函数,专门负责接收Socket数据。每当收到数据,执行select(dwSckHandler + 1,&sfFds,NULL,NULL,&stTmrOut) 时,收到数据时,系统就会抛出sched: RT throttling activated,此时top查看CPU占用率,达到98%以上。想问一下,为啥执行select,会导致系统出现这个异常呢?那个socet句柄,是个正确的值啊。我accept连接后,socket句柄是8,Select时,句柄也是8啊,没错啊?为啥执行select会导致出现这个问题呢?有知道的大侠帮忙解答一下吧,多谢。
我最近升级嵌入式linux程序,结果出现这个错误: sched: RT throttling activated。出现的时机,就是我socket程序,select时收到数据时。我的Recv程序片段如下:
while(1)
{
FD_ZERO(&sfFds);
FD_SET(dwSckHandler,&sfFds);
stTmrOut.tv_sec = 5;
stTmrOut.tv_usec = 0;
if(select(dwSckHandler + 1,&sfFds,NULL,NULL,&stTmrOut) > 0)
{
dwRdLen = recv(dwSckHandler,ucRxBuf,(sizeof(ucRxBuf) - 1),0);
if(dwRdLen > 0)
{
uint8_t ucFrm[1024];
int32_t dwFrmLen = 0;
queue_push(sg_piTgNetRxQue,ucRxBuf,dwRdLen);
while((dwFrmLen = queue_has_tg_frame(sg_piTgNetRxQue)) > 0)
{
if(dwFrmLen < 1024)
{
queue_pop(sg_piTgNetRxQue,ucFrm,dwFrmLen);
LOGNOTICE("Parser 1 frame.Len:%d",dwFrmLen);
hdzlog_debug(ucFrm,dwFrmLen);
//Handle TG Rx Queue
tg_handle_rx(ucFrm,dwFrmLen);
}
else //Max frame len should be less than SCK_MAX_FRM_LEN,Queue Maybe err,
{
LOGERROR("Socket Rx Queue Err,flush rx queue.\n");
queue_flush(sg_piTgNetRxQue);
}
}
}
else
{
LOGNOTICE("SckDown.Errno:%d\n",errno);
if((dwRdLen < 0) && (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)) //Recv INTR
{
continue; //Continue Recv
}
else
{
LOGNOTICE("Recv Data Fail.Maybe Socket Down.\n");
br_tg_sckdown(pthread_self()); //Notify BusREq Tsk that this NET Recv Sck is down
while(1) //This sck is down, wait until BR-Tsk delete this tsk
{
pthread_testcancel();
}
}
}
}
else //No data comes,so output system state
{
char ucIP[PEER_IP_LENGTH] = {0};
if(getpeer_inf(dwSckHandler,ucIP) == 0)
{
LOGNOTICE("DevIP:%s is connected.",ucIP);
}
}
}
}
这个是一个pthread线程函数,专门负责接收Socket数据。每当收到数据,执行select(dwSckHandler + 1,&sfFds,NULL,NULL,&stTmrOut) 时,收到数据时,系统就会抛出sched: RT throttling activated,此时top查看CPU占用率,达到98%以上。想问一下,为啥执行select,会导致系统出现这个异常呢?那个socet句柄,是个正确的值啊。我accept连接后,socket句柄是8,Select时,句柄也是8啊,没错啊?为啥执行select会导致出现这个问题呢?有知道的大侠帮忙解答一下吧,多谢。
...全文
相关推荐
国央企创新负责人如何构建多维度的科技资源评价与配置体系?.docx
国央企创新负责人如何构建多维度的科技资源评价与配置体系?
《移动通信系统》全套PPT课件2026(西安电子科技大学)
《移动通信系统》全套PPT课件2026(西安电子科技大学)
Python3 json序列化常见报错
json只能序列化字符串、数字、列表、字典、布尔、空值。无法序列化datetime、bytes、自定义类对象,直接dumps会抛出类型错误。解决方案:自定义序列化函数,通过default参数传入,手动转换特殊对象。中文乱码:默认ensure_ascii=True会转义中文,改为False直接输出原生中文。反序列化loads注意:json字符串要求双引号,Python字典单引号字符串无法解析,需要提前替换引号。 lxwuhua.cn mayawalkermx.com mccia.com.cn lzsxgqscgs.com mftug.com
产业园区运营负责人如何精准对接区域技术成果与产业需求?.docx
产业园区运营负责人如何精准对接区域技术成果与产业需求?
科技中介服务机构如何提升科技成果评估服务的专业性与效率?.docx
科技中介服务机构如何提升科技成果评估服务的专业性与效率?



