[转帖]进程上下文频繁切换导致load average过高

进程上下文频繁切换导致load average过高

2016年6月26日admin发表评论阅读评论

http://www.361way.com/linux-context-switch/5131.html

一、问题现象

现网有两台虚拟机主机95%的cpu处于idle状态,内存使用率也不是特别高,而主机的load average达到了40多。

二、问题分析

先在主机上通过top、free、ps、iostat 等常用工具分析了下主机的CPU、内存、IO使用情况,发现三者都不高。通过vmstat 1 查看的结果如下:

从vmstat的输出结果来看,io项的block in 和block out 并不频繁。而system项的每称的中断数(in)、每秒的上下文切换(cs)特别频繁。这就造成load avaerage会特别高。大方向上的根因找到了,具体是哪个进程如何频繁的进行中断和上下文件的切换呢?

这里使用pidstat -w 1 (每秒刷新输出上下文切换情况),输出见下图:

从上图中可以看到有cswch(自愿的上下文切换)和nvcswch(非自愿的上下文切换)及对应的命令, 出vsftpd占用的文件交换比较多。可以看到这里显示的cs 值和总值还是有比较大的差距,由于主机上启动了不止一个vsftpd进程,而且pidstat 通过1秒刷新的时候并不会显示所有,通过pidstat -w执行几次收集所有发现所有的vsftpd进程占用的cs值叠加和vmstat里的比较相近了。

将结果通知业务人员后,和业务人员的猜测也一致,由于ftp使用的目录结构层次较深、文件数也比较多,业务在备份老的使用目录并重新创建单层目录后,观察一段后,发现load average降下来了,稳定在1以下。

当然这里只是处理方法的一种,现网中有些程序不好进行这样的修改的,又不让让进程在cpu之间频繁切换的,也有通过设置固定运行的CPU上进行调优的方法,如下两个进程运行在0-7号cpu上:

  1. [[email protected] ~]# taskset -c -p 6389
  2. pid 6389‘s current affinity list: 0-7
  3. [[email protected] ~]# taskset -c -p 6580
  4. pid 6580‘s current affinity list: 0-7

可以通过taskset让其固定在0-1号cpu上运行:

  1. [[email protected] ~]# taskset -c 0,1 -p 6389

这样做的原理是每当进程在切换到下一个cpu core上进会flush当前的cache数据,指定CPU时会减少这样的操作,增加进程的处理速度。这个对老的程序调优时比较有效。

三、有关上下文切换

1、上下文切换的理解

什么是上下文件切换呢?引用老外的一句话:A context switch (also sometimes referred to as a process switch or a task switch) is the switching of the CPU (central processing unit) from one process or thread to another.更详细的说明可以参看linfo站点 或 维基百科 。

context switch过高会导致CPU像个搬运工,频繁在寄存器和运行队列之间奔波 ,更多的时间花在了线程切换,而不是真正工作的线程上。直接的消耗包括CPU寄存器需要保存和加载,系统调度器的代码需要执行。间接消耗在于多核cache之间的共享数据。

2、引起上下文切换的原因

对于抢占式操作系统而言, 大体有几种:

  • 当前任务的时间片用完之后,系统CPU正常调度下一个任务;
  • 当前任务碰到IO阻塞,调度线程将挂起此任务,继续下一个任务;
  • 多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下一个任务;
  • 用户代码挂起当前任务,让出CPU时间;
  • 硬件中断;

什么样的操作会引起CS,这里有一篇博文感觉写的很不错,虽然其中的代码部分并不是理解 。其中有如下几句话:

linux中一个进程的时间片到期,或是有更高优先级的进程抢占时,是会发生CS的,但这些都是我们应用开发者不可控的 ---前面一部分描述的很到位,后面一部分在系统层面和kernel 开发层面可以调用nice 或 renice进行设置优先级以保证某些程序优先在CPU中的占用时间,但也不能细化到CS层面。

站在开发者的角度,我们的进程可以主动地向内核申请进行CS 。操作方法为:休眠当前进程/线程;唤醒其他进程/线程 。

3、上下文切换测试工具

1、LMbench 是带宽(读取缓存文件、内存拷贝、读写内存、管道等)和反应时间(上下文切换、网路、进程创建等)的评测工具;

2、micro-benchmark contextswitch 可以测试不同的CPU在最少多少ns可以进行一次上下文件切换,再转化为秒,我们可以确认该处理器每可以进行的上下文件切换数 ,该工具的使用可以参看tsuna的blog

4、上下文切换的查看方法

sar -w ,这个只是能看出主机上总的上下文件切换的情况

  1. # sar -w 1
  2. proc/s
  3. Total number of tasks created per second.
  4. cswch/s
  5. Total number of context switches per second.

同样,vmstat也可以查看总的上下文切换情况,不过vmstart输出的结果更多,便比通过对比发现问题:

  1. # vmstat 3
  2. procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  3. r b swpd free buff cache si so bi bo in cs us sy id wa
  4. 2 0 7292 249472 82340 2291972 0 0 0 0 0 0 7 13 79 0
  5. 0 0 7292 251808 82344 2291968 0 0 0 184 24 20090 1 1 99 0
  6. 0 0 7292 251876 82344 2291968 0 0 0 83 17 20157 1 0 99 0
  7. 0 0 7292 251876 82344 2291968 0 0 0 73 12 20116 1 0 99 0

