異常測(cè)試模擬庫(kù) libfiu介紹

libfiu是一個(gè)故障注入的C庫(kù)。它提供用于標(biāo)識(shí)“故障點(diǎn)”(“核心API”)里面的代碼,功能啟用/禁用這些點(diǎn)的失?。ā翱刂艫PI”)。核心API內(nèi)部使用上要執(zhí)行故障注入代碼。控制API用于內(nèi)部測(cè)試代碼,以控制注入失敗。

原理:

libfiu是一個(gè)c庫(kù),可以用來(lái)模擬posix接口,使posix接口返回錯(cuò)誤。這也是libfiu實(shí)現(xiàn)的原理:當(dāng)用戶使用libfiu來(lái)測(cè)試程序時(shí),libfiu把其中的一些posix接口mock掉,比如測(cè)試程序需要調(diào)用系統(tǒng)的open()函數(shù),libfiu會(huì)將這個(gè)open()指向自己庫(kù)里面的函數(shù),然后直接返回posix錯(cuò)誤碼拋給測(cè)試程序。這時(shí)候我們可以觀測(cè)被測(cè)程序的表現(xiàn)來(lái)判斷異常處理能力。

?官方例子:

?比如我們有個(gè)程序是查看磁盤是否有足夠剩余空間

size_t free_space() {

? ? ? ? [code to find out how much free space there is]

? ? ? ? return space;

}

bool file_fits(FILE *fd) {

? ? ? ? if (free_space() < file_size(fd)) {

? ? ? ? ? ? ? ? return false;

? ? ? ? }

? ? ? ? return true;

}

而測(cè)試的時(shí)候,我們需要考慮free_space返回0的時(shí)候,也就是磁盤被寫滿的時(shí)候這個(gè)場(chǎng)景;但是真正寫滿磁盤是非常難的,就算能寫滿,每次寫滿也會(huì)耗費(fèi)非常長(zhǎng)的時(shí)間。而fiulib就可以使用下面的方法讓free_space在需要的時(shí)候返回0.

size_t free_space() {

? ? ? ? fiu_return_on("no_free_space", 0);

? ? ? ? [code to find out how much free space there is]

? ? ? ? return space;

}

bool file_fits(FILE *fd) {

? ? ? ? if (free_space() < file_size(fd)) {

? ? ? ? ? ? ? ? return false;

? ? ? ? }

? ? ? ? return true;

}

其實(shí)上面的方法就是你在free_space中加了一個(gè)注入點(diǎn),通過(guò)下面的方法來(lái)觸發(fā)注入的異常,然后進(jìn)行測(cè)試。當(dāng)然不觸發(fā)的情況下是不會(huì)產(chǎn)生作用的。

fiu_init();

fiu_enable("no_free_space", 1, NULL, 0);

assert(file_fits("tmpfile") == false);

使用方法:

1.比如我們測(cè)試ls這個(gè)命令,我們可以直接使用下面的命令,其中 -x 參數(shù)是告訴fiu-run當(dāng)程序調(diào)用posix api的時(shí)候注入錯(cuò)誤,name指向了具體的模塊,可以通過(guò)隨機(jī)的方法,控制錯(cuò)誤發(fā)生的概率。

fiu-run -x? -c"enable_random name=posix/io/*,probability=0.05"ls

下面是調(diào)大概率后和將概率調(diào)成0后的一些測(cè)試結(jié)果,可以看出ls這個(gè)系統(tǒng)命令在各種posix錯(cuò)誤下都有錯(cuò)誤提示返回,也沒(méi)有導(dǎo)致崩潰等情況,概率調(diào)成0后,也能正確返回結(jié)果:


2.也可以通過(guò)下面的方法進(jìn)行測(cè)試:

比如需要測(cè)試top命令:

可以在一個(gè)session中啟動(dòng)被測(cè)程序

fiu-run -x top

然后再另一個(gè)session中啟動(dòng)錯(cuò)誤注入

fiu-ctrl -c"enable name=posix/io/oc/open"`pidof top`

