免费注册 查看新帖 |

Chinaunix

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

求助内核调调度问题,请大侠出手 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-31 11:40 |只看该作者 |倒序浏览
有一个数据吞吐量较大的应用软件,是多线程的,每个线程均分数据,死循环从队列中取数据,取不到就休眠10微秒,取到就处理,在硬件、程序配置完全相同、处理的数据完全相同的情况下,在2.6.18下的CPU利用率要比2.6.9低10%(用mpstat 10比较的),请问这可能是2.6.18和2.6.9之间的区别造成的吗?

另外还有个问题:
还是上面的这个程序,在一个4 CPU的服务器上,如果它要处理的数据内容和大小都是固定的,那么程序跑4个线程或8个线程的运行时间是不是应该差不多,在程序运行的期间内CPU利用率是否也应差不多?

我在单位的4CPU的服务器上做了测试,发现4线程的CPU利用率要比8线程的高15%,但运行时间基本差不多,请问和系统的调度有关系吗?

最近在调试性能问题,面对这些已经束手无策了,请各位大哥给小弟一些建议啊

[ 本帖最后由 superfisha 于 2009-10-31 11:47 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-10-31 16:47 |只看该作者
个人觉得,线程的调度还是比较轻量级的,所以重点应该在以下两个方面:

第一,你的数据是从磁盘取的还是在内存中开出来的,从磁盘读取数据的话,会涉及到I/O调度问题

第二,什么情况下会取不到数据,从内存读数据本身就是很快的事情,10微妙的等待算比较长了,等待的次数会有很大影响

CPU使用率我想应该是 用户进程对CPU的占用时间/总时间吧,不是100%的话,肯定有idle插进来运行了,也就是说某些时刻,只有小于CPU数量的线程在运行,其他的都在等待什么,比如等待磁盘I/O,或者你设计的等待10微妙。因此,不是它们无法被调度到,或者调度的开销太大了,而是它们真的阻塞了。

论坛徽章:
0
3 [报告]
发表于 2009-10-31 17:33 |只看该作者
原帖由 chenda0.03 于 2009-10-31 16:47 发表
个人觉得,线程的调度还是比较轻量级的,所以重点应该在以下两个方面:

第一,你的数据是从磁盘取的还是在内存中开出来的,从磁盘读取数据的话,会涉及到I/O调度问题

第二,什么情况下会取不到数据,从内 ...


多谢大侠指点,数据在内存里面,是由驱动分配的若干个环形缓冲区,缓冲比较大(总共有512M),再mmap到用户态访问的。用户态有多少个线程,内核中就分配了多少个环形缓冲。在2.6.9内核下的CPU利用率是下面这样:
09:20:38 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
09:20:48 AM  all      19.38    0.00     1.55     0.34     0.01     0.06    0.00     0.00        78.65
09:20:58 AM  all      13.25    0.00     1.64     0.30     0.01     0.05    0.00     0.00        84.74
09:21:08 AM  all      15.73    0.00     1.75     0.21     0.00     0.08    0.00     0.00        82.23

在2.6.18下的CPU利用率是这样:
09:20:38 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
08:29:18 PM  all       6.93    0.00      0.83    0.19       0.00    0.03    0.00      0.00      92.03
08:29:28 PM  all       5.77    0.00      1.55    0.21       0.00    0.05    0.00      0.00      92.42
08:29:38 PM  all       5.49    0.00      1.40    0.23       0.00    0.04    0.00      0.00      92.85

可以看到就是user的cpu利用率下降了,其它基本一样,请问2.6.18是否在调度和内存管理方面有不同,我怀疑是两个原因造成的,一个是线程调度,还有一个是内存管理。会不会是2.6.18的tlb命中率比2.6.9的高或者是调度引起的呢? 如何查看tlb命中和失效的情况,请大侠帮忙

论坛徽章:
0
4 [报告]
发表于 2009-11-01 00:18 |只看该作者
TLB的情况其实与普通数据在cache中的情况比较类似,所以要从cache优化的话,需要比较高的水平了。

不过我还是觉得问题可能在其它方面,比如你的物理内存够不够大,有没有被交换出去的可能
我想看看你用户程序的代码,可以吗?这样方便探讨

论坛徽章:
0
5 [报告]
发表于 2009-11-01 10:47 |只看该作者
原帖由 chenda0.03 于 2009-11-1 00:18 发表
TLB的情况其实与普通数据在cache中的情况比较类似,所以要从cache优化的话,需要比较高的水平了。

不过我还是觉得问题可能在其它方面,比如你的物理内存够不够大,有没有被交换出去的可能
我想看看你用户程 ...


系统物理内存是8G,并且在驱动中对分配的内存执行了SetPageReserved,应该不会被交换了啊,用户程序本身也十分耗内存,但运行过程中始终没有消耗swap分区。问题是2.6.18比2.6.9节省8-10%的用户态CPU,十分搞不明白,有没有可能是CPU利用率统计不准啊

论坛徽章:
0
6 [报告]
发表于 2009-11-01 11:06 |只看该作者
原帖由 chenda0.03 于 2009-11-1 00:18 发表
TLB的情况其实与普通数据在cache中的情况比较类似,所以要从cache优化的话,需要比较高的水平了。

不过我还是觉得问题可能在其它方面,比如你的物理内存够不够大,有没有被交换出去的可能
我想看看你用户程 ...

不好意思,用户程序的代码我没有啊,我是模拟它的行为和处理负载写了个模拟程序,效果和真正的用户程序一样,都是频繁地对返回的数据进行访问,主线程启动后生成八个子线程(SMP系统,8个vcpu),每个子线程像下面这样:

while (1)
{
      data_ptr = get_data(thread_id); /* 从ring buffer 取个数据块 */
      if (ptr==0)
      {
           usleep(10);
           continue;
      }   
   
    data_len = get_data_size(data_ptr); /* 获取数据块长度 */
      for (i = 0; i < 4; i ++)    /* 按数据长度逐字节拷贝四次,模拟用户程序负载 */
          for (j = 0; j < data_len; j ++)
              *(dest_ptr + j) = *(data_ptr + j);   /* dest_ptr 是线程内的全局缓冲区 */

}

论坛徽章:
0
7 [报告]
发表于 2009-11-01 14:00 |只看该作者
“if (ptr==0)”这个条件什么情况下会成立呢

论坛徽章:
0
8 [报告]
发表于 2009-11-01 14:35 |只看该作者
原帖由 chenda0.03 于 2009-11-1 14:00 发表
“if (ptr==0)”这个条件什么情况下会成立呢

缓冲区中没有数据的时候ptr==0

论坛徽章:
0
9 [报告]
发表于 2009-11-01 15:58 |只看该作者
原帖由 superfisha 于 2009-11-1 14:35 发表

缓冲区中没有数据的时候ptr==0


额。。。我还奇怪为什么要环形缓冲,原本以为就是重复地读而已。。。那写的一端是定时的还是谁去唤醒它呢?

论坛徽章:
0
10 [报告]
发表于 2009-11-01 16:21 |只看该作者
原帖由 chenda0.03 于 2009-11-1 15:58 发表


额。。。我还奇怪为什么要环形缓冲,原本以为就是重复地读而已。。。那写的一端是定时的还是谁去唤醒它呢?


呵呵,用环是因为驱动需要异步地往环里面放数据,写的一端是定时的,在内核中1ms调度一次,如果有数据就放到环里面。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP