[Linux性能優化] 線程卡頓優化。Linux加入USB(HID)熱插拔線程占用CPU優化。Linux中CPU使用率過高優化

文章目錄

  • [Linux性能優化] 線程卡頓優化。
  • 0、省流版本
  • 一、問題定位:CPU 資源分析
  • 二、線程卡頓現場復現
    • 線程優化前圖片
  • 三、線程卡頓優化方向
    • 1.如果是輪詢方式
    • 2.如果是事件驅動方式
  • 四、修改方式
    • 線程優化后圖片

[Linux性能優化] 線程卡頓優化。

0、省流版本

如果采用的是輪詢方式,即使用while(1)或者其他死循環的循環結束里面加延時,可以大幅度降低CPU占用率。

一、問題定位:CPU 資源分析

線程卡頓通常與 CPU 資源競爭、線程調度異常相關,第一步需通過系統監控工具定位資源瓶頸。
查看 CPU 使用率及線程狀態
可參考這博客篇:
📖Linux 性能分析:TOP 命令深度解析(含 CPU / 線程監控指南)
1. 快速定位工具:top命令基礎用法
如需實時查看 CPU 占用情況,可通過以下命令進入監控界面:

top -d 1  # 每秒刷新一次系統狀態

按 H 鍵切換至線程級監控模式(顯示所有 LWP 輕量級進程)
按 P 鍵按 CPU 占用率排序,快速定位高負載線程
(詳細操作指南請參考前文鏈接)

二、線程卡頓現場復現

1. 優化前 CPU 線程分布(示例)

線程優化前圖片

熱插拔未優化
圖注:TOP 線程界面顯示某進程下多個線程 CPU 占用率超過 100%,存在資源競爭
圖中顯示 __check_usb_hot 線程(PID 1062)當前處于運行狀態(R),占用 42.5% 的 CPU 資源,該線程屬于 /mnt/bin/sctr1 程序,負責 USB 熱插拔檢測。正常情況下,熱插拔檢測程序不應長時間占用較高 CPU 資源,此情況可能由以下原因導致:

  • 程序邏輯問題:若檢測機制未設置合理休眠時間,可能導致其高頻查詢 USB 狀態,造成 CPU 資源浪費。
  • USB 設備異常:如設備接觸不良、硬件故障或驅動問題,可能觸發程序持續檢測處理,增加 CPU 負擔。

建議按以下步驟排查優化:

  • 檢查 USB 設備:確認是否有設備異常插拔、接觸不良或硬件故障,嘗試更換 USB 設備或接口。
  • 審視程序邏輯:查看 __check_usb_hot 線程代碼,優化檢測頻率(如增加檢測間隔),避免無意義的高頻檢測。
  • 監控持續觀察:使用 top -d 1 -p 1062 持續監控該線程 CPU 占用情況,結合系統日志分析是否有其他關聯異常。
    通過以上排查,可定位具體原因并針對性優化,避免該線程對系統資源的不合理占用。

三、線程卡頓優化方向

1.如果是輪詢方式

  • 降低輪詢頻率:
  • 目前輪詢頻率可能過高,導致 CPU 占用率較高。可以通過適當增大輪詢間隔時間來降低 CPU 使用率。例如,原本每 100 毫秒輪詢一次,可以嘗試調整為每 500 毫秒或 1 秒輪詢一次。
  • 動態調整輪詢間隔:根據系統負載或 USB 設備的活動情況,動態調整輪詢間隔。例如,在系統負載較高時,適當增大輪詢間隔;在檢測到有 USB 設備活動后,暫時減小輪詢間隔以確保及時捕捉后續事件。
  • 減少不必要的操作:
  • 在每次輪詢時,檢查是否真的有必要遍歷所有的 USB 設備。可以記錄上次輪詢時的設備列表,僅對新增或移除的設備進行詳細處理,避免對未變化的設備進行重復操作。
  • 優化設備狀態檢查邏輯,避免不必要的系統調用或復雜計算。例如,如果只是檢查設備是否存在,可以通過檢查設備節點是否存在來快速判斷,而不是進行完整的設備信息查詢。

