這一步主要確定在不跑業務應用的情況下,系統及內核層面是否穩定運行,
正常狀態下,系統負載應該處于平穩狀態,如果出現過高或者忽高忽地,都屬于不正常狀態,這一方面可能是內核作業佇列中有任務堆積,另一方面,也可能是內核調度出現了問題,
產品開發中,我們通常都會認為內核應該沒有問題,但是,嵌入式開發有其特殊性,內核一般都會根據板載硬體做裁剪,也會針對板載硬體做一些驅動方面的開發,這就給內核的穩定性帶來了潛在的不利因素,鑒于內核的龐大及整體的復雜性,就進一步放大了這種不利因素的影響,結果就是,開發人員能力水平是否過關、測驗是否充分完備以及開發管理是否到位都會影響到內核的穩定性和系統性能的發揮,特別是驅動的修改或者增加,對驅動物件是否深入了解、對內核框架機制是否充分掌握顯得尤為重要,稍有不慎,就可能對內核穩定性和性能產生不良影響,
舉幾個本人在實際產品開發中遇到過的例子,
第一個是一款三星芯片產品,買的開發板,前期使用中,就發現串口命令列中連續回車,比如按住回車鍵不放,輸出#的程序中,一會就卡頓一下,剛開始還沒在意,但是在后面移植應用后,產品表現不正常,之前流暢的音頻,現在就總是過一會卡一下,看ALSA列印,報pipe超時錯誤,在整體應用負載不高的情況下,說明內核被某個東西非正常占住了,比如在驅動中不正確的使用udelay,就很可能導致這樣的問題,后來換了一家的開發板,還是同一款CPU,就不存在上述問題,
第二個是一款IPTV產品,前期測驗一直都正常,最后都出貨了,結果在部分用戶家出現聯網問題,跟蹤驗證,發現協議堆疊報了一個奇怪的錯誤,通過分析,原因是網路資料包可以接收,但是發送錯誤,當問題范圍縮小后,就到內核網卡驅動中查找,最后確定是驅動中發送計數有問題,運行一段時間后,導致邏輯判斷出問題,資料無法發送,
第三個也是與網路有關,抓包看,資料發送是正常的,但是接收每過一段時間就會延遲幾百毫秒,因為上層業務是接收后轉發,這就導致轉發后看到的視頻畫面每過一會就卡頓一下,反反復復排查,發現網路接收的中斷計數會突然集中增加,最后根據這個線索,將問題鎖定在了網卡驅動接收中斷處理中,
通過上面幾個例子,我們看到,實際產品開發中可能會遇到各種奇奇怪怪的問題,在問題源上,內核并不能想當然的排除在外,但是,話又說回來,內核的問題一般比較隱蔽,不好排查,那有沒有什么比較好的辦法來規避呢?或者出現問題后,有好的查找策略?
其實查找BUG就如同給人看病,找到原因,一切都好辦,古代名醫扁鵲聲名在外,卻說這是因為自己治的都是末期之病,動輒扎針放血,人們以為自己很厲害,其實不然,自己的大哥能在病未有形時就發現并除之,自己的二哥也能在疾病初起之時將其清除,所以他們才更厲害,內核的穩定性也是同樣道理,與其后期辛苦治療,不如前期選擇治未病,這才是高明之舉,那有哪些措施可以在前期幫助我們篩選穩定的系統或檢測系統的穩定性呢?下面列舉一些,供大家在實際中參考:
1 建議大家盡量選擇大廠商的平臺,一般大廠的產品,測驗會比較完善,質量相對可靠,尤其是選擇這種偏底層基礎的東西,
2 如果產品比較特殊,無法選擇大廠通用平臺,那就需要做充分的測驗,盡早暴露問題,將問題扼殺在搖籃中,否則,每往后走一步,帶來的損失就可能十倍百倍的增加,所謂基礎不牢,地動山搖,不要指望到最后有彌補的措施,
3 如果有驅動開發,盡量選用成熟的設備及芯片,在此基礎上盡量選用設備或芯片廠家的驅動,哪怕是在demo基礎上修改,也比重新從頭開始寫要強,當然,如果開發人員經驗非常豐富,就另說了,
4 內核非常龐大、復雜,即使自己做測驗驗證,也要有所聚焦,收斂,避免盲目的攤開式的測驗,這就需要分析業務特點,縮小范圍,有重點的測驗驗證,比如開發一些基準測驗程式,做benchmark類的測驗,這種方法對專門的驅動進行驗證也是很有用的,
5 通過/proc/loadavg 可以“定量”的統計系統負載,在上述基準測驗中,可以以此作為系統穩定性的參考指標,
6 通過top命令可以“定量”的統計CPU占用較高的執行緒,在不跑任何業務程式的情況下,可以對整個系統的運行情況作一個初步的評判,
7 程式記憶體占用過高或者記憶體泄漏,也會導致系統卡頓,可以通過記憶體分析工具,“定量”的分析系統記憶體使用情況,進一步的評判系統穩定性,
8 對系統CPU和記憶體定量分析后,接下來就需要對IO指標進行測驗,上述驅動相關、業務相關的IO,要重點測驗,比如,模擬業務場景,做超壓測驗,最好是能做到翻倍,
9 通過內核提供的perf工具,分析熱點呼叫,這對于降低系統負載是有很大幫助的,
10 完成系統的整體測驗后,為了獲取更好的可靠性,還需要做一個長時間運行測驗,俗稱拷機測驗,通過該測驗,不僅可以規避一些時間和記憶體相關的問題,對硬體部分也是很好的驗證,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252233.html
標籤:其他
上一篇:Linux下的基本指令
下一篇:Linux下C語言的檔案操作
