首页 > 其他分享 >系统iowait和线程的iowait

系统iowait和线程的iowait

时间:2023-04-15 17:04:14浏览次数:36  
标签:rq iowait 系统 cputime idle 线程 time

 

系统iowait和线程的iowait

系统iowait时间统计

在系统时钟中断时,会调用account_process_tick,如果是user tick,则增加user time;否则如果current线程不是idle,则增加system time;否则增加idle时间,idle可以再分为iowait和纯粹的idle,如果当前cpu的runqueue的nr_iowait大于0,则增加iowait time,否则增加idle time

void account_process_tick(struct task_struct *p, int user_tick)
{
    u64 cputime, steal;
    struct rq *rq = this_rq();

    if (vtime_accounting_cpu_enabled())
        return;

    if (sched_clock_irqtime) {
        irqtime_account_process_tick(p, user_tick, rq, 1);
        return;
    }

    cputime = TICK_NSEC;
    steal = steal_account_process_time(ULONG_MAX);

    if (steal >= cputime)
        return;

    cputime -= steal;

    if (user_tick)
        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);
}
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;
}

 

线程的iowait

io_schedule_timeout/io_schedule函数里先调用io_schedule_prepare,在这个函数里将当前的task的in_iowait设置为1.

在update_stats_enqueue_sleeper判断如果task的in_iowait为1,则statistics.iowait_sum(可以在/proc/pid/sched里找到这个值)累加上这次iowait的时间delta,这里有个sched_stat_iowait trace,所以会记录一条sched_stat_iowait的trace,这条trace记录了这个线程这次iowait的时间delta。

static inline void
update_stats_enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
    sleep_start = schedstat_val(se->statistics.sleep_start);
    block_start = schedstat_val(se->statistics.block_start);
    if (block_start) {
        u64 delta = rq_clock(rq_of(cfs_rq)) - block_start;
        __schedstat_set(se->statistics.block_start, 0);
        __schedstat_add(se->statistics.sum_sleep_runtime, delta);
        if (tsk) {
            if (tsk->in_iowait) {
                __schedstat_add(se->statistics.iowait_sum, delta);
                __schedstat_inc(se->statistics.iowait_count);
                trace_sched_stat_iowait(tsk, delta);
            }

            trace_sched_stat_blocked(tsk, delta);

 

系统的iowait是全局的,针对CPU而言,如果此CPU是在运行idle线程,则增加idle时间;如果是运行的idle线程,但是它的runqueue上有在等待io的线程,则是iowait,增加iowait的时间。线程的iowait是此线程因等待IO而调用了io_schedule_timeout/io_schedule,等待IO完成的这一段时间是该线程这次的iowait时间,此时间可以查看sched_stat_iowait trace event获知。

 

标签:rq,iowait,系统,cputime,idle,线程,time
From: https://www.cnblogs.com/aspirs/p/17321396.html

相关文章

  • ubuntu系统grub修复(win+ubuntu双系统环境),修复无法启动问题 boot-repair
    相关:https://help.ubuntu.com/community/Boot-Repair  ====================================================   Grub修复:Boot-Repair:  sudoadd-apt-repositoryppa:yannubuntu/boot-repair&&sudoaptupdatesudoaptinstall-yboot-repair&&......
  • ERP进销存软件系统 电脑端 手机端 小程序通用(教程)
    ERP(EnterpriseResourcePlanning)即企业资源计划。 可以电脑端 手机端 小程序 数据同步  多账户 使用ERP进销存软件系统网址 https://erp.776KD.com财务管理  仓库管理  商品管理  销售单管理 库存明细 采购管理 支持打印机打印ERP进销存系统的特点......
  • 一天吃透操作系统八股文
    操作系统的四个特性?并发:同一段时间内多个程序执行(与并行区分,并行指的是同一时刻有多个事件,多处理器系统可以使程序并行执行)共享:系统中的资源可以被内存中多个并发执行的进线程共同使用虚拟:通过分时复用(如分时系统)以及空分复用(如虚拟内存)技术把一个物理实体虚拟为多个异步:系统......
  • 【故障诊断】基于KNN、SVM、RF、DT、ET多种算法实现制冷系统故障诊断附Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 亲测一份PHP在线客服系统源码-thinkphp+workerman开发-网上流传最广的客服源码搭建教
    为了帮一个客户修改自己的客服系统,所以把源码在本地搭建了一下。因为,我本身就是使用golang有开发一款客服系统的,本来不愿意看这种旧版本的PHP客服源码。但是客户那边需求很少,购买我的商务版感觉不合算,所以网上找了这一个客服源码,也是流传最广的一款PHP客服系统。当然这个源码有没......
  • Linux系统之安装mysql数据库
    (Linux系统之安装mysql数据库)一、查看系统版本[root@node~]#cat/etc/os-releaseNAME="CentOSLinux"VERSION="7(Core)"ID="centos"ID_LIKE="rhelfedora"VERSION_ID="7"PRETTY_NAME="CentOSLinux7(Core)"ANSI_......
  • C++实现职工管理系统
    使用C++编程实现——管理系统中需要实现的功能如下:退出管理程序:退出当前管理系统增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号,姓名,部门编号显示职工信息:显示公司内部所有职工的信息删除离职职工:按照编号删除指定的职工修改职工信息:按照编号修改职工......
  • 手撕商城体系之支付系统设计与实现
    继续接前文手撕商城系统架构设计与实现支付系统是商城体系里面另一个关键核心系统,所有商城线上交易行为最终转化收入业绩重要支撑。支付最主要目标是保证系统稳定、高可靠,承载高并发支付结算场景。广大企业是没有支付牌照的,全国有支付牌照的公司就那么20几家,所以众多公司都是接入......
  • 多线程
    一.多线程1.什么是线程要了解线程,首先需要知道进程。一个进程指的是一个正在执行的应用程序。线程对应的英文名称为“thread”,它的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂......
  • C/C++人事信息系统[2023-04-15]
    C/C++人事信息系统[2023-04-15]课程设计题目1——链表综合算法设计一、设计内容已知简单的人事信息系统中职工记录包含职工编号(no)、职工姓名(name)部门名称(depname)、职称(title)和工资数(salary)等信息,设计并完成一个简单的人事信息管理系统,要求完成但不限于以下功能:(1)......