2.如果是事件驅動方式

  • 確保事件監聽的正確性:
  • 檢查事件監聽的代碼邏輯,確保能夠正確捕獲所有 USB 熱插拔事件。可能存在事件丟失或未正確處理的情況。
  • 確認使用的事件機制是否是最新和最有效的。例如,在較新的 Linux 內核中,可能有更高效的 USB 事件通知方式。
  • 優化事件處理流程:
  • 事件處理函數中可能存在耗時操作,導致后續事件處理延遲。將耗時操作(如設備信息解析、日志記錄等)移到單獨的線程或異步任務中處理,以確保事件處理的及時性。
  • 對事件處理函數進行性能分析,找出可能的瓶頸并進行優化。例如,減少不必要的函數調用、優化數據結構等。

四、修改方式

static void *__check_usb_hotplug(void *pArgs)
{// .....略while(usb_hotpulg_running_check){// .....略USLEEP(1000*1000);//因為采用的是輪詢方式,所以使用加延時。}return NULL;
}

線程優化后圖片

熱插拔優化后圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81582.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81582.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ip與mac-數據包傳輸過程學習

你管這破玩意叫網絡? 內容來源于飛天閃客,以前沒有學習過網絡的相關基礎知識,只會去瞎設置,現在終于是弄明白了。 多臺電腦之間想要通信,可以直接通過一條網線進行連接。但是隨著網線的增加,這個就會比較…

數值分析知識重構

數值分析知識重構 一 Question 請構造一下數值分析中的誤差概念以及每一個具體數值方法的誤差是如何估計的? 二 Question 已知 n 1 n1 n1個數據點 ( x i , y i ) , i 0 , 1 , ? , n (x_i,y_i),i0,1,\cdots,n (xi?,yi?),i0,1,?,n,請使用多種方法建立數據之間…

使用 Qt QGraphicsView/QGraphicsScene 繪制色輪

使用 Qt QGraphicsView/QGraphicsScene 繪制色輪 本文介紹如何在 Qt 中利用 QGraphicsView 和 QGraphicsScene 實現基礎圓形繪制,以及進階的色輪(Color Wheel)效果。 色輪是色彩選擇器的常見控件,廣泛應用于圖形設計、繪畫和 UI …

移除鏈表元素數據結構oj題(力扣題206)

