发现问题

公司项目测试的时候,发现运行一段时间后会出现cpu百分之百的情况。

想着可能是哪里出现了死循环,于是打算用gdb跟一下,结果gdb居然无法attach到进程。。。。。。

定位问题

查了查去,原来有一个优先级为RT的实时线程出现了死循环,并且由于配置了CPU的亲和属性,使得进程只运行在第一个核上,此时gdb就无法attach了

使用taskset现场修改进程的cpu亲和属性后,发现这个占cpu百分百的实时线程并没有出现一般的死循环,而是每次都在pthread_rwlock_wrlock这个函数中,

而更诡异的是,只要修改了cpu亲和属性,就没有“死循环了”。。。。。。

实验

于是写了一段实验代码

  1. 1 #define _GNU_SOURCE
  2. 2 #include "stdio.h"
  3. 3 #include "stdlib.h"
  4. 4 #include "unistd.h"
  5. 5 #include "pthread.h"
  6. 6 #include <sched.h>
  7. 7
  8. 8 pthread_rwlock_t rwlock;
  9. 9
  10. 10 void* task1(void *arg)
  11. 11 {
  12. 12 pthread_setname_np(pthread_self(), "task1");
  13. 13
  14. 14 while(1)
  15. 15 {
  16. 16 printf("\r\n task1 lock \r\n");
  17. 17 pthread_rwlock_wrlock(&rwlock);
  18. 18
  19. 19 printf("\r\n task1 unlock \r\n");
  20. 20 pthread_rwlock_unlock(&rwlock);
  21. 21
  22. 22 usleep(10);
  23. 23 }
  24. 24 }
  25. 25
  26. 26 void* task2(void *arg)
  27. 27 {
  28. 28 struct sched_param sparam;
  29. 29
  30. 30 pthread_setname_np(pthread_self(), "task2");
  31. 31
  32. 32 /* 设置为最高优先级的实时任务 */
  33. 33 sparam.sched_priority = sched_get_priority_max(SCHED_RR);
  34. 34 pthread_setschedparam(pthread_self(), SCHED_RR, &sparam);
  35. 35
  36. 36 while(1)
  37. 37 {
  38. 38 printf("\r\n task2 lock \r\n");
  39. 39 pthread_rwlock_wrlock(&rwlock);
  40. 40
  41. 41 printf("\r\n task2 unlock \r\n");
  42. 42 pthread_rwlock_unlock(&rwlock);
  43. 43
  44. 44 usleep(10);
  45. 45 }
  46. 46 }
  47. 47
  48. 48 int main(int argc, char *argv[])
  49. 49 {
  50. 50 pthread_t t1, t2, t3;
  51. 51 cpu_set_t cpuset;
  52. 52
  53. 53 /* 设置cpu亲和属性,将进程绑定在第一个核上 */
  54. 54 CPU_ZERO(&cpuset);
  55. 55 CPU_SET(0, &cpuset);
  56. 56 sched_setaffinity(0, sizeof(cpuset), &cpuset);
  57. 57
  58. 58 pthread_rwlock_init(&rwlock, NULL);
  59. 59
  60. 60 pthread_create(&t2, NULL, task1, NULL);
  61. 61 sleep(3);
  62. 62 pthread_create(&t3, NULL, task2, NULL);
  63. 63
  64. 64 while (1)
  65. 65 sleep(10);
  66. 66
  67. 67 return 0;
  68. 68 }

运行结果,如下图

真的出现了CPU百分百的情况!!!

分析原因

1. 读写锁的“拿锁”和“放锁”操作并不是一个完整的原子操作,而是有可能操作到一半被调度出去;

2. 此次实验结果显示,task1(非实时)在做unlock操作时,已经修改了一部分读写锁的属性,此时task2(实时)lock时,发现不需要再阻塞了,只需要自旋等待(死循环)task1将unlock操作做完;

然而由于task1是实时任务,整个进程又只绑定到了第一个核上,task1无法得到调度,造成了task2的死循环。

Linux杂谈:进程锁核+实时线程导致的读写锁死循环的更多相关文章

  1. 大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁 在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论 ...

  2. Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔 ...

  3. 看linux连接进程占用的实时流量iftop netatop NetHogs

    因为新工厂的机器上面的业务混合部署非常严重,加上内网外网共用一个网卡(这个更不可思议),导致有时要定位一些进程流量的问题非常困难,所以最近花了点时间在网上搜集了一把  (aptitude search ...

  4. 关于linux的进程中的各个线程cpu占用情况的分析和查看

    我们常常会在新开的服搭建一个游戏的server,有时候要进行压力測试,那么怎样来看呢,一般我们会通过top命令查看各个进程的cpu和内存占用情况,获得到了我们的进程id,然后我们或许会通过pstack ...

  5. 查看linux连接进程占用的实时流量 -nethogs

    1.安装nethogs yum -y install nethogs 2.安装完成后,就可以执行命令 nethogs 3.实时查看进程流量,来个图显示 图中会显示当前的nginx产生的流量有多少都会清 ...

  6. Linux下同进程多进程号实时监控

    一.需求: Linux上对一个进程名称可能会对应的多个进程号的进程进行监控,如果有多个则输出到一个日志文件. 以上问题针对的是一个定时程序还未运行结束,到下一个时刻程序又运行起来了,避免造成重复调用接 ...

  7. Linux内核中锁机制之原子操作、自旋锁

    很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多 ...

  8. 大话Linux内核中锁机制之原子操作、自旋锁

    转至:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其 ...

  9. 大话Linux内核中锁机制之原子操作、自旋锁【转】

    转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...

随机推荐

  1. 043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用

    043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用 本文知识点:do-while循环介绍及应用 do-while循 ...

  2. python基础-面向对象opp

    上述是实例化对象的一个过程. 类的定义和实例化: class Role(object): #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写,以后再讲 ...

  3. Python基本数据类型详细介绍

    Python提供的基本数据类型主要有:布尔类型.整型.浮点型.字符串.列表.元组.集合.字典等等 1.空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能 ...

  4. HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 04

    工具1:HBuilder X 1.9.9.20190522 工具2:火狐浏览器 67.0.4 (64 位) 目前,我们已经将一些行和列插入到表格中,并设置单元格的背景颜色,显示 RGB 值等. 例 7 ...

  5. 阿里云服务器安装mongodb并且启动

    // 1.下载 我是直接在local里面创一个mongodb文件夹进行下载和解压 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_ ...

  6. 多测师_svn_004

    svn 版本控制工具项目管理中的版本控制问题:解决代码冲突困难容易引发bug难于恢复至正确版本无法进行权限控制项目版本发布困难 什么是版本控制是指维护工程蓝图的表座做法,能追踪工程蓝图从诞生到定案的过 ...

  7. day58 Pyhton 框架Django 01

    内容回顾 python基础    网路编程    并发编程    数据库    前端     osi7层           tcp/ip 5层模型    应用层    表示层             ...

  8. python算法常用技巧与内置库

    python算法常用技巧与内置库 近些年随着python的越来越火,python也渐渐成为了很多程序员的喜爱.许多程序员已经开始使用python作为第一语言来刷题. 最近我在用python刷题的时候想 ...

  9. elasticsearch-安装-centos7- es7.5 搭建

        centos6 搭建 参考 https://www.cnblogs.com/php-linux/p/8758788.html   搭建linux虚拟机  https://www.cnblogs ...

  10. composer 阿里云镜像配置

    https://developer.aliyun.com/composer 全局配置(推荐) 所有项目都会使用该镜像地址: composer config -g repo.packagist comp ...