找回密码
 新注册用户
搜索
查看: 5306|回复: 13

强力激活DLB的辅助小程序

[复制链接]
发表于 2012-8-3 00:09:00 | 显示全部楼层 |阅读模式
本帖最后由 cuda 于 2012-8-7 13:18 编辑

DLB是SMP/BA包中使用到的一种并行计算的优化技术,根据包的不同,DLB on比DLB off可以提升3-10%的PPD。
但是DLB只能自动激活,不受参数控制,如果碰巧DLB没被激活,就会白白造成PPD的损失。
thekraken插件的autorestart功能可以极大地提升DLB出现的几率,但有时会出现一些非常顽固的包,即使用了thekraken仍然很难激活DLB。对于这些顽固的包不妨用本文中的强力激活程序(cpubusy)来试试,根据我的测试基本上都能成功打开DLB(但是仍然不能保证100%)。

cpubusy使用方法:
如果发现当前运行的包没有激活DLB,那么:
1、中止所有FAH进程
2、运行cpubusy,语法为:
  1. ./cpubusy N
  2. 其中N通常取CPU线程数的一半
复制代码
3、重新启动FAH进程
4、等待几分钟,然后观察DLB是否开启,如果开启了就可以人工关闭cpubusy,或者等待5分钟后cpubusy自动关闭。
人工关闭cpubusy的命令是:
  1. killall -9 cpubusy
复制代码
注意,cpubusy提升DLB几率的原理是和fah程序抢占CPU。如果因为某些bug 5分钟后cpubusy没有自动关闭,那么必须人工关闭,否则会严重影响PPD。
此外,目前的版本因为需要人工干预,不大适合频繁使用,只适合测试用途。将来可考虑改进为自动版本。

12-08-03更新至0.2版:昨天的版本(cpubusy.rar)有问题, 5分钟不能退出。感谢wpf999发现bug。
12-08-07更新:才发现thekraken 0.7-pre11中已经应用类似技术,本程序显得有些多余了,建议直接用thekraken。详见http://www.equn.com/forum/viewthread.php?tid=34875
cpubusy-0.2.rar (2.68 KB, 下载次数: 3743)

cpubusy.rar

2.67 KB, 下载次数: 3158

评分

参与人数 4基本分 +27 收起 理由
wpf999 + 8 cuda兄弟高手
金鹏 + 10 精品文章
Lynt + 5 强力!
Keyco + 4 我最多只能给4分,哎

查看全部评分

回复

使用道具 举报

发表于 2012-8-3 01:01:49 | 显示全部楼层
DLB是SMP/BA包中使用到的一种并行计算的优化技术,根据包的不同,DLB on比DLB off可以提升3-10%的PPD。
但 ...
cuda 发表于 2012-8-3 00:09



    CUDA兄完全达到了可以和洋人火拼的程度了。牛!
回复

使用道具 举报

发表于 2012-8-3 08:50:40 | 显示全部楼层
强力顶,虽然现在我还没机会用到
回复

使用道具 举报

发表于 2012-8-3 09:06:30 | 显示全部楼层
本帖最后由 金鹏 于 2012-8-3 09:37 编辑

回复 1# cuda

这个是多路机器的甜点啊,兄弟牛大了

已加入汇总技巧贴
回复

使用道具 举报

发表于 2012-8-3 11:20:35 | 显示全部楼层
程序是LZ自己编写的?
回复

使用道具 举报

发表于 2012-8-3 11:25:35 | 显示全部楼层
编译工具为 GCC 4.4.4
回复

使用道具 举报

 楼主| 发表于 2012-8-3 11:37:36 | 显示全部楼层
程序是LZ自己编写的?
wpf999 发表于 2012-8-3 11:20