目錄 題目描述: 題目解讀(分析) 解決代碼 題目描述: 給你一個鏈表的頭節點 head 和一個整數 val ,請你刪除鏈表中所有滿足 Node.val val 的節點,并返回 新的頭節點 。 題目解讀(分析&#…

GLPK(GNU線性規劃工具包)中建模語言MathProg的使用

GNU MathProg是一種用于描述線性數學規劃模型的建模語言。用GNU MathProg語言編寫的模型描述由一組語句和數據塊組成。 在MathProg中,模型以集合、參數、變量、約束和目標(sets, parameters, variables, constraints, objectives稱為模型對象)的形式進行描述。 在Ma…

《Python星球日記》 第77天:模型部署與總結

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、模型部署技術1. 模型文件導出不同模型格式對比2. 使用Flask構建RESTful API3. 使用FastAPI構建高性能API4. 部署優化與最佳實踐二、部署架構…

【JavaWeb】MySQL(準備篇)

1 MySQL安裝 1.1 解壓 下載完成后我們得到的是一個壓縮包(所有文件均在文末安裝包中),將其解壓,我們就可以得到MySQL 8.0.34 的軟件本體了(就是一個文件夾),我們可以把它放在你想安裝的位置 。 1.2 配置 1.2.1 配置…

國產數據庫工具突圍:SQLynx如何解決Navicat的三大痛點?深度體驗報告

引言:Navicat的"中國困境" 當開發者面對達夢數據庫的存儲過程調試,或是在人大金倉中處理復雜查詢時,Navicat突然變得力不從心——這不是個例。 真實痛點:某政務系統遷移至OceanBase后,開發團隊發現Navicat無…

ETL數據集成產品選型需要關注哪些方面?

ETL(Extract,Transform,Load)工具作為數據倉庫和數據分析流程中的關鍵環節,其選型對于企業的數據戰略實施有著深遠的影響。谷云科技在 ETL 領域耕耘多年,通過自身產品的實踐應用,對 ETL 產品選型…

數據結構實驗10.1:內部排序的基本運算

文章目錄 一,實驗目的二,實驗內容1. 數據生成與初始化2. 排序算法實現(1)直接插入排序(2)二分插入排序(3)希爾排序(4)冒泡排序(5)快速…

從秒開到絲滑體驗!WebAssembly助力ZKmall商城重構 B2B2C 商城性能基線

在 B2B2C 電商領域,用戶對頁面加載速度與交互流暢度的要求日益嚴苛。傳統 Web 技術在處理復雜業務邏輯、海量數據渲染時,常出現卡頓、延遲等問題,導致用戶流失。ZKmall 商城創新性地引入 WebAssembly(簡稱 Wasm)技術&a…

FD+Mysql的Insert時的字段賦值亂碼問題

方法一 FDQuery4.SQL.Text : INSERT INTO 信息表 (中心, 分組) values(:中心,:分組); FDQuery4.Params[0].DataType : ftWideString; //必須加這個數據類型的定義,否則會有亂碼 FDQuery4.Params[1].DataType : ftWideString; //ftstring就不行,必須是…

vue2.0 組件生命周期

個人簡介 👨?💻?個人主頁: 魔術師 📖學習方向: 主攻前端方向,正逐漸往全棧發展 🚴個人狀態: 研發工程師,現效力于政務服務網事業 🇨🇳人生格言&…

使用GmSSL v3.1.1實現SM2證書認證

1、首先使用gmssl命令生成根證書、客戶端公私鑰,然后使用根證書簽發客戶端證書; 2、然后編寫代碼完成認證功能,使用根證書驗證客戶端證書是否由自己簽發,然后使用客戶端證書驗證客戶端私鑰對隨機數的簽名是否正確。 第一部分生成根…

升級mysql (rpm安裝)

#備份以防萬一 備份配置文件: /etc/my.cnf.d/server.cnf 備份數據: mysqldump -u your_username -p --all-databases > all_databases.sql #停止 systemctl stop mysql #卸載舊版 yum remove mariadb #安裝新版( 通過yum安裝報錯,死活安裝不了,只能rpm安裝) 下載地址…

深入理解pip:Python包管理的核心工具與實戰指南

# 深入理解pip:Python包管理的核心工具與實戰指南 在Python開發中,第三方庫是提升效率的關鍵。而pip作為Python官方的包管理工具,承擔著安裝、卸載、升級和管理庫的重要職責。本文將全面解析pip的核心命令,結合實例演示用法&#…

Linux配置SSH密鑰認證

介紹 配置SS秘鑰認證后,可以通過shell腳本免密刪除文件或執行命令。 # 生成密鑰對(如果還沒有) ssh-keygen -t rsa# 將公鑰復制到服務器 ssh-copy-id "$remote_user$remote_host"

python打卡第30天

知識點回顧: 一,導入官方庫的三種手段。 使用 import 直接導入整個模塊 import module_name 使用 from ... import ... 導入特定功能 from module_name import function_name 使用 as 關鍵字重命名模塊或功能 import module_name as alias # 或 from mod…

Java基礎(網絡編程)

一、概述 目的:網絡通信: 1、設備和設備 2、進程和進程 1)不同設備之間 2)本地設備之間 需要解決的問題: 如何準確地發送到對方的主機 - IP地址 - 唯一的定位網絡中的一臺主機 如何準確的發送到對方主機的進程 -…

第二屆parloo杯的RSA_Quartic_Quandary

(害,還是太菜了,上去秒了一道題之后就動不了了,今晚做個記錄,一點點的往回拾起吧) # from Crypto.Util.number import getPrime, bytes_to_long # import math # # FLAG b************** # # # def gene…