再续《linux 3.10 一次softlock排查》,看运行态进程数量之多:

  1. crash> mach
  2. MACHINE TYPE: x86_64
  3. MEMORY SIZE: GB
  4. CPUS:
  5. HYPERVISOR: KVM
  6. PROCESSOR SPEED: Mhz
  7. HZ:
  8. PAGE SIZE:
  9. KERNEL VIRTUAL BASE: ffff880000000000
  10. KERNEL VMALLOC BASE: ffffc90000000000
  11. KERNEL VMEMMAP BASE: ffffea0000000000
  12. KERNEL START MAP: ffffffff80000000
  13. KERNEL MODULES BASE: ffffffffc0000000
  14. KERNEL STACK SIZE:
  15. IRQ STACK SIZE:
  16. IRQ STACKS:
  17. CPU : ffff880b52a00000
  18. CPU : ffff880b52a40000
  19. CPU : ffff880b52a80000
  20. CPU : ffff880b52ac0000
  21. CPU : ffff880b52b00000
  22. CPU : ffff880b52b40000
  23. CPU : ffff880b52b80000
  24. CPU : ffff880b52bc0000
  25. CPU : ffff880b52c00000
  26. CPU : ffff880b52c40000
  27. CPU : ffff880b52c80000
  28. CPU : ffff880b52cc0000
  29. CPU : ffff881692200000
  30. CPU : ffff881692240000
  31. CPU : ffff881692280000
  32. CPU : ffff8816922c0000
  33. CPU : ffff881692300000
  34. CPU : ffff881692340000
  35. CPU : ffff881692380000
  36. CPU : ffff8816923c0000
  37. CPU : ffff881692400000
  38. CPU : ffff881692440000
  39. CPU : ffff881692480000
  40. CPU : ffff8816924c0000
  41. DOUBLEFAULT STACK SIZE:

但是,我们来看,有多少个running进程呢?

  1. ps |grep -i RU
  2. > ffffffff81a09480 RU 0.0 [swapper/]
  3. ffff88016e798fd0 RU 0.0 [swapper/]
  4. ffff88016e799fa0 RU 0.0 [swapper/]
  5. ffff88016e79af70 RU 0.0 [swapper/]
  6. ffff88016e79bf40 RU 0.0 [swapper/]
  7. ffff88016e79cf10 RU 0.0 [swapper/]
  8. ffff88016e79dee0 RU 0.0 [swapper/]
  9. ffff88016e79eeb0 RU 0.0 [swapper/]
  10. > ffff88016e008000 RU 0.0 [swapper/]
  11. ffff88016e008fd0 RU 0.0 [swapper/]
  12. ffff88016e009fa0 RU 0.0 [swapper/]
  13. > ffff88016e00af70 RU 0.0 [swapper/]
  14. > ffff880beeaceeb0 RU 0.0 [swapper/]
  15. ffff880beeacdee0 RU 0.0 [swapper/]
  16. ffff880beeaccf10 RU 0.0 [swapper/]
  17. > ffff880beeacbf40 RU 0.0 [swapper/]
  18. ffff880beeacaf70 RU 0.0 [swapper/]
  19. ffff880beeac9fa0 RU 0.0 [swapper/]
  20. ffff880beeb10000 RU 0.0 [swapper/]
  21. ffff880beeb10fd0 RU 0.0 [swapper/]
  22. ffff880beeb11fa0 RU 0.0 [swapper/]
  23. ffff880beeb12f70 RU 0.0 [swapper/]
  24. ffff880beeb13f40 RU 0.0 [swapper/]
  25. ffff880beeb14f10 RU 0.0 [swapper/]
  26. ffff880beeac8000 RU 0.0 systemd
  27. ffff88016e726eb0 RU 0.0 [rcu_sched]
  28. ffff88016e00eeb0 RU 0.0 [watchdog/]
  29. ffff88016e00cf10 RU 0.0 [ksoftirqd/]
  30. ffff88016e040fd0 RU 0.0 [watchdog/]
  31. ffff88016e045ee0 RU 0.0 [watchdog/]
  32. ffff88016e098000 RU 0.0 [ksoftirqd/]
  33. ffff88016e09af70 RU 0.0 [watchdog/]
  34. ffff88016e111fa0 RU 0.0 [watchdog/]
  35. ffff88016e163f40 RU 0.0 [watchdog/]
  36. ffff88016e198fd0 RU 0.0 [watchdog/]
  37. ffff880beeb3bf40 RU 0.0 [watchdog/]
  38. ffff880beeb7dee0 RU 0.0 [watchdog/]
  39. ffff880beebaaf70 RU 0.0 [watchdog/]
  40. ffff880beebf0000 RU 0.0 [watchdog/]
  41. ffff880beebf4f10 RU 0.0 [watchdog/]
  42. ffff880bee021fa0 RU 0.0 [watchdog/]
  43. ffff880bee026eb0 RU 0.0 [watchdog/]
  44. ffff880bee050fd0 RU 0.0 [ksoftirqd/]
  45. ffff880bee053f40 RU 0.0 [watchdog/]
  46. ffff880bee078fd0 RU 0.0 [watchdog/]
  47. ffff880b06e15ee0 RU 0.5 zte_uep1
  48. ffff88077fe08000 RU 0.5 zte_uep1
  49. ffff8814af3fbf40 RU 0.5 zte_uep1
  50. ffff8807967d6eb0 RU 0.5 java
  51. ffff880b4f5b5ee0 RU 0.0 systemd-journal
  52. ffff8809a4aacf10 RU 0.5 zte_uep1
  53. ffff880036a6cf10 RU 0.5 zte_uep1
  54. ffff880036022f70 IN 0.0 [xfs_mru_cache]
    。。。。。。。。。。。。。。。。。。。。列不完

