小鵬社招面經(jīng)——Linux內(nèi)核穩(wěn)定性工程師
1.自我介紹
2.內(nèi)存泄露問題了解多少?如何定位?
像長時(shí)間老化發(fā)生卡頓、內(nèi)存不足觸發(fā)大量的lowmemorykiller或者oom、內(nèi)存分配失敗,這些都可以去懷疑內(nèi)存泄露。
內(nèi)核的內(nèi)存泄露,主要就是slab內(nèi)存泄露、ion內(nèi)存泄露、私有頁內(nèi)存泄露。
定位的話,我一般是,先監(jiān)控進(jìn)程ps內(nèi)存變化,確定內(nèi)存泄漏存在。第二,泄漏存在,對代碼進(jìn)行靜態(tài)掃描,解決所有掃出來的問題。第三,上內(nèi)存檢測工具,memchecker,valgrind都行,解決工具掃出來的問題。第四,帶上自定義的分配器或mtrace之類的上壓測,解決測出的問題。
3.什么是Cache一致性?
簡單來說,就是讀到的數(shù)據(jù)是舊數(shù)據(jù),Cache數(shù)據(jù)還沒同步過來
4.說下你做過的一些優(yōu)化?
說一個(gè)內(nèi)存相關(guān)的吧,riscv的linux內(nèi)核,對啟動(dòng)地址有個(gè)2M對齊的要求,原因是為了與OpenSBI對齊。因?yàn)镺penSBI默認(rèn)跳轉(zhuǎn)偏移是2M,但OpenSBI并不需要這么空間,這就導(dǎo)致中間有1M+內(nèi)存浪費(fèi),所以任務(wù)就是把這內(nèi)存映射起來。
怎么做呢?跟內(nèi)核代碼發(fā)現(xiàn),2M對齊要求,一方面是內(nèi)核對啟動(dòng)地址做了檢查,不符合直接觸發(fā)BUG_ON;另一方面,它的臨時(shí)頁表只建到了二級(jí)頁表,而二級(jí)頁表是2M的,沒有繼續(xù)建到三級(jí)頁表,所以尋址不能尋到更小地址。
因此最終就是,修改內(nèi)核,給這個(gè)啟動(dòng)用的臨時(shí)頁表,建立三級(jí)頁表,三級(jí)頁表是4K,只需要地址4K對齊就行。
5.CMA分配的內(nèi)存是哪種屬性,在cpu和dma之間共享的處理怎么保證一致性?
通過dma_alloc_coherent, dma_alloc_writecombine分配到的CMA內(nèi)存,都是non-cached,沒有cache一致性問題。
通過ION分配到的CMA內(nèi)存,可以映射成cached和non-cached。映射成cached的場合,可以使用流式DMA接口處理cache一致性。
6.對異常重啟類問題,有多少了解?
異常重啟,看是硬件還是軟件。硬件的話,通常更多是外部電源掉電,像通常的板子都會(huì)有外部電源過流保護(hù),觸發(fā)過流保護(hù)就會(huì)導(dǎo)致整板掉電和重啟。軟件的話,內(nèi)核panic是會(huì)重啟系統(tǒng)的,這個(gè)可以配置,panic了就要具體分析原因了。
7. 簡單說下什么是死鎖?
你要的鎖在我這,我要的鎖在你這,我倆都在等彼此釋放,但是釋放又要拿到鎖,陷入僵局死循環(huán)
8、說一下你遇到過的死鎖案例?
說一個(gè)關(guān)于原子上下文的死鎖吧,背景是做壓測時(shí),系統(tǒng)卡死,串口不可用,內(nèi)核報(bào)錯(cuò)INFO: rcu_preempt detected stalls on CPUs/tasks。
從報(bào)錯(cuò)log上看,cpu0檢測到cpu1 stalls了上千個(gè)jiffies,cpu1 stalls表示cpu1關(guān)閉了中斷和搶占,是無法調(diào)度出去了,所以cpu1一直是在running swapper/1線程,log也是一直在報(bào)running swapper/1的信息。
根據(jù)現(xiàn)象,認(rèn)為是死鎖問題,然后打開內(nèi)核的lockdep調(diào)試開關(guān),lockdep出現(xiàn)了死鎖log,提示在一個(gè)atomic的上下文中有去調(diào)用sleeping的接口,這是不允許的。因?yàn)樵由舷挛氖且粋€(gè)關(guān)中斷、關(guān)搶占的環(huán)境,所以一旦在會(huì)睡眠的接口中schedule出去了,cpu就再也無法調(diào)度了。
然后跟蹤代碼發(fā)現(xiàn),在使用spin_lock_irqsave加鎖后,繼續(xù)使用了mutex_lock。spin_lock_irqsave接口是會(huì)關(guān)中斷、關(guān)搶占的,不允許調(diào)度;而互鎖鎖會(huì)睡眠,一旦取不到鎖就會(huì)schedule出去,那cpu就無法調(diào)度了,出現(xiàn)cpu stalls。
最終解決就是直接去掉這段互斥鎖操作,因?yàn)橐呀?jīng)有自旋鎖做同步操作了。
9.有什么想問的
#校招##小鵬##嵌入式面經(jīng)#實(shí)際上,這些問題都是需要探討的,光是死鎖,我認(rèn)為都可以聊半小時(shí),時(shí)間有限簡單聊聊。穩(wěn)定性這塊涉及面比較廣,偏系統(tǒng)。
記錄Linux驅(qū)動(dòng)社招面經(jīng),希望看到的人有所收獲