微信公众号:运维开发故事,作者:夏老师

进程

进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。进程与线程之间的关系 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

linux中线程与进程

linux内核中,进程与线程它们虽然都是任务,但是应该加以区分。其中,pid 是 process id,tgid 是 thread group ID。任何一个进程,如果只有主线程,那 pid 是自己,tgid 是自己,group_leader 指向的还是自己。但是,如果一个进程创建了其他线程,那就会有所变化了。线程有自己的 pid,tgid 就是进程的主线程的 pid,group_leader 指向的就是进程的主线程。所以有了 tgid,我们就知道 tast_struct 代表的是一个进程还是代表一个线程了。关系如下:图片来源[1]

关于线程与进程的内核参数

  1. ulimit 限制,在 Linux 下执行ulimit -a,你会看到 ulimit 对各种资源的限制。其中的“max user processes”就是一个进程能创建的最大线程数,我们可以修改这个参数:
ulimit -u 66535

2.参数sys.kernel.threads-max限制。这个参数限制操作系统全局的线程数,通过下面的命令可以查看它的值。查看threads-max的方法:

cat /proc/sys/kernel/threads-max
32768

修改这个值的方法:

#方法一,重启后会失效
echo 65535 > /proc/sys/kernel/threads-max
#方法二,永久修改
echo "kernel.threads-max = 65535" >> /etc/sysctl.conf

3.参数sys.kernel.pid_max限制。这个参数限制操作系统全局的线程数,通过下面的命令可以查看它的值。这里说一下32位操作系统这个值最大是32768不能修改,64位系统上pid_max最大值为2^22。Linux 内核在初始化系统的时候,会根据机器 CPU 的数目来设置 pid_max 的值。比如说,如果机器中 CPU 数目小于等于 32,那么 pid_max 就会被设置为 32768(32K);如果机器中的 CPU 数目大于 32,那么 pid_max 就被设置为 N*1024 (N 就是 CPU 数目)。查看pid_max的方法:

cat /proc/sys/kernel/pid_max
32768

修改这个值的方法:

#方法一,重启后会失效
echo 65535 > /proc/sys/kernel/pid_max
#方法二,永久修改
echo "kernel.pid_max = 65535" >> /etc/sysctl.conf

注意:一个线程数也会占用一个pid,所以threads-max须要小于等于pid_max。

容器线程数量的限制

对于 Linux 系统而言,容器就是一组进程的集合。如果容器中的应用创建过多的进程或者出现 bug,就会产生类似 fork bomb 的行为。这样,不但会使同一个节点上的其他容器无法工作,还会让宿主机本身也无法工作。所以对于每个容器来说,我们都需要限制它的最大进程数目,而这个功能由 pids Cgroup 这个子系统来完成。之前遇到过这样一个问题,java应用因为要处理很多定时任务,一个定时任务拉起一个线程。但是由于代码上的 bug ,没有及时对线程进行回收,然后这个容器不断产生线程,耗尽了宿主机的进程表空间,最终导致整台linux上的服务报错“java.lang.OutOfMemoryError: Unable to create native threads”,影响了其它的服务。创建进程出现“Resource temporarily unavailable”的报错。这种问题除了让开发人员修复 bug 外,也需要在系统层面对线程数量进行限制。

cgroup

cgroup中对pid进行了隔离,通过更改docker/kubelet配置,可以限制pid总数,从而达到限制线程总数的目的。

  • docker,容器启动时设置 --pids-limit 参数,限制容器级别pid总数

  • kubelet,开启SupportPodPidsLimit特性,设置–pod-max-pids参数,限制node每个pod的pid总数

原理如下:在一个容器建立之后,创建容器的服务会在 /sys/fs/cgroup/pids 下建立一个子目录,就是一个控制组,控制组里最关键的一个文件就是 pids.max。kubelet或者docker向这个文件写入数值,而这个值就是这个容器中允许的最大进程数目。Kubernetes 里面的每个节点都会运行一个叫做 Kubelet 的服务,负责节点上容器的状态和生命周期,比如创建和删除容器。根据 Kubernetes 的官方文档 Process ID Limits And Reservations 内容,可以设置 Kubelet 服务的 –pod-max-pids 配置选项,之后在该节点上创建的容器,最终都会使用 Cgroups pid 控制器限制容器的进程数量。

总结

