分类:
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的出现。
我猜想这里面的机制也是类似的。不管如何,这是一种看行之有效的方法。