返回顶部
首页 > 资讯 > 操作系统 >如何进行Linux Kernel iowait 时间的代码原理分享
  • 488
分享到

如何进行Linux Kernel iowait 时间的代码原理分享

2023-06-06 00:06:56 488人浏览 薄情痞子
摘要

这篇文章给大家介绍如何进行linux Kernel iowait 时间的代码原理分享,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当task发生iowait的时候,内核对他们的处理方法是将task切换出去,让可运行的t

这篇文章给大家介绍如何进行linux Kernel iowait 时间的代码原理分享,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

当task发生iowait的时候,内核对他们的处理方法是将task切换出去,让可运行的task先运行,而在切换出去前,会将其in_iowait设置为1,再次被唤醒的时候in_iowait被设置为原值。相关函数io_schedule,io_schedule_timeout,mutex_lock_io,mutex_lock_io_nested。

例如:

如何进行Linux Kernel iowait 时间的代码原理分享

由此可见in_iowait表明了这个task是否在iowait。

另外要注意的是,这几个切换函数除了mutex_lock_io,mutex_lock_io_nested会设置task运行状态为TASK_UNINTERRUPTIBLE外,内核在调用io_schedule,io_schedule_timeout前都会设置task运行状态TASK_UNINTERRUPTIBLE。

在进程切换函数__schedule在切换task的时候,如果被切换出的task的in_iowait为真,则会对这个CPU的运行队列rq结构中的nr_iowait加1。

因为前面对task已经被设置为TASK_UNINTERRUPTIBLE,则task需要被唤醒,对nr_iowait的减少操作也是在task唤醒函数来做的。

由此可见nr_iowait可以表明某CPU上是否有task在iowait,以及数量。

因为处于iowait的task是TASK_UNINTERRUPTIBLE状态,其并不在就绪队列中,所以其也没有被CPU负载均衡到其他CPU的可能,所以nr_iowait也不需要处理负载均衡问题。

当累加系统idle时间的时候,如果CPU的nr_iowait为真,也就是当前这个cpu有task在等待iowait,则记录为iowait时间。

在打开NO_HZ的内核中,相关代码在update_ts_time_stats。

如何进行Linux Kernel iowait 时间的代码原理分享

而没打开的则在 account_idle_time。

如何进行Linux Kernel iowait 时间的代码原理分享

当相关/proc/stat接口被访问时,get_iowait_time就会访问这个时间并返回。

综上所述,iowait时间就是CPU idle时间,但是这时候CPU上不是完全没TASK需要运行,而是休眠的task中有一个或者若干个是iowait的task。

当然idle和iowait的时候CPU上还有idle task。

