当前位置: 首页 > 工具软件 > syj-ratelimit > 使用案例 >

printk_ratelimit()简介

文寒
2023-12-01
printk_ratelimit()简介
printk_ratelimit()可以避免printk产生阻塞
由于某些原因,频繁设置循环调用某个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的出现。我猜想这里面的机制也是类似的。不管如何,这是一种看行之有效的方法。 

 类似资料: