Linux CPU时间的一点理解

本文详细解析Linux系统中CPU时间的分类,包括用户空间、内核态、中断等各类CPU时间的定义与统计原理。并通过核心代码解读,揭示了不同CPU时间类型的计算方式及其实现细节。

1.CPU时间分类

vmstat可以显示cpu使用时间的分类统计:
执行指令:vmstat -s 时,实际从/proc/stat节点读取cpu显示,然后进行回显:

内核对应的CPU时间类型有以下几种:

类别说明
CPUTIME_USER用户空间占用CPU时间
CPUTIME_NICE高nice进程(低优先级),用户空间占用时间
CPUTIME_SYSTEM内核态占用CPU时间
CPUTIME_SOFTIRQ软件中断占用CPU时间
CPUTIME_IRQ硬中断占用CPU时间(这个没搞懂)
CPUTIME_IDLECPU空闲时间
CPUTIME_IOWAITCPU等待IO时间
CPUTIME_STEALGuest OS等待real cpu的时间(虚拟机查看)
CPUTIME_GUESTGuest OS 消耗的时间(物理机里查看)
CPUTIME_GUEST_NICE 

2.内核实现

/*account_process_tick会在每个TICK中断被调用,user_tick从当前CPU工作模式决定
主要计算了各种CPU使用时间
*/
void account_process_tick(struct task_struct *p, int user_tick)
{
	u64 cputime, steal;
	struct rq *rq = this_rq();

	cputime = TICK_NSEC;
	if (user_tick)/*统计userspace时间 */
		account_user_time(p, cputime);
	else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET))
		account_system_time(p, HARDIRQ_OFFSET, cputime);/*内核态运行时间 */
	else
		account_idle_time(cputime);/*CPU空闲时间 */
}

/* 用户时间统计
这里把高nice(低优先级)进程时间进行区分。
*/
void account_user_time(struct task_struct *p, u64 cputime)
{
	int index;

	/* 把时间累加到当前进程. */
	p->utime += cputime;
	account_group_user_time(p, cputime);//account_process_tick-

	index = (task_nice(p) > 0) ? CPUTIME_NICE : CPUTIME_USER;

	/* 把cpu时间累计到当前CPU */
	task_group_account_field(p, index, cputime);

	/* Account for user time used */
	acct_account_cputime(p);
}

/* 
系统CPU时间实际分三种
Hardirq:硬中断时间
softirq:软中断运行时间
system:内核运行时间
*/
void account_system_time(struct task_struct *p, int hardirq_offset, u64 cputime)
{
	int index;

	/*hardirq的计算没理解,Linux中断不可重入,也就是这里一直是0(除非NMI抢占了hardirq) */
	if (hardirq_count() - hardirq_offset)
		index = CPUTIME_IRQ;
	else if (in_serving_softirq())/* 软中断时间*/
		index = CPUTIME_SOFTIRQ;
	else
		index = CPUTIME_SYSTEM;/* 内核运行时间*/

	account_system_index_time(p, cputime, index);/*更新对应的运行时间 */
}
/* 
idle时间分类纯idle和iowait时间
iowait的一点理解:当前CPU存在iowait的进行,且当前cpu处于idle状态
nr_iowait在schedule函数累加.
*/
void account_idle_time(u64 cputime)
{
	u64 *cpustat = kcpustat_this_cpu->cpustat;
	struct rq *rq = this_rq();

	if (atomic_read(&rq->nr_iowait) > 0)
		cpustat[CPUTIME_IOWAIT] += cputime;
	else
		cpustat[CPUTIME_IDLE] += cputime;
}

3.统计精度
 

由于CPU统计时间是在每个TICK中断中,而且把整个TICK时间,都计算到当前进程,那么在一个TICK周期,可能发生:
1. 一个进程多次在用户态和内核态切换,而最终会把整个tick时间计算在用户态或者内核态
2.多个进程在TICK周期内运行过.而最终会把真个tick时间计算在当前进程.
结论:各种CPUTIME的统计精度是TICK,且并不准确, 只能大体反应CPU运行情况.但是这种统计,并不影响我们分析问题.

