光貓下掛乙個機頂盒,機頂盒通過dhcp從光貓獲取位址上網,在機頂盒上面切換節目的時候,光貓出現重啟,串列埠列印softirq: huh, entered softirq 3 net_rx c0348f54 with preempt_count 00000101, exited with 00000302?。
(1) 根據串列埠的列印確認問題的原因是進入rx軟中斷前和rx軟中斷處理後,搶占計數不一致導致;
(2) 既然是處理rx軟中斷的時候出了問題,那肯定是機頂盒切換節目的時候發了某些特殊的資料報導致,然後我使用wireshark在機頂盒切換節目的時候進行了抓包;
(3) 資料報這麼多,如何確認是哪乙個包導致的問題呢 ? 我的思路是既然是因為特殊資料報進了協議棧導致的重啟,那我能不能在防火牆的mangle表 prerouting鏈加一些規則丟掉這些特殊包不讓它進行傳輸,不就可以確認是哪個資料報了嗎?(mangle一般不會用來做資料報過濾,過濾是在filter表裡面做,我這裡這麼做,只是因為mangle表的優先順序高一點,如果是異常包,早點丟棄而已);
(5) 經過(4)中的嘗試,確認是協議棧處理rtsp teardown報文的時候出現了問題,因為我用防火牆丟掉這個包之後,沒有出現重啟。
(6) 確認了是teardown報文的問題,那麼現在就去重點分析原始碼了,直接找和teardown報文相關的處理,一眼就看出了問題 ,系統收到teardown報文之後,會先獲取一把自旋鎖,然後進行了一些處理後直接返回了,沒有釋放自旋鎖,因為獲取自旋鎖的時候,會增加搶占計數,如果直接返回,就會出現搶占計數洩露,和串列埠的log也能對的上,後面我在返回前釋放了相關的自旋鎖,切換節目的時候,沒有再出現重啟。
遇到問題,不要一上來就分析原始碼,先學會觀察,自己去分析**可能有問題,去確認問題的大致範圍,然後再去看原始碼,這樣效率更高。
通達OA 一次系統異常問題處理
前些天,伺服器硬碟出現故障,更換了2塊硬碟。可是最近幾天cpu占用一直很高,有時都接近100 而且有2個oa的服務也啟動不了,乙個mq,乙個redis 而且系統執行也不正常 併發的流程只能乙個人收到 郵件只能乙個人收到,其他人顯示都是已刪除郵件 修改人員資訊後這個人就變成離職狀態不能登入了。種種的異...
一次mysql的重啟失敗
近期阿里雲一直提示修復漏洞,然後重啟了mysql,導致 mysql 無法啟動,看到提示 can t connect to local mysql server through socket tmp mysql.sock 是否存在,去目錄看,果真不在了,那麼只能想法辦重新構建乙個 mysql.sock...
記一次linux系統中毒
在公司的linux伺服器裡面發現cpu的負載偏高用top看到異常的程序 ijcfwyjoqk 父程序為init 執行 ps l 10854 顯示cmd列為uptime 執行 whereis ijcfwyjoqk 顯示在 usr bin下而且還發現在 etc init.d和 etc rc.d rc3....