是的。程序很简单,就是fork一些进程出来然后用sched_setaffinity按一定分布绑定到特定CPU上和FAH抢资源,造成FAH进程间CPU利用率不一,一般就能激发DLB了。
完整源代码如下:

  1. // cpubusy.c: version 0.1, 2012-08-02
  2. #define _GNU_SOURCE
  3. #include <sched.h>
  4. #include <stdio.h>

  5. int usage() {
  6.         printf("语法:./cpubusy N, 其中N的范围是8-32, 通常可取为CPU核数的一半.");
  7. }

  8. int main(int num, char *cmd[]) {
  9.         nice(20);
  10.         alarm(300);
  11.         if(num!=2) return usage();
  12.         int n=atoi(cmd[1]);
  13.         if(n<8 || n>32) return usage();
  14.         int i, j;
  15.         for(i=0; i<n; i++) {
  16.                 for(j=0; j<=i/4; j++) {
  17.                         if(fork()==0) return cpuset(i);
  18.                 }
  19.         }
  20.         while(1);
  21. }

  22. int cpuset(int i) {
  23.         cpu_set_t xx;
  24.         int ret;
  25.         CPU_ZERO_S(sizeof(xx), &xx);
  26.         *(int*)&xx=(1<<i);
  27.         ret=sched_setaffinity(getpid(), sizeof(xx), &xx);
  28.         while(1);
  29. }
复制代码
回复

使用道具 举报

发表于 2012-8-3 11:55:30 | 显示全部楼层
回复 7# cuda


    31行的死循环使cpuset()永远无法退出吧,貌似也没有5min后程序自动退出的代码

评分

参与人数 1基本分 +8 收起 理由
金鹏 + 8 卧虎藏龙

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-8-3 12:08:30 | 显示全部楼层
第12行的alarm设置了一个"闹钟",可以让程序5分钟后退出。但如果有未知的bug导致闹钟失效,就需要手工退出了。

回复  cuda


    31行的死循环使cpuset()永远无法退出吧,貌似也没有5min后程序自动退出的代码 ...
wpf999 发表于 2012-8-3 11:55
回复

使用道具 举报

 楼主| 发表于 2012-8-3 12:21:13 | 显示全部楼层
不好意思,刚才测试发现确实有bug。没注意到fork后alarm就失效了。谢谢!
升级到0.2版:
  1. // cpubusy.c: version 0.2, 2012-08-03
  2. #define _GNU_SOURCE
  3. #include <sched.h>
  4. #include <stdio.h>

  5. int usage() {
  6.         printf("语法:./cpubusy N, 其中N的范围是8-32, 通常可取为CPU核数的一半.");
  7. }

  8. int main(int num, char *cmd[]) {
  9.         nice(20);
  10.         alarm(300);
  11.         if(num!=2) return usage();
  12.         int n=atoi(cmd[1]);
  13.         if(n<8 || n>32) return usage();
  14.         int i, j;
  15.         for(i=0; i<n; i++) {
  16.                 for(j=0; j<=i/4; j++) {
  17.                         if(fork()==0) return cpuset(i);
  18.                 }
  19.         }
  20.         while(1);
  21. }

  22. int cpuset(int i) {
  23.         cpu_set_t xx;
  24.         int ret;
  25.         alarm(300);
  26.         CPU_ZERO_S(sizeof(xx), &xx);
  27.         *(int*)&xx=(1<<i);
  28.         ret=sched_setaffinity(getpid(), sizeof(xx), &xx);
  29.         while(1);
  30. }
复制代码
回复  cuda


    31行的死循环使cpuset()永远无法退出吧,貌似也没有5min后程序自动退出的代码 ...
wpf999 发表于 2012-8-3 11:55
回复

使用道具 举报

发表于 2012-8-3 12:23:59 | 显示全部楼层
支持
回复

使用道具 举报

发表于 2012-8-3 13:52:10 | 显示全部楼层
great great thanks!
折腾好手头第二台E5就用这个。目前实在受不了5个暴力风扇的噪音...
回复

使用道具 举报

发表于 2012-8-4 01:37:01 | 显示全部楼层
不明真相的群众路过顶帖
回复

使用道具 举报

发表于 2012-8-4 17:04:44 | 显示全部楼层
不懂呀  学习中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 新注册用户

本版积分规则

论坛官方淘宝店开业啦~
欢迎大家多多支持基金会~

Archiver|手机版|小黑屋|中国分布式计算总站 ( 沪ICP备05042587号 )

GMT+8, 2024-3-28 19:29

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表