<think>好的,我需要回答用户关于如何在Linux中查看CPU使用率和监控工具的问题。首先,我需要整理已有的知识,并参考用户提供的引用内容,确保信息准确可靠。 首先,用户提到了四个引用,其中引用[1]、[3]、[4]与CPU监控相关。引用[3]详细介绍了使用top命令查看CPU占用率,包括多核情况下的显示。引用[1]提到使用vmstat工具,而引用[4]则介绍了一个结合C++和Python的工具。此外,引用[2]提到了Collectl工具,虽然用户可能没有直接提到,但根据问题,可能需要包括在内。 接下来,我需要将这些工具和方法分类,比如命令行工具、图形化工具和自定义工具。常见的命令行工具有top、htop、vmstat、mpstat、sar等。图形化工具如gnome-system-monitor,而自定义工具如引用[4]中的项目。此外,Collectl作为全能监控工具也应该被包含。 需要确保每个工具的使用方法正确,并引用对应的来源。例如,top命令在引用[3]中有详细说明,vmstat在引用[1],而Collectl在引用[2]。自定义工具在引用[4]中描述。此外,还要注意用户提到的多核CPU的情况,如top显示超过100%的情况,这一点需要明确说明。 另外,用户可能需要了解如何安装这些工具,比如htop可能需要通过包管理器安装。同时,对于sar工具,需要提到sysstat包的安装和启用。 最后,生成相关问题,考虑用户可能进一步想了解的内容,如工具的比较、高级监控方法、自动化监控脚本等。确保问题与回答内容相关,并且有助于用户深入理解。 总结步骤: 1. 分类列出各种工具和方法,确保覆盖命令行、图形化、第三方和自定义工具。 2. 为每个工具提供基本用法和示例,引用对应的来源。 3. 注意多核CPU的显示情况,如top中的超过100%情况。 4. 生成相关问题,引导用户进一步探索。</think>### Linux中查看CPU使用率的常用工具及方法 #### 一、命令行工具 1. **top** 输入命令直接查看实时CPU占用: ```bash top ``` - 显示整体CPU占用率(用户态、系统态、空闲等) - 进程级CPU占用:单核超过100%表示使用多核[^3] - 按`1`键可查看多核CPU的详细分布 2. **htop(增强版top)** 安装后使用(需手动安装): ```bash sudo apt install htop # Debian/Ubuntu htop ``` - 支持颜色标注、鼠标操作和进程树视图 3. **vmstat** 查看系统资源整体状态: ```bash vmstat 1 # 每秒刷新一次 ``` - 输出包含CPU使用率(`us`用户态、`sy`系统态、`id`空闲)[^1] 4. **mpstat(多核分析)** 需安装`sysstat`包: ```bash sudo apt install sysstat # Debian/Ubuntu mpstat -P ALL 1 # 查看所有核心的实时使用率 ``` 5. **sar(历史数据分析)** 通过`sysstat`包记录历史数据: ```bash sar -u 1 3 # 每秒采样,共3次 ``` #### 二、图形化工具 1. **gnome-system-monitor** 适用于GNOME桌面环境: ```bash gnome-system-monitor ``` - 提供进程管理、资源监控的可视化界面 2. **KSysGuard(KDE桌面工具)** 支持自定义监控面板和远程监控 #### 三、第三方工具 1. **Collectl(全能监控)** 支持CPU、内存、网络等综合监控: ```bash collectl -sc # 查看CPU使用率 ``` - 可生成详细报告和图表[^2] 2. **Glances(跨平台)** 安装后使用: ```bash sudo apt install glances # Debian/Ubuntu glances ``` #### 四、自定义监控工具 1. **基于/proc文件系统** 直接读取`/proc/stat`获取原始数据: ```bash cat /proc/stat ``` - 需计算各状态时间差来推导CPU使用率 2. **C++/Python监控工具(引用[4])** 通过读取`/proc`数据并存储到UnQLite数据库,支持多进程分析和可视化: ```bash git clone [代码仓库路径] ``` - 适用于需要长期监控和分析的场景[^4] --- #### § 工具对比 | 工具 | 特点 | 适用场景 | |-------------|------------------------------|----------------------| | `top` | 实时查看进程级CPU占用 | 快速排查高负载进程 | | `vmstat` | 系统级资源统计 | 综合性能分析 | | `Collectl` | 支持历史数据和多种指标 | 长期监控与报告生成 | | 自定义工具 | 灵活扩展、可视化分析 | 定制化监控需求 | --- §§ 1. 如何通过`/proc/stat`手动计算CPU使用率? 2. `vmstat`和`mpstat`在功能上有哪些区别? 3. 如何配置`sysstat`实现CPU使用率的长期记录? 4. 在容器化环境中(如Docker),如何监控单个容器的CPU使用率? 5. 如何通过Python脚本实时监控CPU使用率并生成告警?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值