簡體   English   中英

Linux - 更快地讀取或收集文件內容(例如每秒 cpu 溫度)

[英]Linux - read or collect file content faster (e.g. cpu temp every sec.)

我正在運行 ubuntu 的系統上工作。 我正在從 /sys/class/thermal 中提供的熱區讀取基本數據,例如 CPU 頻率和溫度。

不幸的是,我有大約 100 個 thermal_zones,我需要從中讀取數據。 我這樣做:

for SENSOR_NODE in /sys/class/thermal/thermal_zone*; do printf "%s: %s\n" $(cat ${SENSOR_NODE}/type) $(cat ${SENSOR_NODE}/temp); done

收集所有數據大約需要 2.5-3 秒。 這太長了。 因為我想每秒收集數據,所以我的問題是,是否有一種方法可以更快地“讀取”或“收集”數據?

先感謝您

在 shell 中編寫代碼時,您只能做這么多,但讓我們從基礎開始。

  • 命令替換$(...)是昂貴的:它們需要創建一個 FIFO, fork()一個新的子進程,將 FIFO 連接到該子進程的標准輸出,從 FIFO 讀取並等待在該子 shell 中運行的命令退出.
  • cat這樣的外部命令是昂貴的:它們需要鏈接和加載一個單獨的可執行文件; 當你在沒有exec的情況下運行它們時(在這種情況下它們繼承並使用 shell 的進程 ID),它們需要一個新進程來fork() ed off。

所有 POSIX 兼容的 shell 都會為您提供read命令:

for sensor_node in /sys/class/thermal/thermal_zone*; do
  read -r sensor_type <"$sensor_node/type" || continue
  read -r sensor_temp <"$sensor_node/temp" || continue
  printf '%s: %s\n' "$sensor_type" "$sensor_temp"
done

...這可以讓您避免命令替換開銷和cat的開銷。 但是, read一次只讀取一個字節的內容; 因此,雖然您沒有支付這筆開銷,但它仍然相對較慢。

如果你從/bin/sh切換到bash ,你會得到一個更快的選擇:

for sensor_node in /sys/class/thermal/thermal_zone*; do
  printf '%s: %s\n' "$(<"$sensor_node/type)" "$(<"$sensor_node/temp")"
done

...因為$(<file)不需要像 read 那樣進行一次一個字節的read 不過,這只會比bash更快; 這並不意味着它實際上很快 現代生產監控系統通常使用Go或 JavaScript 運行時(如 Node.js)編寫是有原因的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM