thttpd服务器修改时间后导致CPU占用率过高

经过代码分析发现是thttpd服务的中timers.c文件中tmr_run函数的实现有些问题。
第一种情况当系统时间修改从小变大的过程中(例如:1971年变成2019年)且时间跨度够大则会导致该函数会一直去追赶系统时间而一直在该函数里面执行从而造成死循环,最终呈现的现象就是cpu占用过高的情况最后被系统结束进程而退出服务。针对该问题我们修改的方法是当系统时间变大且超过10分钟的情况下去调整一下定时器的时间,详细的修改见见第二个修改位置。
第二中情况当系统时间修改从大到小的过程中(例如:2019年变成1971年)且时间跨度够大则会导致定时器的时间一直会大于当前系统时间从而导致不会进入t→timer_proc回调函数中执行即不会喂狗最终会被本身的alarm检测程序异常的机制给认定程序异常而通过信号kill自身的进程而退出.针对该问题我们的修改方法是当系统时间变小且超过6分钟(因为定时器喂狗的超时时间就是6分钟)的情况下去调整定时器的时间,详细的修改见第二个修改的位置。

void
tmr_run( struct timeval* nowP )
    {
    int h;
    Timer* t;
    Timer* next;

    for ( h = 0; h < HASH_SIZE; ++h )
	for ( t = timers[h]; t != (Timer*) 0; t = next )
	    {
	    next = t->next;
	    /* Since the lists are sorted, as soon as we find a timer
	    ** that isn't ready yet, we can go on to the next list.
	    */
	    if ( t->time.tv_sec > nowP->tv_sec ||
		 ( t->time.tv_sec == nowP->tv_sec &&
		   t->time.tv_usec > nowP->tv_usec ) )
		{
		//*****************************************************************************
		//2.系统时间修改从大到小
			int msec = t->msecs / 1000L;
			if(t->time.tv_sec > nowP->tv_sec + msec)
			{
				t->time.tv_sec = nowP->tv_sec + t->msecs / 1000L;
				t->time.tv_usec = nowP->tv_usec + ( t->msecs % 1000L ) * 1000L;
			}
		//*****************************************************************************
			break;
		}
	    (t->timer_proc)( t->client_data, nowP );
	    if ( t->periodic )
		{
		/* Reschedule. */
		t->time.tv_sec += t->msecs / 1000L;
		t->time.tv_usec += ( t->msecs % 1000L ) * 1000L;
		if ( t->time.tv_usec >= 1000000L )
		    {
		    t->time.tv_sec += t->time.tv_usec / 1000000L;
		    t->time.tv_usec %= 1000000L;
		    }
		    //**********************************************
		    //1.系统时间修改从小变大
			if (t->time.tv_sec + 10*60 < nowP->tv_sec)  
				t->time.tv_sec = nowP->tv_sec;  
			//***********************************************
		l_resort( t );
		}
	    else
		tmr_cancel( t );
	    }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小坚学Linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值