linux中为了防止进程恶意使用资源,系统使用ulimit来限制进程的资源使用情况(包括文件描述符,线程数,内存大小等)。同样地在容器化场景中,需要限制其系统资源的使用量。pid是计算机重要资源,所以需要在使用时,加以限制,以保证资源的合理利用。dockerd暂无默认的pid limit设置;k8s 限制线程数,可通过在kubelet中开启SupportPodPidsLimit特性,设置pod级别pid limit。

好了,今天的内容就到这里。我是夏老师,祝你今天知识吃饱,我们下次再见。

linux中进程与线程相关推荐

  1. linux 中线程是什么意思,Linux中进程与线程的区别是什么

    Linux中进程和线程的区别是什么?我相信很多没有经验的人对此无能为力.因此,本文总结了问题产生的原因及解决方法.希望你能通过这篇文章解决这个问题. Linux中进程和线程的对比与区别 1.概念 进程 ...

  2. linux中的进程与线程,linux中进程和线程的区别是什么

    linux中进程和线程的区别是:1.一个程序至少有一个进程,一个进程至少有一个线程:2.线程的划分尺度小于进程:3.进程在执行过程中拥有独立的内存单元,而多个线程共享内存. 进程与线程的定义 (推荐学 ...

  3. linux中进程pid,线程tid以及线程pid

    进程pid 进程pid(进程ID),每个进程在系统中都有一个唯一·的非负整数表示的进程ID,用getpid() 获取进程ID. 线程tid 线程tid(线程ID),每个线程在所属进程中都有一个唯一的线 ...

  4. 理解Linux的进程,线程相关的各类ID:PID,LWP,TID,TGID

    最近实验室遇到了一个关于PID的问题,让我也跟着学习一下,查看了一下相关资料,找到一篇关于Linux进程和线程的各种ID的介绍,所以转载了过来. 作者:wipan 来源:cnblogs 地址:http ...

  5. 关于linux的进程和线程

    关于linux的进程和线程 http://kenby.iteye.com/blog/1014039 Linux下的多线程编程 http://fanqiang.chinaunix.net/a4/b8/2 ...

  6. linux下查看进程的线程数,linux查看进程的线程数

    top -H -p $PID  #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...

  7. linux中进程与cpu核的绑定

    linux中进程与cpu核的绑定 一.cpu亲缘性 二.fork用法 三.设置进程与cpu的亲缘性 一.cpu亲缘性 进程绑定CPU亲缘性,使得进程只能在指定的cpu上进行调度或者运行. 绑定cpu亲 ...

  8. linux的进程与线程通信方式,Linux的进程/线程间通信方式总结

    Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...

  9. 【Linux 内核】进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 )

    文章目录 一.Linux 中进程的 CPU 资源调度 二.进程生命周期 三.进程生命周期之间的转换 一.Linux 中进程的 CPU 资源调度 Linux 操作系统 是 多任务系统 , 可以 同时运行 ...

最新文章

  1. 包(package)
  2. SqlServer为字段创建索引
  3. C高级第一次PTA作业(2)
  4. ado.net 查询 小结 c# 1614653302
  5. C#在控制台输出异常所在的行数
  6. 数据结构与算法读书笔记2----C# 选择排序
  7. 电源噪声(EMI)滤波器的基本原理与应用方法
  8. LeetCode使用简介(leetcode中国-力扣)
  9. linux管理员下安装网易云,在Ubuntu 18.10系统中安装网易云音乐的方法
  10. 每日英语--Week8
  11. Hadoop 安装指南
  12. 前端html的base64使用方法window.btoa()和window.atob()
  13. CSDN 学习勋章获得攻略
  14. 产品经理常用词汇汇总
  15. 找回你的xournal++未保存文档
  16. 变化向量检测方法CVA(change vector analysis)
  17. PTA单链表 - 20. 单值化(去重)
  18. Eclipse中properties配置文件的中文乱码
  19. react组件中的constructor和super小知识
  20. 手把手交你安装配置sumo(解决netedit.exe打不开.xml文件)

热门文章

  1. 计算机如何自我介绍教程,2020计算机专业自我介绍4篇
  2. 打印机不识别墨盒?我们总结了应对方法
  3. 智能水肥一体化技术应用示范项目竞争性谈判成
  4. 2018.01.27 我懂你的知识焦虑
  5. 时钟的时针、分针和秒针重合问题
  6. 3dmax 打开查看模型
  7. A3 PDF 转 A4两页 打印
  8. 某音播放量、分享量风控策略研究
  9. 《从问题到程序:用Python学编程和计算》——练习
  10. oTree学习教程(六)Multiplayer games