看看个数:

  1. crash> ps |grep -w RU |wc -l

经常敲top的人肯定知道,running的进程数,一般是小于等于cpu的核数的,那为啥这个机器上这么多的running呢?为了排除是crash工具的问题,在从runqueue的角度来看下:

  1. crash> p runqueues
  2. PER-CPU DATA TYPE:
  3. struct rq runqueues;
  4. PER-CPU ADDRESSES:
  5. [0]: ffff880b52a17c00
  6. [1]: ffff880b52a57c00
  7. [2]: ffff880b52a97c00
  8. [3]: ffff880b52ad7c00
  9. [4]: ffff880b52b17c00
  10. [5]: ffff880b52b57c00
  11. [6]: ffff880b52b97c00
  12. [7]: ffff880b52bd7c00
  13. [8]: ffff880b52c17c00
  14. [9]: ffff880b52c57c00
  15. [10]: ffff880b52c97c00
  16. [11]: ffff880b52cd7c00
  17. [12]: ffff881692217c00
  18. [13]: ffff881692257c00
  19. [14]: ffff881692297c00
  20. [15]: ffff8816922d7c00
  21. [16]: ffff881692317c00
  22. [17]: ffff881692357c00
  23. [18]: ffff881692397c00
  24. [19]: ffff8816923d7c00
  25. [20]: ffff881692417c00
  26. [21]: ffff881692457c00
  27. [22]: ffff881692497c00
  28. [23]: ffff8816924d7c00
  29. crash> struct rq.nr_running ffff880b52a17c00
  30. nr_running = 7
  31. crash> struct rq.nr_running ffff880b52a57c00
  32. nr_running = 152

挨个查看一下nr_running个数,然后脚本统计如下:

  1. grep 'nr_running =' 1.txt |awk '{print $3}BEGIN{sum=0;num=0}{sum+=$3;num+=1}END{printf "%d\n",sum}'
  2. 7
  3. 152
  4. 113
  5. 138
  6. 65
  7. 4
  8. 4
  9. 38
  10. 4
  11. 148
  12. 43
  13. 1
  14. 1
  15. 141
  16. 4
  17. 43
  18. 107
  19. 102
  20. 91
  21. 110
  22. 108
  23. 105
  24. 98
  25. 3
  26. 1630-------------总数

为什么这个总数和我们ps看到的RU状态的总数不一致呢?一开始还以为是percpu统计的瞬时值问题,但是这两个总数的相差:1654-1630=24,刚好和cpu的核数一致。

  1. ps |grep -w 'RU'|grep 'swapper'
  2. > ffffffff81a09480 RU 0.0 [swapper/]
  3. ffff88016e798fd0 RU 0.0 [swapper/]
  4. ffff88016e799fa0 RU 0.0 [swapper/]
  5. ffff88016e79af70 RU 0.0 [swapper/]
  6. ffff88016e79bf40 RU 0.0 [swapper/]
  7. ffff88016e79cf10 RU 0.0 [swapper/]
  8. ffff88016e79dee0 RU 0.0 [swapper/]
  9. ffff88016e79eeb0 RU 0.0 [swapper/]
  10. > ffff88016e008000 RU 0.0 [swapper/]
  11. ffff88016e008fd0 RU 0.0 [swapper/]
  12. ffff88016e009fa0 RU 0.0 [swapper/]
  13. > ffff88016e00af70 RU 0.0 [swapper/]
  14. > ffff880beeaceeb0 RU 0.0 [swapper/]
  15. ffff880beeacdee0 RU 0.0 [swapper/]
  16. ffff880beeaccf10 RU 0.0 [swapper/]
  17. > ffff880beeacbf40 RU 0.0 [swapper/]
  18. ffff880beeacaf70 RU 0.0 [swapper/]
  19. ffff880beeac9fa0 RU 0.0 [swapper/]
  20. ffff880beeb10000 RU 0.0 [swapper/]
  21. ffff880beeb10fd0 RU 0.0 [swapper/]
  22. ffff880beeb11fa0 RU 0.0 [swapper/]
  23. ffff880beeb12f70 RU 0.0 [swapper/]
  24. ffff880beeb13f40 RU 0.0 [swapper/]
  25. ffff880beeb14f10 RU 0.0 [swapper/]

