免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2182 | 回复: 5
打印 上一主题 下一主题

[实践] redhat 6里sleep比5.4占用高很是为什么? [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-08 16:13 |只看该作者 |倒序浏览
本帖最后由 lolizeppelin 于 2013-06-08 16:14 编辑

发在c/c++那边没人理会,所以发来这边了,也算内核有点关系吧- -

#include <unistd.h>
#include <pthread.h>
#include <stdio.h>

void * Thread(void *lpvoid)
{
        while (1)
        {
                usleep(1000);
        }
        return lpvoid;
}

int main()
{
        for (int i =0; i<50; i++)
        {
                pthread_t tid;
                int eno = pthread_create (&tid, NULL, Thread, NULL);
                if (eno)
                {
                        printf("pthread_create err eno =%d\n",eno);
                        return 0;
                }
        }

        Thread(NULL);
        return 0;
}



这个代码在5.4系统上运行cpu 0

在6.1上运行就直接 10%

6系列redhat 内核改了啥,sleep占用高了那么多?




#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/timeb.h>


void wsleep(unsigned int MinSecond)
{
        timeval t_timeval;
        t_timeval.tv_sec  = MinSecond / 1000;
        t_timeval.tv_usec = MinSecond % 1000 * 1000 ;
        select( 0, NULL, NULL, NULL, &t_timeval );
}

void * Thread(void *lpvoid)
{
        while (1)
        {
                wsleep(1);
        }
        return lpvoid;
}

int main()
{
        for (int i =0; i<50; i++)
        {
                pthread_t tid;
                int eno = pthread_create (&tid, NULL, Thread, NULL);
                if (eno)
                {
                        printf("pthread_create err eno =%d\n",eno);
                        return 0;
                }
        }

        Thread(NULL);
        return 0;
}


换select也是一样都占用高

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2013-06-08 16:19 |只看该作者
用 time 比较一下在两个 OS 上跑的实际运行时间
看看有没有什么差别

另外,你那个 CPU 0 和 10% 是怎么的出来的,load?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
3 [报告]
发表于 2013-06-08 16:32 |只看该作者
top啊

top一看就直接10%啦

uptime 也上去啦

论坛徽章:
0
4 [报告]
发表于 2013-06-08 16:49 |只看该作者
本帖最后由 frank529 于 2013-06-08 16:49 编辑

有可能5.4只统计了用户区代码运行时间,而6统计了进程的用户区和内核区代码的运行时间。你这个程序开销全在线程切换上。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
5 [报告]
发表于 2013-06-15 14:35 |只看该作者
本帖最后由 lolizeppelin 于 2013-06-15 14:36 编辑
frank529 发表于 2013-06-08 16:49
有可能5.4只统计了用户区代码运行时间,而6统计了进程的用户区和内核区代码的运行时间。你这个程序开销全在 ...


不是的 程序实际运行也有问题了
这个问题现在还没解决

我在c++区也发了,那边大致给出


http://stackoverflow.com/questio ... leep-on-cent-os-6-3
樓主看這個帖子,可能會有些幫助。
我看了這個帖子後的理解是: 以前usleep實際作用出來的效果最小單位實際是1ms,所以在舊內核裏你usleep(1000)和usleep(1200)效果是一樣的。現在posix標準已經不推薦用usleep(),具體可以查看man手冊,而是推薦用nanosleep(),這是一個精確度高的多的sleep。在新內核裏,usleep()實際上會變成nanosleep(),通過strace就可以看到,由於顆粒小了非常多,cpu的消耗也變得大很多了,這樣才能更加準確。 所以這個帖子裏1樓推薦了一個解決辦法,就是用條件變量來代替定時輪詢。 不過他沒說啥叫條件變量,我覺着他的思路就是用系統中斷或者信號的手段來進行定時,比如用新內核提供的定時器這種。
不一定對哈,只是大概看了後的理解,第一次瞭解到這種東西。

又找到篇文章  http://www.tldp.org/HOWTO/IO-Port-Programming-4.html
這裏面說nanosleep在soft real time scheduling的進程裏是已busy waiting實現的(難道不會把進程掛起?),基本上就是死循環吧,cpu佔用高是肯定的了。


反正就是usleep精确度高了导致占用更多cpu时间了......
实际测试无论我用
select 还是usleep还是nanosleep,在rehat6.1里占用都会提高很多。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
6 [报告]
发表于 2013-08-23 11:58 |只看该作者
本帖最后由 lolizeppelin 于 2013-08-23 12:27 编辑

我终于找到原因了
就是因为2.6.21内核增加了高精时间
man 7 time
High-Resolution Timers
       Before Linux 2.6.21, the accuracy of timer and sleep system calls (see below) was also limited by the size of the jiffy.

       Since Linux 2.6.21, Linux supports high-resolution timers (HRTs), optionally configurable via CONFIG_HIGH_RES_TIMERS.  On a system that supports HRTs, the
       accuracy  of  sleep and timer system calls is no longer constrained by the jiffy, but instead can be as accurate as the hardware allows (microsecond accu-
       racy is typical of modern hardware).  


nanosleep 说明也改了,6.1的nanosleep
NAME
       nanosleep - high-resolution sleep

5.4的nanosleep
NAME
       nanosleep - pause execution for a specified time


解决方法启动内核里增加highres=off
highres=[KNL] Enable/disable high resolution timer mode.
Valid parameters: "on", "off"
Default: "on"

.............经过测试,这个参数能确实解决sleep占用高的问题,物理真机测试程序cpu占用直接从160%降到0。
但是,这个参数在云服务器(虚拟机)上是没有效果的,我之前在腾讯服务器上测试就没效果。
原因估计是因为云服务器的真机启动的时候没有highres=off,所以虚拟机内核使用这个参数实际是无效的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP