繁体   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