原来是因为idle进程默认在running态,但是并不算到nr_running的计数中:

  1. crash> ps |grep -w 'RU' |grep -w '12'
  2. > 0 0 12 ffff880beeaceeb0 RU 0.0 0 0 [swapper/12]
  3. 12 2 1 ffff88016e00eeb0 RU 0.0 0 0 [watchdog/1]-----------这个不是12cpu的进程
  4. 22237 1 12 ffff881254b5eeb0 RU 1.0 14321692 912420 1_scheduler
  5. crash> struct rq.nr_running ffff881692217c00
  6. nr_running = 1

为啥running这么多呢?查看处于running状态的task,堆栈都是 __schedule ,也就是就绪队列很长,

来挑一些看看堆栈:

  1. crash> bt
  2. PID: TASK: ffff8809d42daf70 CPU: COMMAND: "java"
  3. # [ffff88099eb93d58] __schedule at ffffffff816b6165
  4. # [ffff88099eb93dc0] schedule at ffffffff816b6ae9
  5. # [ffff88099eb93dd0] schedule_hrtimeout_range_clock at ffffffff816b5852
  6. # [ffff88099eb93e68] schedule_hrtimeout_range at ffffffff816b5903
  7. # [ffff88099eb93e78] ep_poll at ffffffff812526de
  8. # [ffff88099eb93f30] sys_epoll_wait at ffffffff81253b9d
  9. # [ffff88099eb93f80] system_call_fastpath at ffffffff816c2789
  10. RIP: 00007ffa43a652c3 RSP: 00007ffa2595b818 RFLAGS:
  11. RAX: 00000000000000e8 RBX: ffffffff816c2789 RCX: 00000000e14ef930
  12. RDX: RSI: 00000000047a5000 RDI:
  13. RBP: 00007ffa2595b630 R8: R9:
  14. R10: R11: R12: 0000016547341bca
  15. R13: R14: R15: 00000000047a5000
  16. ORIG_RAX: 00000000000000e8 CS: SS: 002b
  17. crash> bt
  18. PID: TASK: ffff8809cbe03f40 CPU: COMMAND: "java"
  19. # [ffff880a4eedbd58] __schedule at ffffffff816b6165
  20. # [ffff880a4eedbdc0] schedule at ffffffff816b6ae9
  21. # [ffff880a4eedbdd0] schedule_hrtimeout_range_clock at ffffffff816b5852
  22. # [ffff880a4eedbe68] schedule_hrtimeout_range at ffffffff816b5903
  23. # [ffff880a4eedbe78] ep_poll at ffffffff812526de
  24. # [ffff880a4eedbf30] sys_epoll_wait at ffffffff81253b9d
  25. # [ffff880a4eedbf80] system_call_fastpath at ffffffff816c2789
  26. RIP: 00007f7bb9bb72c3 RSP: 00007f7b8f060510 RFLAGS:
  27. RAX: 00000000000000e8 RBX: ffffffff816c2789 RCX: 00000000ffffffff
  28. RDX: RSI: 0000000005be3000 RDI:
  29. RBP: 00007f7b8f060310 R8: R9:
  30. R10: 00000000000003e8 R11: R12:
  31. R13: R14: 00000000000003e8 R15: 0000000005be3000
  32. ORIG_RAX: 00000000000000e8 CS: SS: 002b
  33. crash> task_struct.state ffff8809cbe03f40
  34. state =

看看状态值的宏:

  1. #define TASK_RUNNING 0
  2. #define TASK_INTERRUPTIBLE 1
  3. #define TASK_UNINTERRUPTIBLE 2
  4. #define __TASK_STOPPED 4
  5. #define __TASK_TRACED 8

再看看占有cpu的进程的堆栈,发现基本都在等锁,原本大家很快都能执行完,然后放到等待队列里面去,但是由于前面某个进程执行占着cpu不放,那么因为等待资源而得到唤醒的,处于就绪队列里面的进程自然得不到调度。当然这个是非抢占式内核的特点,高优先级的进程,也得等低优先级的进程主动放弃cpu,哪怕你已经在就绪队列,哪怕你的状态已经被改成了running,但就得等着。