這時(shí)候我們可以觀測(cè)到top已經(jīng)沒(méi)有輸出了;

然后停止錯(cuò)誤注入,

fiu-ctrl -c"disable name=posix/io/oc/open"`pidof top`

top又能正常輸出了。

其實(shí)原理也很簡(jiǎn)單,前面已經(jīng)提到了,top需要讀取一些文件來(lái)展示信息,必然會(huì)調(diào)用open()這個(gè)函數(shù),而fiulib將系統(tǒng)的open()指向自己庫(kù)里面的open(),然后返回錯(cuò)誤給top,這樣top就沒(méi)法輸出了。這也是符合預(yù)期的。

libfiu支持的posix api錯(cuò)誤注入有很多,看官方介紹原來(lái)還能通過(guò)-i參數(shù)指定錯(cuò)誤類型,現(xiàn)在取消了這個(gè)功能(原因沒(méi)寫,隨機(jī)模式下實(shí)際作用也不大)。

?當(dāng)然,上面2個(gè)例子你可能覺(jué)得這個(gè)工具作用不是很大,只能測(cè)測(cè)簡(jiǎn)單的程序,但實(shí)際上對(duì)于復(fù)雜程序也能測(cè)試的。比如測(cè)試ceph。

root@pubt1-ceph64:~# fiu-run -x -c "enable_random name=posix/io/*,probability=0.8" /etc/init.d/ceph start osd.3/etc/init.d/ceph: error reading input file: Input/output errorroot@pubt1-ceph64:~# fiu-run -x -c "enable_random name=posix/io/*,probability=0.8" /etc/init.d/ceph start osd.3/bin/sh: /etc/init.d/ceph: No such file or directory

libfiu具體支持哪些庫(kù)我們也可以通過(guò)下面命令看到。類似于malloc() read() write() fork() mmap()以及一些 socket相關(guān)的都能模擬。

cat /root/libfiu-0.96/preload/posix/function_list

回到錯(cuò)誤注入這個(gè)話題,提供一些常見(jiàn)的錯(cuò)誤注入方法

?附錄:

Network Delay: Use tc like `tc qdisc add dev eth0 root netem delay 1000ms` to set network delay or recover.

Network Unavailable: Use iptable to block the specific port, like `iptables -A OUTPUT -p tcp --dport 3306 -j DROP `.

Network Bandwidth Limit: Use tc like `tc qdisc add dev eth0 root tbf rate 5800kbit latency 50ms burst 1540` to limit the bandwidth.

Disk Full: Use dd to create a really large file to fill up the disk, like `dd if=/dev/zero of=/$path/tst.img bs=1M count=20K `.

Disk Failure: Maybe use fiu-ctrl

Disk Slow: Use fio to write or read a lot making the disk under stress.

Memory Limit: Impl a program from??http://minuteware.net/simulating-high-memory-usage-in-linux/?.

CPU Limit: Use cpulimit from??https://github.com/opsengine/cpulimit?.

POSIX: fiulib

大規(guī)模分布式系統(tǒng)的測(cè)試的話題很大,難度也很高;可能隨著硬件環(huán)境的規(guī)?;蛘邩I(yè)務(wù)邏輯的差異,系統(tǒng)會(huì)走到不同的代碼分支。曾經(jīng)?看到阿里云飛天測(cè)試的時(shí)候,他們的系統(tǒng)里會(huì)加入Log Coverage工具,能夠通過(guò)程序在運(yùn)行過(guò)程中輸出的log進(jìn)行比對(duì),看看測(cè)試是否覆蓋了各個(gè)分支,同時(shí)也會(huì)拿到線上的log進(jìn)行比對(duì),補(bǔ)充各種各樣的測(cè)試場(chǎng)景。

在后期的穩(wěn)定性和異常測(cè)試中,最有效的保障還是讓測(cè)試框架隨機(jī)的挑選各種錯(cuò)誤觸發(fā),校驗(yàn)系統(tǒng)的可靠性及數(shù)據(jù)的正確性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容