- 論壇徽章:
- 0
|
1.2.1 全局變量
從第106行開(kāi)始,都是POLLING相關(guān)的全局變量.首先是建立一SYSCTL樹(shù)的節(jié)點(diǎn).下圖中的SYSCTL_NODE宏代表在父節(jié)點(diǎn)_kern下建立一個(gè)_kern_polling節(jié)點(diǎn).
SYSCTL_NODE(_kern, OID_AUTO, polling, CTLFLAG_RW, 0, "Device polling parameters");
下圖中的變量全部可用sysctl來(lái)查看,大部分都可以調(diào)整設(shè)置.這些全局變量都是使用宏SYSCTL_UINT把他們加入到_kern_polling節(jié)點(diǎn)下,成為該節(jié)點(diǎn)的葉子.之所以這樣,是因?yàn)榭梢酝ㄟ^(guò)用戶(hù)區(qū)來(lái)調(diào)整這些參數(shù).
-----------------------------------------------------------------------------------------------------
static u_int32_t poll_burst = 5; ------ kern_poll.cstatic u_int32_t poll_each_burst = 5;
static u_int32_t poll_burst_max = 150;
static u_int32_t poll_in_idle_loop=0;
u_int32_t poll_in_trap;
static u_int32_t user_frac = 50;
static u_int32_t reg_frac = 20 ;static u_int32_t short_ticks;
static u_int32_t lost_polls;
static u_int32_t pending_polls;
static int residual_burst = 0;
static u_int32_t poll_handlers;
static int polling = 0;
static u_int32_t phase;
static u_int32_t suspect;
static u_int32_t stalled;
static u_int32_t idlepoll_sleeping; ------ kern_poll.c
----------------------------圖1-2-2 ----------------------------
在圖1-2-2中.這些變量按功能分可分為 3 大類(lèi).
A. 開(kāi)關(guān)型:
polling: 初始為0,即默認(rèn)為不打開(kāi)輪詢(xún)功能.要打開(kāi)輪詢(xún)功能,必須用:
#sysctl kern.polling=1
poll_in_idle_loop:該參數(shù)用于poll_idle函數(shù),用來(lái)確定是否進(jìn)入一低優(yōu)先權(quán)的循環(huán)輪詢(xún)中.即CPU空閑時(shí)是否來(lái)執(zhí)行輪詢(xún).
poll_in_trap:此參數(shù)不但是在陷入時(shí)是否執(zhí)行輪詢(xún)的開(kāi)關(guān),而且其值也是在陷入(trap)時(shí)執(zhí)行多少次輪詢(xún)
B. 算法參數(shù)
poll_each_burst:一個(gè)基本的輪詢(xún)次數(shù),很多其他變量都來(lái)和他進(jìn)行比較(主要是空閑時(shí)執(zhí)行輪詢(xún)或陷入時(shí)執(zhí)行輪詢(xún)).該值系統(tǒng)默認(rèn)是5,
poll_burst:一個(gè)動(dòng)態(tài)的輪詢(xún)次數(shù),主要用于根據(jù)核心(輪詢(xún))占用的時(shí)間片調(diào)整輪詢(xún)次數(shù),在核心(輪詢(xún))時(shí)間片小于預(yù)定的時(shí)間片時(shí),該值加1,當(dāng)核心(輪詢(xún))時(shí)間片過(guò)長(zhǎng),導(dǎo)致丟失一個(gè)或更多的時(shí)鐘嘀嗒時(shí),該值將減去該值的8分之1.這種算法是FreeBSD中輪詢(xún)技術(shù)的主要算法.當(dāng)然有一定的局限性.當(dāng)網(wǎng)絡(luò)分組快速增加時(shí),此算法只是加1來(lái)增加次數(shù)再來(lái)調(diào)用軟件中斷,從而形成軟中斷暴增的做法并不好.而且在占用時(shí)間片過(guò)長(zhǎng)時(shí)的減8分之1的做法也缺少理論依據(jù).
poll_burst_max:輪訓(xùn)的最大值,該值是用來(lái)限制poll_burst在累加過(guò)程中的最大量.當(dāng)然該值可以調(diào)整.他的調(diào)整范圍在后面講的兩個(gè)宏之內(nèi).
user_frac:用戶(hù)區(qū)占用的CPU時(shí)間片的百分比.該值用來(lái)確定核心(輪詢(xún))所占時(shí)間片是否有剩余,如果有的話就調(diào)整動(dòng)態(tài)值poll_burst,使其加1.
residual_burst:在正常的輪詢(xún)次數(shù)中,都是以poll_each_burst為標(biāo)準(zhǔn)的,而當(dāng)動(dòng)態(tài)的poll_burst>poll_each_burst時(shí)候,就會(huì)產(chǎn)生剩余沒(méi)輪詢(xún)的次數(shù),該次數(shù)就是residual_burst,當(dāng)然其結(jié)果就是繼續(xù)輪詢(xún)完residual_burst.
idlepoll_sleeping:該值的使用前提是poll_in_idle_loop變量開(kāi)關(guān)已經(jīng)打開(kāi),即在CPU空閑時(shí)支持輪詢(xún).系統(tǒng)置該值為0,可以直接進(jìn)入到CPU空閑時(shí)的輪詢(xún)代碼中;如果poll_in_idle_loop變量開(kāi)關(guān)還沒(méi)開(kāi)放,系統(tǒng)會(huì)給該值置1,也就是說(shuō).該值其實(shí)是一個(gè)CPU空閑時(shí)是否進(jìn)入輪詢(xún)代碼的狀態(tài),
reg_frac:在整個(gè)循環(huán)代碼執(zhí)行了該值的次數(shù)之后,就進(jìn)行檢查網(wǎng)卡的狀態(tài)寄存器.看看網(wǎng)卡是否有什么問(wèn)題.
pending_polls:在進(jìn)入輪詢(xún)前(我們有個(gè)時(shí)鐘嘀嗒鉤子函數(shù)),此參數(shù)加1,再輪詢(xún)后會(huì)對(duì)其減1,再次進(jìn)入時(shí)鐘嘀嗒后半部分會(huì)判斷是否平衡,如果由于輪詢(xún)時(shí)間過(guò)長(zhǎng),此次嘀嗒便會(huì)錯(cuò)過(guò).
C. 調(diào)試與參考
short_ticks:每次時(shí)鐘嘀嗒鉤子函數(shù)所花的時(shí)間如果小于5毫秒.那這種間隔時(shí)間太短了.這是以HZ=100來(lái)計(jì)算的.源代碼作者認(rèn)為.在100M卡時(shí),HZ數(shù)調(diào)整到1000比較合適,那么我們的時(shí)鐘嘀嗒鉤子函數(shù)所花時(shí)間在小于0.5毫秒是合適的.
lost_polls: 由于pending_polls的不平衡.記錄一次嘀嗒時(shí)間錯(cuò)過(guò),該值會(huì)不停的累加,給系統(tǒng)管理員提示可以調(diào)整poll_burst_max值小一些.或根據(jù)情況把user_frac(用戶(hù)占用CPU時(shí)間片的百分比)的值調(diào)的更小些.
poll_handlers:有多少個(gè)網(wǎng)絡(luò)設(shè)備支持并注冊(cè)了輪詢(xún).
phase:指示輪詢(xún)進(jìn)行到了哪個(gè)階段.輪詢(xún)代碼共分為6個(gè)階段.
0階段代表是初始階段或上次輪詢(xún)的結(jié)束.
1階段時(shí)鐘嘀嗒鉤子函數(shù)在設(shè)置網(wǎng)絡(luò)軟中斷(輪詢(xún)中斷)前
2階段時(shí)鐘嘀嗒鉤子函數(shù)在設(shè)置網(wǎng)絡(luò)軟中斷(輪詢(xún)中斷)后.
3階段是進(jìn)入軟中斷netisr_poll前.
4階段是從軟中斷netisr_poll中出來(lái).
5階段是進(jìn)入軟中斷netisr_pollmore前
6階段是從軟中斷netisr_pollmore中出來(lái).
suspect:由于最后的軟中斷netisr_pollmore在處理時(shí)會(huì)再完成時(shí)把階段標(biāo)志phase置為0(即一次POLLING的完成,),或出現(xiàn)其他未完成情況時(shí)進(jìn)入階段5和6.那么就是說(shuō).我們的時(shí)鐘嘀嗒鉤子在最初時(shí)小于2階段的話,一定是在0階段.如果出現(xiàn)1或2階段的話就意味著時(shí)鐘硬件中斷發(fā)生了嵌套.此值在出現(xiàn)這種問(wèn)題時(shí)進(jìn)行記錄.
stalled:由于pending_polls太大(大于100),也就是說(shuō)由于每次輪詢(xún)時(shí)間過(guò)長(zhǎng),以至于輪詢(xún)丟失了太多嘀嗒,當(dāng)?shù)竭_(dá)100次時(shí),該值加1.(源代碼的作者認(rèn)為不會(huì)發(fā)生此類(lèi)事情,除了在網(wǎng)卡激活時(shí))
以上是一些參數(shù)說(shuō)明,你可以參照下.(不過(guò)是基于5.3的)
另外,請(qǐng)開(kāi)空閑HOOK. |
|