linux 再多的running也挡不住锁的更多相关文章

  1. linux网络编程之posix信号量与互斥锁

    继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以 ...

  2. Linux再学习(一)-学习路线规划

    1 抛弃旧文化,迎接Linux命令新文化 Linux第一步,从Windows思维,切换到Linux的"命令行+文件"模式 在Linux中,做什么都有相应命令.一般就在bin或者sb ...

  3. Linux再谈互斥锁与条件变量

    原文地址:http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait总和一个互斥锁结合使用.在调用pthread_ ...

  4. 挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的

    .NET程序员也有自己的幸福,.NET的跨平台是一种幸福,.NET的开源也是一种幸福,而更幸福的是可以通过开源的.NET了解.NET是如何一步步走向跨平台的,所以幸福是一种过程. 在.NET跨平台的进 ...

  5. java中的finally用return也挡不住

    今晚做了科达的题,有一题就是这个意思,我自以为return中断一切,然而事实摆在眼前:

  6. 本科毕业平均年薪 30 万!经济寒冬挡不住 AI 人才的火热!

    互联网行业遭遇寒冬,企业纷纷裁员缩招,而 BAT 和硅谷明星公司对 AI 人才的投入却并不见放缓.为争夺相关人才,给应届毕业生开出的平均年薪高达 30 万. 而 TensorFlow 作为当下最流行的 ...

  7. Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

    互斥锁 #include <cstdio> #include <cstdlib> #include <unistd.h> #include <pthread. ...

  8. Linux组件封装(一)中互斥锁MutexLock的封装

    本文对Linux中的pthread_mutex_t做一个简易的封装. 互斥锁主要用于互斥,互斥是一种竞争关系,主要是某一个系统资源或一段代码,一次做多被一个线程访问. 条件变量主要用于同步,用于协调线 ...

  9. 求你了,别再问我Zookeeper如何实现分布式锁了!!!

    导读 真是有人(锁)的地方就有江湖(事务),今天不谈江湖,来撩撩人. 分布式锁的概念.为什么使用分布式锁,想必大家已经很清楚了.前段时间作者写过Redis是如何实现分布式锁,今天这篇文章来谈谈Zook ...

随机推荐

  1. vue 父组件主动获取子组件的数据和方法 子组件主动获取父组件的数据和方法

    Header.vue <template> <div> <h2>我是头部组件</h2> <button @click="getParen ...

  2. iOS 懒加载 字典转模型

    >>>懒加载 一.介绍 懒加载又称延时加载,即在系统调用时加载,如果系统不调用则不会加载,所谓懒加载其实就是重写其get方法. 在使用懒加载时要先判断该方法是否存在,如果不存在再进行 ...

  3. tips:可变参数列表

    tips:可变参数列表! 先来看看以往我们要传递许多参数时是怎么做的: java: public static void main(String []args){} c: int main(int a ...

  4. 基于拖放布局的 Twitter Bootstrap 网站生成器

    简单的几个拖放操作就能做出漂亮的 Twitter Bootstrap 网站?是的,LayoutIt 是一个 Twitter Bootstrap 界面生成器,能够帮助你快速制作出网站和界面模型,同时能够 ...

  5. 面向对象之—property,staticmethod

    一 特性( property) property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值. property是内置的一种封装方法:把一个属性“伪装”成一个数据属性,做法就是在需要伪装 ...

  6. 用户禁止cookie后,如何继续使用session

    (1)如果用户禁止cookie,服务器仍会将sessionId以cookie的方式发送给浏览器,但是,浏览器不再保存这个cookie(即sessionId)了. (2)如果想继续使用session,需 ...

  7. mysql给查询的结果添加序号

    1.法一: select  (@i:=@i+1)  i,a.url from  base_api_resources a  ,(select   @i:=0)  t2 order by a.id de ...

  8. Oracle 更改字符集 更改后之前的中文全成乱码了

    安装时采用什么字符集主要看你的需求,一般测试用的话,就用UTF8.后面可以修改, 10g:UTF8 到ZHS16GBK SHUTDOWN IMMEDIATE; STARTUP MOUNT ; ALTE ...

  9. MIME Type和Content-Type

    告知浏览器:资源的媒体类型MIME Type: application/json HTTP协议中的媒体类型,由 Web服务器告知浏览器的,更准确地说,是通过响应头中的Content-Type表示.Co ...

  10. 安装JavaFX Scene Builder,并配置到Eclipse

    转载自:https://www.yiibai.com/javafx/install-javafx-scene-builder-into-eclipse.html 1-JavaFX Scene Buil ...