Chinaunix首页 | 论坛 | 博客
  • 博客访问: 921814
  • 博文数量: 276
  • 博客积分: 4182
  • 博客等级: 上校
  • 技术积分: 4486
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-17 21:14
文章分类

全部博文(276)

文章存档

2014年(9)

2013年(132)

2012年(135)

分类:

2012-10-31 14:21:31

X为自然数

echo 0 > /proc/sys/kernel/printk_ratelimit

由于某些原因,频繁设置循环调用某个printk的语句,将会造成CPU的拥堵,如果输入终端是慢速,就会造成拥堵,我们也不可能从这种狂刷屏幕上读取到什么有效信息,基本上就看不清。内核编程提供了一下保护机制。下面是一个测试的例子:

1 for (i = 0 ; i < 1000; i ++){

2    if(printk_ratelimit()){
3        printk(KERN_DEBUG "Test for ratelimte i = %d j = %d\n",i ,++j);
4    }
5 }
6 printk(KERN_NOTICE "After Test i = %d j = %d\n",i , j);

printk_ratelimit()根据打印的频繁程度返回的一个值,根据这个值我们决定是否将debug信息打印出来。这个返回值取决于两个因素,分别定义在
/proc/sys/kernel/printk_ratelimit
/proc/sys/kernel/printk_ratelimit_burst
前 者表示当这个值置为0后隔多少秒后恢复为1,即等待允许再次打印的时间(秒),后者可能和缓存队列长度有关,他表示在值为0之前,可以printk的条目 数。缺省值为5和10,也就是在printk_ratelimit()的控制下,每秒可以有两个输出。在上面的例子,我们看到输出了10次。我想象的 处理机制是,根 据printk_ratelimit_burst的值设置一个队列长度,如果这个队列满,则值printk_ratelimit()为 0,禁止新的消息加入队列,等待printk_ratelimit秒设定的时间,将 printk_ratelimit()设为1,即允许新的消息加入队列。这种方式我曾用于处理业务请求,设定允许接纳请求的频率,避免burst的出现。 我猜想这里面的机制也是类似的。不管如何,这是一种看行之有效的方法。

阅读(1441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~