Linux Device Drivers

節制printk訊息產生速率

 

        一般而言,正常運作狀態下不應該產生任何訊息,只有在發生了須要注意的異常狀態時,才可使用printk()

        但是printk()也是有被包含在無窮回圈裡的可能而導致嚴重的後果。對於需要偶爾輸出提醒訊息的情況,最好的解法是設立一個有調節作用的工具函式。

           int printk_ratelimit(void);

        每當你打算輸出可能會被經常重複的訊息之前,應該要先呼叫此函式,若傳回非零值才可印出訊息。範例如下:

 

Makefile

CFILES=hello.c

APP=prtk

KERNELDIR ?= $(shell pwd)/../../..

PWD := $(shell pwd)

 

obj-$(CONFIG_EMIL_LDD) := $(APP).o

$(APP)-objs := $(CFILES:.c=.o)

 

default:

           $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

 

clean:

           $(MAKE) -C $(KERNELDIR) M=$(PWD) clean

 

hello.c

#include <linux/init.h>

#include <linux/module.h>

 

MODULE_LICENSE("Dual BSD/GPL");

static int __init_hello(void)

{

           int i=0;

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

                     if(printk_ratelimit())

                     printk(KERN_INFO "Hello, world(%d)\n",i);

           }

           return 0;

}

 

static void __exit_hello(void)

{

           printk(KERN_INFO "Goodbye, cruel world\n");

}

 

module_init(__init_hello);

module_exit(__exit_hello);

 

Test…

# insmod prtk.ko

Hello, world(0)

Hello, world(1)

Hello, world(2)

Hello, world(3)

Hello, world(4)

Hello, world(5)

Hello, world(6)

Hello, world(7)

Hello, world(8)

Hello, world(9)

#

# rmmod prtk.ko

Goodbye, cruel world

 

 

printk_ratelimit()的原理是追蹤已有多少訊息被送到操控台,若訊息量超過臨界點,printk_ratelimit()就傳回0,並丟棄訊息。

透過/proc檔案系統,可在user-space影響printk_ratelimit()的工作參數。

透過/proc/sys/kernel/printk_ratelimit可調整「間隔秒數」 - 訊息量超過臨界值之後,要等多少秒,才可以恢復訊息的傳達。

透過/proc/sys/kernel/printk_ratelimit_burst可調整「臨界值」 - 計算訊息量最多輸出量,計算單位是「列數」。

 

        printk_ratelimit預設為5

        printk_ratelimit_burst預設為10

創作者介紹

十年磨一劍

flykof 發表在 痞客邦 PIXNET 留言(0) 人氣()