查看每个进程或线程的上下文件使用情况,可以使用pidstat命令或者通过查看proc 。

  1. # pidstat -w 每个进程的context switching情况
  2. # pidstat -wt 细分到每个threads
  3. 查看proc下的文件方法如下:
  4. # pid=307
  5. # grep ctxt /proc/$pid/status
  6. voluntary_ctxt_switches: 41 #自愿的上下文切换
  7. nonvoluntary_ctxt_switches: 16 #非自愿的上下文切换

cswch/s: 每秒任务主动(自愿的)切换上下文的次数,当某一任务处于阻塞等待时,将主动让出自己的CPU资源。

nvcswch/s: 每秒任务被动(不自愿的)切换上下文的次数,CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。

上下文切换部分零零碎碎先到这里吧,只是想说明上下文切换还是比较重要的一个指标的。nagios check_mk默认有对上下文的监控,其使用的方法是通过两/proc/stat文件里取到ctxt行,并取两个时间段之间的差值来确认。

  1. # cat /proc/stat|grep ctxt
  2. ctxt 111751207

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/11646751.html

时间: 2024-08-13 01:48:57

[转帖]进程上下文频繁切换导致load average过高的相关文章

理解Linux系统中的load average

理解Linux系统中的load average(图文版) 博客分类: Linux linux load nagios 一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing).也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟

Load Average和CPU使用率的区别

Load Average 是指在运行队列里面的任务数,假如只有1个进程在运行队列里面1分钟,那1分钟的load average就是1:只有1个进程在运行队列里面半分钟,那1分钟的load average就是0.5,意思是在过去1分钟内,运行队列有50%的时间是没有任务的. 处在运行队列里面的进程的状态是R,在Linux中,除了R状态的进程会被计算进load average外,D状态的进程也会被计算进去,D状态的进程就是处于uninterruptable sleep(不可被打断)状态的进程,这些进

[转]理解Linux系统中的load average

转自:http://heipark.iteye.com/blog/1340384 谢谢,写的非常好的文章. 一.什么是load average linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing).也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均

理解Linux系统中的load average(图文版)转

一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing).也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均 Load . 我们可以通过系统命令"w"查看当前load average情况 [[email p

理解LINUX LOAD AVERAGE的误区

一直不解,为什么io占用较高时,系统负载也会变高,偶遇此文,终解吾惑. uptime和top等命令都可以看到load average指标,从左至右三个数字分别表示1分钟.5分钟.15分钟的load average: $ uptime 18:05:09 up 1534 days, 7:42, 1 user, load average: 5.76, 5.54, 5.61 Load average的概念源自UNIX系统,虽然各家的公式不尽相同,但都是用于衡量正在使用CPU的进程数量和正在等待CPU的进

load average 定义(网易面试)

1. load average 定义 linux系统中的Load对当前CPU工作量的度量.简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均 Load . 通过系统命令"w"查看当前load average情况 上边0.31,0.30,0.31表示 第一位0.31:表示最近1分钟平均负载第二位0.30:表示最近5分钟平均负载第三位0.31:表示最近15分钟平均负载 注:linux系统是5秒钟进行一次Load采样 2. load a

Linux内核分析:页回收导致的cpu load瞬间飙高的问题分析与思考--------------蘑菇街技术博客

http://mogu.io/156-156 摘要 本文一是为了讨论在Linux系统出现问题时我们能够借助哪些工具去协助分析,二是讨论出现问题时大致的可能点以及思路,三是希望能给应用层开发团队介绍一些Linux内核机制从而选择更合适的使用策略. 前言 搜索团队的服务器前段时间频繁出现CPU load很高(比如load average达到80多)的情况,正所谓术业有专攻,搜索的兄弟们对Linux底层技术理解的不是很深入,所以这个问题困扰了他们一段时间. 相信我们在遇到问题时都有类似的经历,如果这个

进程上下文、中断上下文以及中断程序的特点

进程上下文VS中断上下文 内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而用户态应用程序运行在用户空间.它们代表不同的级别,而对系统资源具有不同的访问权限.内核模块运行在最高级别(内核态),这个级下所有的操作都受系统信任,而应用程序运行在较低级别(用户态).在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问.内核态和用户态有自己的内存映射,即自己的地址空间. www.2cto.com 处理器总处于以下状态中的一种: 1.内核态,运行于进程上下文,内核代表进程

进程上下文与中断上下文

最近学习驱动程序中总是发现在某些资料或书籍中提到进程上下文和中断上下文,但是又都没有讲解什么是上下文:因此笔者查阅资料补充了一下所谓的Linux上下文知识.(注:以下知识度娘而来) 上下文(context): 指文章或说话中与某一词语或文句相连的上文和下文:这个词的含义联系上下文不难理解.都不知道谁造出一个这么晦涩难懂的词的,翻译成语境和环境多好理解. (注:以上是度娘对古代文人骚客创作该词的百科) LINUX完全注释中的一段话:当一个进程在执行时,CPU的所有寄存器中的值.进程的状态以及堆栈中