【案例分享】Suse系統(tǒng)中Lvcreate 報(bào)錯(cuò)處理

故障描述?
接到客戶(hù)電話,告知一臺(tái)SuSE Linux系統(tǒng)在使用lvcreate創(chuàng)建lv時(shí)提示io_setup failed,無(wú)法創(chuàng)建lv,進(jìn)而導(dǎo)致用戶(hù)的應(yīng)用數(shù)據(jù)無(wú)法落盤(pán),需進(jìn)行排查解決。
故障分析?
01報(bào)錯(cuò)輸出

通過(guò)圖中報(bào)錯(cuò)可以看到io_setup返回失敗,且創(chuàng)建io engine失敗,由此可以進(jìn)一步分析io_setup系統(tǒng)調(diào)用的具體作用。
02報(bào)錯(cuò)分析
通過(guò)查看io_setup的man page手冊(cè)可以看到如下:

可以看到io_setup是用來(lái)創(chuàng)建一個(gè)異步I/O上下文的。
查看系統(tǒng)的異步I/O上下文內(nèi)核參數(shù)aio-nr和aio-max-nr的說(shuō)明如下:

由aio-nr和aio-max-nr的解釋可以看到:aio-nr是io_setup系統(tǒng)調(diào)用中所有當(dāng)前活動(dòng)的aio上下文指定事件總數(shù)的運(yùn)行總和。如果aio-nr達(dá)到aio-max-nr,那么io_setup將在EAGAIN中失敗。
查閱io_setup的返回值對(duì)應(yīng)關(guān)系如下:

可以看到,返回0為成功,對(duì)應(yīng)ERRORS下方可以看到EAGAIN的返回提示為指定的nr_events超出了用戶(hù)在/proc/sys/fs/aio-max-nr中定義的可用事件的限制,aio-nr和aio-max-nr的解釋符合用戶(hù)的報(bào)錯(cuò)。由此可以看出,應(yīng)該是系統(tǒng)的aio-max-nr的值超過(guò)了限制導(dǎo)致無(wú)法執(zhí)行l(wèi)vcreate。
03查看系統(tǒng)配置

我們查看了系統(tǒng)配置后發(fā)現(xiàn)aio-max-nr的大小為65535,而在SuSE操作系統(tǒng)上aio-max-nr的值默認(rèn)為1048576;客戶(hù)配置的65535嚴(yán)重低于系統(tǒng)默認(rèn)配置導(dǎo)致無(wú)法創(chuàng)建lv。
故障處理
將aio-max-nr的值調(diào)整為1048576,調(diào)整方法如下:

調(diào)整后則可以創(chuàng)建lv。
經(jīng)驗(yàn)總結(jié)
01. aio-max-nr介紹
Linux aio是Linux下的異步讀寫(xiě)模型。Linux異步 I/O 是Linux內(nèi)核中提供的一個(gè)相當(dāng)新的增強(qiáng)模型。它是 2.6 版本內(nèi)核的一個(gè)標(biāo)準(zhǔn)特性。對(duì)于文件的讀寫(xiě),即使以O(shè)_NONBLOCK方式來(lái)打開(kāi)一個(gè)文件,也會(huì)處于"阻塞"狀態(tài)。因?yàn)槲募r(shí)時(shí)刻刻處于可讀狀態(tài)。而從磁盤(pán)到內(nèi)存所等待的時(shí)間是驚人的。為了充分使用把數(shù)據(jù)從磁盤(pán)復(fù)制到內(nèi)存的這段時(shí)間,引入了aio模型。
AIO 背后的基本思想是允許進(jìn)程發(fā)起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知時(shí),進(jìn)程就可以檢索 I/O 操作的結(jié)果。proc 文件系統(tǒng)包含了兩個(gè)虛擬文件,它們可以用來(lái)對(duì)異步 I/O 的性能進(jìn)行優(yōu)化:/proc/sys/fs/aio-nr 文件提供了系統(tǒng)范圍異步 I/O 請(qǐng)求現(xiàn)在的數(shù)目。/proc/sys/fs/aio-max-nr 文件是所允許的并發(fā)請(qǐng)求的最大個(gè)數(shù)。
02. aio-max-nr值設(shè)置多少合適?
在實(shí)際生產(chǎn)環(huán)境中,aio-max-nr的值具體設(shè)置多少合適還需要看應(yīng)用啟動(dòng)時(shí)所需的aio slot,例如MySQL默認(rèn)是啟用innodb_use_native_aio,使用異步 I/O 操作,如果MySQL啟動(dòng)時(shí)所需的 aio slot 超過(guò)系統(tǒng)當(dāng)前fs.aio-max-nr設(shè)置,則無(wú)法啟動(dòng)報(bào)錯(cuò),因?yàn)樵赟uSE中默認(rèn)的值是1048576,建議至少設(shè)置為系統(tǒng)的默認(rèn)值。