精华内容
下载资源
问答
  • 测试nginx有效请求,通过直接连接jetty和nginx两种方式的对比,发现连接nginx的方式比连jetty,同样的cpu 利用率,load相差2左右。上下文切换频率几乎差一倍,引起TPS的波动。

    测试nginx有效请求,通过直接连接jetty和nginx两种方式的对比,发现连接nginx的方式比连jetty,同样的cpu 利用率,load相差2左右。上下文的切换频率几乎差一倍,引起TPS的波动。




    展开全文
  • 1. CPU上下文切换到底是个什么东西 ...多个进程竞争cpu的时候,会发生频繁cpu上下文切换 1.1. CPU上下文 CPU寄存器,是cpu内置的容量小,但是速度极快的存储器件.而程序计数器,是用来存储CPU正在执行的执行
  • CPU上下文切换

    2018-12-02 15:34:00
    CPU上下文切换  CPU上下文切换包括进程上下文切换、线程上下文切换及中断上下文切换,当任务进行io或发生时间片事件及发生中断(如硬件读取完成)时,就会进入内核态,发生CPU上下文切换。 进程上下文切换,进程...

      CPU上下文切换包括进程上下文切换、线程上下文切换及中断上下文切换,当任务进行io或发生时间片事件及发生中断(如硬件读取完成)时,就会进入内核态,发生CPU上下文切换。

    1. 进程上下文切换,进程的上下文信息包括, 指向可执行文件的指针, 栈, 内存(数据段和堆), 进程状态, 优先级, 程序I/O的状态, 授予权限, 调度信息, 审计信息, 有关资源的信息(文件描述符和读/写指针), 关事件和信号的信息, 寄存器组(栈指针, 指令计数器)等等,当发生进程切换时,这些保存在寄存器或高速缓存的信息需要记录到内存,以便下次恢复进程的运行。
    2. 线程上下文切换,同一个进程的线程切换,只需保存线程独有的信息,比如栈和寄存器,而共享的虚拟内存和全局变量则无需切换,因此切换开销比进程小。
    3. 中断上下文切换,中断会打断一个正常执行的进程而运行中断处理程序,因为中断处理程序是内核态进程,而不涉及到用户态进程之间的切换,当被中断的是用户态进程时,不需保存和恢复这个进程的虚拟内存和全局变量,中断上下文只包括中断服务程序所需要的状态,比如CPU寄存器、内核堆栈、硬件中断等参数。

      过多的上下文切换会导致将大量CPU时间浪费在寄存器、内核栈以及虚拟内存的保存和恢复上,导致系统整体性能下降。可以用vmstat查看系统的整体上下文切换情况,如下图1,空闲系统的上下文切换次数cs(context switch)为100多,中断次数in(interrupt)为100多,在运行态r(running or runable)的进程数为2,在阻塞态的进程数b为0。

    图1 空闲系统上下文切换和中断情况

      案例:我们用sysbench来模拟多线程频繁上下文切换的场景,并用vmstat、pidstat和/proc/interrupts来分析定位具体的线程。

      用sysbench模拟10个线程,运行300s来观察线程切换的频繁场景,如下图2所示。

    图2 大量线程切换场景模拟

     

       用vmstat查看系统整体的上下文切换和中断情况,如下图3,可看到cs和in的数目和空闲的时候比增加了很多。

     图3 系统整体上下文切换情况

      发现系统切换情况比较频繁,可以用pidstat查看具体切换比较频繁的线程,命令:pidstat -w -t 1,含义如下,

    -w Report task switching activity (kernels 2.6.23 and later only). The following values may be displayed:

    cswch/s
    Total number of voluntary context switches the task made per second. A voluntary context switch occurs when a task blocks because it requires a resource that is unavailable.

    每秒自愿上下文切换次数,如等待io等。

    nvcswch/s
    Total number of non voluntary context switches the task made per second. A involuntary context switch takes place when a task executes for the duration of its time slice and then is
    forced to relinquish the processor.

    每秒非自愿上下文切换次数,如时间片用完切换。

     -t展示具体的线程情况。

    结果如下图4所示,可以看到,切换频繁的线程是sysbench

    图4 线程切换情况

    posted on 2018-12-02 15:34 killianxu 阅读( ...) 评论( ...) 编辑 收藏
    展开全文
  • cpu上下文切换

    2021-07-08 22:55:02
    cpu上下文切换就是把上一个任务的cpu上下文保存起来,然后加载新任务的上下文到寄存器与程序计数器,加载完成后跳转到程序计数器所指的新位置,运行新任务。被保运起来的上下文会存储在系统内核中,并在任务执行时...

            现阶段操作系统可同时执行多个任务,但这些任务并不是同时执行,系统在很短的时间内将cpu轮流分配给每个任务,由于任务轮流执行依赖于cpu寄存器和程序计数器,通过它们暂存指令,数据和地址,以及程序运行的下一条地址,因此也被称为cpu上下文。

            cpu上下文切换就是把上一个任务的cpu上下文保存起来,然后加载新任务的上下文到寄存器与程序计数器,加载完成后跳转到程序计数器所指的新位置,运行新任务。被保运起来的上下文会存储在系统内核中,并在任务执行时再次加载进来。

            每次上下文切换需要几十纳秒到数微秒的时间,频繁上下文会导致cpu将大量时间耗费在寄存器,内核栈及虚拟内存等资源保存恢复上,缩短真正运行时间。当上下文次数超过1万次或出现爆发式增涨时,系统会出现性能问题。

            cpu上下文切换包括进程上下文切换,线程上下文切换,中断上下文切换。

    一、进程上下文切换

            进程调度时会触发上下文切换,linux 为每个 cpu维护一个队列,将活跃进程按照优先级和等待 cpu的时间排序,然后选择优先级最高或等待 cpu时间最长的进程来运行。

            比如有几种常见情况会触发进程上下文切换:

            1.进程正常执行完,从队列中取出新进程执行。

            2.进程分配的cpu时间片用完了,但仍未执行完任务。

            3.系统资源不足时,要等到资源满足后才可以运行,此时进程被挂起。

            4.调用sleep函数。

            5.有更高优先级进程运行。

    二、线程上下文切换

            线程是系统调度的基本单位,进程是资源拥有的基本单位,为线程提供虚拟内存,全局变量等资源。线程上下文切换分为两种情况:

            1.两个线程属于不同进程,此时进程资源不共享,线程上下文切换等于进程上下文切换

            2.两个线程属于同个进程,此时进程资源共享,在线程切换时进程资源不变,只切换线程私有数据,此时线程上下文切换消耗资源比进程少。

    三、中断上下文切换

            由于硬件(鼠标、键盘)优先级高于进程优先级,收到硬件指令后会打断正在执行的进程,转而执行硬件指令,这种情况被称为中断上下文切换。

            中断上下文切换不涉及进程用户态,发生中断上下文切换时不用保存和恢复进程的虚拟内存,全局变量等,性能消耗会比进程上下文切换低。

    四、查看上下文切换

            可使用vmstat查看系统总体cpu上下文切换和中断次数。

            vmstat 2 2 表示每两秒统计一次,统计两次。

            对于上下文切换主要观察以下指标: 

            cs:每秒上下文切换次数。

    i        n:每秒中断次数。

            当发现系统总体上下文切换次数过高时,可使用pidstat -w查看进程上下文切换次数,或使用pidstat -wt查看线程上下文切换次数。

             cswch/s:每秒自愿上下文切换次数,自愿上下文切换指进程无法获取所需自愿,导致的上下文切换,当自愿上下文切换次数增加时表明进程都在等待资源,此时磁盘io可能发生问题。

            nvcswch/s :每秒非自愿上下文切换次数,非自愿上下文切换指进程时间片用完了,被强制调度,当非自愿上下文切换次数增加表明进程间竞争cpu严重,此时cpu是系统瓶颈。

            pidstat只能分析性能,无法查看中断的详细信息,可通过watch -d cat /proc/interrupts查看详细信息。

           

                

          

    展开全文
  • CPU上下文切换详解

    2020-06-30 14:43:23
    本篇博客我就来简单介绍下CPU上下文切换相关的知识。 CPU 上下文 我们知道 linux 操作系统是一个多任务处理系统,它支持远超过CPU数量的任务 “并发” 执行。这里的并发不是说同一时刻一起执行,而是指多个任务快速...

    概述

    上篇博客我简单介绍了用户态以及内核态相关知识,在实际并发专题中,除了CPU状态的切换,CPU的上下文切换也非常重要。本篇博客我就来简单介绍下CPU上下文切换相关的知识。


    上下文切换

    本篇博客分以下几个模块展开:

    1. CPU 上下文
    2. CPU 上下文切换
    3. CPU 上下文切换的类型
    4. CPU 上下文切换的消耗
    5. 频繁上下文切换问题解决

    1、CPU 上下文

    我们知道 linux 操作系统是一个多任务处理系统,它支持远超过CPU数量的任务 “并发” 执行。这里的并发不是说同一时刻一起执行,而是指多个任务快速切换执行,因为切换的速度极快,给人一种多个任务同时执行的错觉。

    而每个任务执行前,CPU都需要知道这个任务从哪里开始加载,从哪里开始执行,也就是需要CPU提前加载好 寄存器程序计数器

    • 寄存器:寄存器是CPU中一块内存较小但运算极快的内存区域。

    • 程序计数器:程序计数器是一种专用的寄存器,它主要保存当前或下一条需要被执行的指令地址。

    这里所说的寄存器和程序计数器就是CPU的上下文,因为它们都是 CPU 在运行任何任务前,必须依赖的环境。


    2、CPU 上下文切换

    上下文切换是指 CPU 从一个进程或线程切换到另一个进程或线程。下面我通过进程的上下文切换举个例子:

    1. 挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中某处
    2. 在要切换的进程内存中检索上下文并加载到CPU寄存器和程序计数器
    3. CPU 跳转到程序计数器所指向的位置,恢复进程执行。

    3、CPU 上下文切换的种类

    根据切换任务的不同,上下文切换一般分为以下四种:

    • 系统调用
    • 进程上下文切换
    • 线程上下文切换
    • 中断上下文切换

    3-1、系统调用

    上篇博客我们提到用户态和内核态,对应进程运行的空间就可以分为用户空间和内核空间。

    进程既可以在用户空间运行,也可以在内核空间运行。当进程在用户空间运行时,我们称当前调度进程的CPU处于用户态,当进程在内核空间运行时,我们称当前CPU处于内核态

    当任务调用 系统调用 时,CPU状态需要从用户态切换到内核态。在这个过程中实际就发生了上下文切换,整个过程如下所示:

    1. 首先,把 CPU 用户态的上下文(寄存器里指令位置)保存到内存某处
    2. 为了执行内核代码,CPU 需要加载内核态的上下文到寄存器
    3. CPU 跳转到内核态指令位置执行系统调用
    4. 系统调用执行完毕后,CPU切回用户态、进入用户空间,加载用户态的上下文并恢复执行

    也就是说:一次系统调用会导致两次上下文切换。(用户态 > 内核态 > 用户态)

    但系统调用的过程中并不会涉及虚拟内存等进程用户态的资源,也不会切换进程,这和平时说的进程上下文切换是不一样的:

    • 进程上下文切换,是指从一个进程切换到另一个进程运行
    • 系统调用过程中一直是同一个进程在运行

    因此,系统调用的过程通常称为 特权模式切换,而不是上下文切换。


    3-2、进程上下文切换

    在操作系统中,进程(应用程序)在用户空间相互独立,互相不能察觉到对方的存在,也不能互相访问内存资源,而进程又是通过内核调度的,因此进程的切换只能发生在内核态。

    因为在内核态切换的原因,进程的上下文除了包括虚拟内存、栈、全局变量等用户空间资源外,还包括内存堆栈、寄存器等内核空间的状态。

    也就是说:进程的上下文切换在保存当前进程的内核状态和 CPU 寄存器之前,需先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈

    Linux 为每个 CPU 维护了一个就绪队列,将活跃进程按照优先级和等待 CPU 的时间排序,然后选择最需要 CPU 的进程,也就是优先级最高和等待 CPU 时间最长的进程来运行。那么,进程在什么时候才会在内核态上下文切换呢?

    1. 进程执行完终止了,它之前使用的 CPU 会释放出来,这时再从就绪队列中拿一个新的进程来运行
    2. 为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片被轮流分配给各个进程。当某个进程时间片耗尽了就会被系统挂起,切换到其它等待 CPU 的进程运行
    3. 进程在系统资源不足时,要等待资源满足后才可以运行,这时进程也会被挂起,并由系统调度其它进程运行。
    4. 当进程通过睡眠函数 sleep 主动挂起时,也会重新调度
    5. 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行。
    6. 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序。

    3-3、线程上下文切换

    进程是操作系统资源分配的基本单位,线程才是操作系统调度的基本单位。也就是说,内核在调度进程时,实际上就是在调度线程。进程为它所拥有的所有线程提供虚拟内存和全局变量等资源

    当进程中只有一个线程时,进程内部不存在线程上下文切换。当进程内部有多个线程时,因为所有线程共享虚拟内存和全局变量,因此这些资源在上下文切换时是不需要保存的,但线程有自己独享的资源,如栈或寄存器等,这些资源在上下文切换时是需要保存的。

    根据切换前后线程所在进程是否相同,线程的上下文切换分为以下两种:

    1. 进程内部上下文切换时,因为共享进程资源,因此上下文切换只需要保存线程独占数据和寄存器
    2. 不同进程间上下文切换时,因为不存在共享数据,此时就等同于进程上下文切换

    从这里就可以看出,进程内部上下文切换所需要保存和恢复的上下文数据较少,相应的资源损耗也就更少,效率更高,这也是多线程的一大优势。


    3-4、中断上下文切换

    为了快速响应硬件事件,中断处理会打断当前正在运行的进程,转而调用中断处理程序,响应设备事件。当在打断进程时,就需要把当前进程的状态保存起来,这样在中断处理程序执行结束后,进程可以从原来中断处接着运行。

    跟进程上下文不同,中断上下文切换并不涉及到进程的用户态。所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。中断上下文,其实只包括内核态中断服务程序执行所必需的状态,包括 CPU 寄存器、内核堆栈、硬件中断参数等。

    对同一个 CPU 来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上下文切换同时发生。同样道理,由于中断会打断正常进程的调度和执行,所以大部分中断处理程序都短小精悍,以便尽可能快的执行结束。


    4、上下文切换的消耗

    通过前面的分析,我们可以看出不同的上下文切换所要消耗的资源也是不同的。进程间切换所要耗费的资源最多,进程内部线程间上下文切换所要消耗的资源较少。当执行系统调用时,会发生特权模式切换,切换前后都在同一个进程中,所要耗费的资源最少。

    频繁的上下文切换可能会导致系统性能问题,特别是在进程上下文切换次数较多的情况下,很容易导致 CPU 将大量时间消耗在寄存器、内核栈、虚拟内存等资源的保存和恢复上,从而大大缩短了真正运行进程的时间。

    Linux 通过 TLB(Translation Lookaside Buffer)来管理虚拟内存到物理内存的映射关系。当虚拟内存更新后,TLB 也需要刷新,内存的访问也会随之变慢。特别是多处理器系统上,缓存是被多个处理器共享的,刷新缓存不仅会影响当前处理器的进程,还会影响共享缓存的其它处理器的进程。


    5、频繁上下文切换问题解决

    如果系统真正因为频繁上下文切换导致性能问题时,可以通过以下方式排查问题:

    • 自愿上下文切换变多时,说明进程都在等待资源,有可能发生了 IO ,死锁等问题

    • 非自愿上下文切换变多时,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈

    • 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。


    参考:
    https://zhuanlan.zhihu.com/p/52845869
    http://ifeve.com/context-switch-definition/
    https://www.linuxblogs.cn/articles/18120200.html
    展开全文
  • 操作系统CPU上下文切换

    万次阅读 2016-10-10 20:16:01
    在切换时,一个进程存储在处理器各寄存器中的中间数据叫做进程的上下文,所以进程的切换实质上就是被中止运行...如果太短,又会造成系统频繁上下文切换,使性能 下降。对于IO Bound的系统来讲并不需要太长的时间片,
  • linux性能速查-CPU上下文切换(二)

    千次阅读 2019-03-28 10:49:40
    既然我们知道频繁CPU上下文切换会导致平均负载升高,那么如何排除问题呢? 使用性能监控工具vmstat可以查看上下文切换次数,中断数,就绪队列长度,不可中断数等指标。 如上图所示,重点关注: cs-每秒上下文...
  • Linux CPU 上下文切换

    千次阅读 2015-01-07 11:00:10
    cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如 在apache和nginx这种web服务器中,我们...
  • 本质原因是:上下文切换 当然更准确的说是:过多的上下文切换是导致平均负载升高的凶手。正常的上下文切换是系统调度任务的必要手段。 1.什么是上下文? 任务中的CPU寄存器,程序计数器都是上下文,可以理解为...
  • 一、CPU上下文概念和种类 二、进程上下文切换 三、线程上下文切换 四、中断上下文切换 五、系统中断上下文切换分析工具 六、案例分析 七、切换分析思路总结: 一、CPU上下文概念和种类 Linux是一个多任务...
  • 简单回顾一下,CPU 上下文切换是保证 Linux 系统正常工作的一个核心功能,按照不同场景,可以分为进程上下文切换、线程上下文切换和中断上下文切换。具体的概念和区别,你也要在脑海中过一遍,忘了的话及时查看上一...
  • [性能优化]-CPU上下文切换

    千次阅读 2018-08-02 17:19:23
    [性能优化]-CPU上下文切换 1 说说进程上下文 2 上下文切换 3 进程上下文切换与性能优化 4 进程和线程-上下文切换区别 5 线程上下文切换与性能优化 6 总结 [性能优化]-CPU上下文切换 second60 20180802 ...
  • 1、CPU使用率 1.1 CPU使用率查看 当发现服务或机器卡的时候,我们都是先通过top命令查看服务器CPU使用率 #默认每3秒刷新一次 top top - 18:10:58 up 1216 days,  7:38,  4 users,  load average: ...
  •  什么是CPU上下文切换?  现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个任务,这个过程叫做上下文切换。时间片轮转的方式,使得多个...
  • 进程上下文频繁切换导致load average过高 2016年6月26日admin发表评论阅读评论 一、问题现象 现网有两台虚拟机主机95%的cpu处于idle状态,内存使用率也不是特别高,而主机的load average达到了40多...
  • 进程切换  进行进程切换就是从正在运行的进程中收回处理器,然后再使待运行进程来占用处理器。 这里所说的从某个进程收回处理器,实质就是把进程存放在处理器 的寄存器中的中间数据找个地方存起来,从而把...
  • 多线程频繁上下文切换

    万次阅读 2020-08-06 13:26:10
    什么是上下文切换 在单核cpu中,多线程的执行是通过cpu的时间片分配,每个线程会分配到一个时间片,循环执行这些线程,线程时间片消耗完了就会进入等待状态,直到分配到新的时间片,因为时间片的时间非常短,所以cpu...
  • 什么是CPU上下文切换?  现 在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个任务,这个过程叫做上下文 切换。时间片轮转的方式,使得多个...
  • 服务器运行的java 应用,但是通过监控查看服务器的状态时,发现,有时cpu上下文切换数会突然上升,达到千万的级别,然后不到10s又迅速恢复正常,在晚上会比较频繁cpu的中断数一直保持正常,大概在几万左右。这段...
  • 过多上下文切换会把CPU时间消耗再寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行时间,是系统性能下降的一个主要原因。 vmstat查看系统上下文切换情况: cs(context switch)每秒上下文...
  • 通过htop查看cpu使用率,看到哪个进程占用的cpu比较多,然后在看vmstat.看到上下午切换cs的次数很高,在通过pidstat查看是不是sys bench引起... vmstat 1 1:分析内存使用情况、cpu上下文切换和中断的次数。cs每秒上...
  • 简介:介绍什么是上下文切换以及上下文切换所带来的挑战 cpu为线程分配时间片,时间片非常短(毫秒级别),cpu不停的切换线程执行,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个...
  • 这里发生的CPU上下文切换时CPU寄存器原来用户态的指令位置,先保存起来,接着执行内核态代码,CPU寄存器需要更新为内核态执行新位置,最后跳转到内核态运行内核任务,最后调用结束,再次CPU寄存器切换到用户空间。...
  • CPU-上下文切换,运行队列和使用率

    千次阅读 2017-12-13 14:18:10
    关于CPU,有3个重要的概念:上下文切换(context switchs),运行队列(Run queue)和使用率(utilization)。   上下文切换:   目前流行的CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,135
精华内容 15,254
关键字:

cpu上下文切换频繁