Linux Openwrt CPU使用率

本文介绍了两种Linux系统资源监控工具top与mpstat的使用情况。通过具体实例展示了top命令显示内存与CPU使用情况的方式,并推荐了mpstat作为更详细的性能分析工具。mpstat能够提供更为精确的CPU使用率统计数据。

top用时久,我推荐使用mpstat

top -n1 | head -n2
Mem: 222328K used, 282096K free, 6216K shrd, 13760K buff, 27972K cached
CPU:  18% usr  40% sys   0% nic  39% idle   0% io   0% irq   1% sirq
mpstat
22:35:32     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
22:35:32     all    0.79    0.00    1.55    0.01    0.00    0.30    0.00    0.00   97.36
OpenWrt 系统中查看进程的 CPU 占用情况,可以使用多种命令行工具。由于 OpenWrt 使用的是嵌入式 Linux,资源有限,默认没有安装完整的 `top` 或 `htop`,但提供了轻量级替代方案。 下面详细介绍几种 **在 OpenWrt 中查看进程 CPU 占用** 的方法,并给出实用脚本和解释。 --- ## ✅ 一、使用 `top` 命令(最常用) OpenWrt 通常自带简化版 `top`(来自 busybox),支持实时查看 CPU 使用率。 ### 🔹 运行方式: ```bash top ``` ### 🔹 输出示例: ```text Mem: 123456K used, 567890K free, 12345K shrd, 6789K buff, 45678K cached CPU: 2% usr 5% sys 0% nic 92% idle 0% io 0% irq 0% sirq Load average: 0.12 0.08 0.05 1/45 1234 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 1234 1 root S 1234 0.2 4.5 /usr/sbin/wifi_as_wan 567 566 root S 2345 0.4 2.1 /usr/sbin/hostapd 1 0 root S 1123 0.1 0.0 init ``` ### 🔍 关键字段说明: | 字段 | 含义 | |------|------| | `%CPU` | 进程当前占用CPU 百分比 | | `COMMAND` | 进程名 | | `PID` | 进程 ID | | `STAT` | 状态(S=睡眠,R=运行) | > ⚠️ 注意:busybox 的 `top` 刷新频率较低,且 `%CPU` 是采样平均值。 --- ## ✅ 二、使用 `ps` + 排序(适合脚本化) 如果你只需要一次性快照,可以用 `ps`: ```bash ps w | sort -nk 3 ``` 但默认 `ps` 不显示 `%CPU`。你需要使用支持格式化的版本: ```bash ps w -o pid,ppid,user,stat,vsz,pcpu,comm --sort=-pcpu ``` ### 🔹 输出示例: ```text PID PPID USER STAT VSZ %CPU COMMAND 1234 567 root S 12345 4.5 wifi_as_wan 567 566 root S 23456 2.1 hostapd ``` ✅ 按 `%CPU` 降序排列,快速定位高负载进程。 📌 提示:某些 OpenWrt 版本的 `ps` 来自 busybox,可能不支持 `-o pcpu`。可先检查: ```bash ps --help ``` --- ## ✅ 三、使用 `pidstat`(需安装 `sysstat`) 更专业的工具是 `pidstat`,来自 `sysstat` 包,提供精确的每进程 CPU 统计。 ### 🔹 安装: ```bash opkg update opkg install sysstat ``` ### 🔹 使用: ```bash # 每秒刷新一次,显示所有进程 pidstat -u 1 # 只看特定进程(如 wifi_as_wan) pidstat -u -p $(pgrep wifi_as_wan) 1 ``` ### 🔹 输出示例: ```text Linux 5.4.188 (OpenWrt) _aarch64_ (4 CPU) 10:30:01 UID PID %usr %system %guest %CPU CPU Command 10:30:02 0 1234 3.00 1.00 0.00 4.00 2 wifi_as_wan ``` 📌 非常适合分析 CPU 时间分布(用户态 vs 内核态)。 --- ## ✅ 四、使用 `/proc/[pid]/stat` 手动计算 CPU 使用率(高级) Linux 内核通过 `/proc/[pid]/stat` 提供原始 CPU 时间(单位:jiffies)。我们可以编写脚本计算真实 CPU 占用。 ### 📜 Python 脚本示例:监控某进程 CPU 使用率 ```python #!/usr/bin/env python3 import time import os def get_cpu_jiffies(): """获取系统总的 CPU 时间""" with open('/proc/stat', 'r') as f: line = f.readline() return sum(int(x) for x in line.split()[1:]) def get_process_jiffies(pid): """获取进程的 CPU 时间(utime + stime)""" try: with open(f'/proc/{pid}/stat', 'r') as f: parts = f.read().split() utime = int(parts[13]) # 用户态时间 stime = int(parts[14]) # 内核态时间 return utime + stime except Exception: return None def monitor_cpu(pid, interval=1): last_sys = get_cpu_jiffies() last_proc = get_process_jiffies(pid) if last_proc is None: print(f"PID {pid} not found") return print(f"Monitoring PID {pid} every {interval}s...") while True: time.sleep(interval) curr_sys = get_cpu_jiffies() curr_proc = get_process_jiffies(pid) if curr_proc is None: print("Process exited.") break # 计算占比 proc_diff = curr_proc - last_proc sys_diff = curr_sys - last_sys num_cpus = os.cpu_count() or 1 cpu_percent = (proc_diff / sys_diff) * 100 * num_cpus cpu_percent = min(cpu_percent, 100) # 防溢出 print(f"CPU Usage: {cpu_percent:.2f}%") last_sys = curr_sys last_proc = curr_proc # 示例:监控 wifi_as_wan 进程 try: import subprocess result = subprocess.check_output(["pgrep", "wifi_as_wan"], text=True).strip() pid = int(result.splitlines()[0]) monitor_cpu(pid) except Exception as e: print("Error:", e) ``` 📌 将此脚本保存为 `cpu_mon.py` 并运行即可看到实时 CPU 占用。 --- ## ✅ 五、推荐组合方案(日常使用) | 场景 | 推荐命令 | |------|----------| | 快速查看谁在吃 CPU | `top` | | 脚本中提取高负载进程 | `ps w -o pid,pcpu,comm --sort=-pcpu \| head -10` | | 精确性能分析 | `pidstat -u 1`(需安装 `sysstat`) | | 自动化监控 | 使用 Python 脚本轮询 `/proc/[pid]/stat` | --- ## ✅ 六、优化建议 - 如果你发现某个进程(如 `wifi_as_wan`)CPU 占用长期高于 20%,应检查: - 是否频繁轮询? - 是否死循环? - 是否日志输出过多? - 使用 `strace` 跟踪系统调用(调试用): ```bash strace -p $(pgrep wifi_as_wan) -c # 统计系统调用次数 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值