最后推荐一篇阿里内核组的文章作为扩展阅读Kernel Documents/new iowait calculation (Http://link.zhihu.com/?target=http%3A//kernel.taobao.org/index.PHP%3Ftitle%3DKernel_Documents/new_iowait_calculation)

比较有意思是这里:

+       wait_event_interruptible_hrtimeout(ctx->wait,

+                       aio_read_events(ctx, min_nr, nr, event, &ret), until);

无论超时值until是什么值,都会调用wait_event_interruptible_hrtimeout,虽然是hrtimer实时性已经很高,但是在用来实际处理wait的宏__wait_event_hrtimeout可以看到hrtimer初始化使用的是:

hrtimer_start_range_ns(&__t.timer, timeout,\

       current->timer_slack_ns,\

       HRTIMER_MODE_REL);\

其中第三个参数current->timer_slack_ns是传递给hrtimer的触发范围,因为hrtimer实时性高,但是频繁触发系统显然受不了,所以每次hrtimer触发都会将时间范围内的timer都处理掉(见__hrtimer_run_queues)。所以timeout+current->timer_slack_ns才是设置的hrtimer的最后触发时间,current->timer_slack_ns的默认值是50000,也就是代表50000纳秒。也就是这个时钟最久会在50000纳秒后触发,当然也可能被之前的hrtimer触发。

所以在wait_event_interruptible_hrtimeout中,一旦ctx->wait未能就绪,即使设置超时时间为0,也很可能要调用一次schedule,这导致iowait时间相差很大,也还很大幅度伤害了性能。

而这个问题也被5f785de588735306ec4d7c875caf9d28481c8b21进行了修复,这段代码改成了:

-       wait_event_interruptible_hrtimeout(ctx->wait,

-                       aio_read_events(ctx, min_nr, nr, event, &ret), until);

+       if (until.tv64 == 0)

+               aio_read_events(ctx, min_nr, nr, event, &ret);

+       else

+               wait_event_interruptible_hrtimeout(ctx->wait,

+                               aio_read_events(ctx, min_nr, nr, event, &ret),

+                               until);

从而在until为0的时候,直接调用aio_read_events。应该就不会再有那么明显的iowait问题了,另外也因此这个修复让io_getevents的调用得到了超过百倍的性能提升。

当然这个iowait不够精确的原因还是存在,一旦因为需要发生task切换,还是会有不够精确的问题。

关于如何进行Linux Kernel iowait 时间的代码原理分享就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何进行Linux Kernel iowait 时间的代码原理分享

本文链接: https://lsjlt.com/news/245395.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何进行Linux Kernel iowait 时间的代码原理分享
    这篇文章给大家介绍如何进行Linux Kernel iowait 时间的代码原理分享,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当task发生iowait的时候,内核对他们的处理方法是将task切换出去,让可运行的t...
    99+
    2023-06-06
  • 进行数据处理的6个 Python 代码块分享
    目录1、选取有空值的行2、快速替换列值3、对列进行分区4、将一列分为多列5、中文筛选6、更改列的位置前言: 大家好,今天和大家分享自己总结的6个常用的 Python 数据处理代码,对...
    99+
    2024-04-02
  • Golang开发经验分享:如何进行有效的代码重构
    随着软件开发项目的不断演进,代码的维护和重构变得越来越重要。尤其对于Golang这种高效的编程语言,如何进行有效的代码重构非常必要,既能提高代码的可读性和可维护性,又能优化程序性能。本文将分享一些Golang开发经验,让您了解如何进行有效的...
    99+
    2023-11-23
    Golang 开发经验 代码重构
  • Golang开发经验分享:如何进行高效的代码复用
    Golang作为一门现代化的编程语言,以其高效的性能和简洁的语法受到了广泛的关注和使用。在Golang开发过程中,代码复用是一个非常重要的概念。它可以提高代码的可维护性、减少重复开发和代码冗余。本文将分享一些关于如何进行高效的代码复用的经验...
    99+
    2023-11-22
    Golang 代码复用 高效开发
  • Golang开发经验分享:如何进行高效的代码重构
    Golang开发经验分享:如何进行高效的代码重构随着软件开发过程的推进,代码的重构变得日益重要。无论是为了提高代码的可读性、增强代码的可维护性,还是为了应对业务需求的变化,都需要进行代码重构。在Golang开发中,如何进行高效的代码重构是一...
    99+
    2023-11-22
    Golang 经验分享 代码重构
  • 如何进行FileZilla的源代码分析
    这篇文章将为大家详细讲解有关如何进行FileZilla的源代码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放源代码程式,...
    99+
    2023-06-16
  • 如何进行Fedora 16的原理分析
    如何进行Fedora 16的原理分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、Fedora 16 主要特色Fedora 16,代号“Verne”,正式版本将于201...
    99+
    2023-06-16
  • 代理IP是如何进行分类的
    本篇内容介绍了“代理IP是如何进行分类的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!随着计算机技术的普及和互联网技术的快速发展,互联网已经...
    99+
    2023-06-20
  • 如何进行C++代码的性能分析?
    如何进行C++代码的性能分析在开发C++程序时,性能是一个重要的考量因素。优化代码的性能可以提高程序的运行速度和效率。然而,想要优化代码,首先需要了解它的性能瓶颈在哪里。而要找到性能瓶颈,首先需要进行代码的性能分析。本文将介绍一些常用的C+...
    99+
    2023-11-02
    代码 C++ 性能分析 C++性能分析的关键词:
  • linux如何查看某个进程的运行时间
    小编给大家分享一下linux如何查看某个进程的运行时间,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!查看某个进程的运行时间可能,大部分同学只会使用 ps aux,其实可以通过 -o 参数,指定...
    99+
    2023-06-27
  • Python开发经验分享:如何进行代码重构和优化
    Python开发经验分享:如何进行代码重构和优化引言:随着软件开发的不断发展,代码的重构和优化已成为开发过程中不可或缺的一环。而Python作为一门动态、简洁的高级编程语言,也同样需要进行代码重构和优化来提高程序的性能和可维护性。本文将分享...
    99+
    2023-11-22
    Python 优化 重构
  • 如何进行C++代码的日志管理?
    随着软件开发的不断发展,日志管理已经变成了代码开发过程中必不可少的部分,而C++作为一门较为复杂的编程语言,在进行代码开发时也需要进行日志管理。本文将介绍C++代码的日志管理原则及具体实现,希望对读者有所帮助。一、日志管理原则确定日志级别日...
    99+
    2023-11-03
    日志管理 C++代码 日志编程
  • 如何进行C++代码的内存管理?
    如何进行C++代码的内存管理C++是一种功能强大的编程语言,但同时也要求程序员自行管理内存。正确的内存管理是确保程序运行稳定和高效的关键之一。本文将介绍一些常见的内存管理技术和最佳实践,帮助初学者和有经验的开发人员更好地管理C++代码的内存...
    99+
    2023-11-03
    内存释放 C++内存管理 C++内存分配
  • 如何进行C++代码的资源管理?
    如何进行C++代码的资源管理以C++为例,资源管理是程序开发中非常重要的一环。良好的资源管理可以提高程序的性能和稳定性,减少内存泄漏和资源浪费。本文将介绍一些常用的C++资源管理技术和最佳实践。1.使用智能指针:C++11引入了智能指针的概...
    99+
    2023-11-02
    内存管理 资源分配 C++资源管理
  • 如何进行C++代码的容错处理?
    如何进行C++代码的容错处理摘要:容错处理是编程中非常重要的一环,特别是在C++代码中。本文将介绍一些常见的C++代码容错处理的方法,并提供一些示例代码说明如何避免常见的错误和异常。引言:C++是一种强大的编程语言,但它也有一些让人困惑的特...
    99+
    2023-11-02
    容错处理 (Error Handling) C++代码 (C++ code) 容错机制 (Fault-tolerant
  • 如何进行C++代码的异常处理?
    如何进行C++代码的异常处理引言:在编写C++代码时,异常处理是非常重要的一部分。异常处理机制可以帮助我们在程序运行时捕获和处理错误。在本文中,我们将讨论一些关于如何在C++中进行异常处理的重要概念和技巧。一、异常处理的基本概念异常处理是一...
    99+
    2023-11-02
    代码 C++ 异常处理
  • 如何进行C++代码的依赖管理?
    如何进行C++代码的依赖管理作为一种广泛使用的编程语言,C++常常用于开发涉及底层硬件、系统级别或具有高性能要求的应用程序。在实际开发中,C++项目往往会涉及到各种库、框架和其他依赖项,因此,进行代码的依赖管理变得尤为重要。本文将介绍几种常...
    99+
    2023-11-04
    依赖管理
  • Hive中的时间序列分析是如何进行的
    在Hive中进行时间序列分析通常涉及以下步骤: 创建时间序列数据表:首先,需要创建一个包含时间序列数据的表。可以使用Hive的C...
    99+
    2024-04-02
  • 如何进行Pandas库中时间序列的处理
    这期内容当中小编将会给大家带来有关如何进行Pandas库中时间序列的处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在使用Python进行数据分析时,经常会遇到时间日期格式处理和转换,特别是分析和挖掘与...
    99+
    2023-06-02
  • 如何进行Java Mybatis中的Mapper原理分析
    如何进行Java Mybatis中的Mapper原理分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。准备1.pom文件 <depen...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作