systemd 对你的进程数限制横插一脚啦

简介: 原文:https://blog.apporc.org/2016/05/systemd-%E5%AF%B9%E4%BD%A0%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%95%B0%E9%99%90%E5%88%B6%E6%A8%AA%E6%8F%92%E4%B8%80%E8%84%9A%E5%95%A6/以往在执行海量进程并发的时候,看到这错:”fork:retry:no child process”,通常就想到 ulimit 了。


原文:https://blog.apporc.org/2016/05/systemd-%E5%AF%B9%E4%BD%A0%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%95%B0%E9%99%90%E5%88%B6%E6%A8%AA%E6%8F%92%E4%B8%80%E8%84%9A%E5%95%A6/


以往在执行海量进程并发的时候,看到这错:”fork:retry:no child process”,

通常就想到 ulimit 了。不过现在要注意,它也可能是 systemd 的梗喽。

ULIMIT

  • 回顾一下 ulimit

    内核对于用户可占用的资源可以作一些限制,ulimit 是调整这些限制的一个接口。
    这个接口就是个命令而已,主要用于系统运行时临时调整一些资源的限制,
    ulimit 命令是 bash 的内建命令,注意它是用于设置当前 shell 以及其子进程中
    的资源额度的。其它 shell 是怎么支持这个命令的这里暂略;

    对应的,如果想要永久性地调整资源限制,则需要更改文件
    /etc/security/limits.conf 或 /etc/security/limits.d
    我查看了一下,在我的 archlinux 以及 centos 7 上这个目录都是一致的,猜测
    应该不会有发行版自定义这个位置,这些配置文件是 pam_modules.so 内核模块的。

  • 下面来摸一下它们

    • 执行 ulimit -a 查看一下所有可设置的项目

      # ulimit -a
      core file size          (blocks, -c) 0
      data seg size           (kbytes, -d) unlimited
      scheduling priority             (-e) 0
      file size               (blocks, -f) unlimited
      pending signals                 (-i) 31858
      max locked memory       (kbytes, -l) 64
      max memory size         (kbytes, -m) unlimited
      open files                      (-n) 1024
      pipe size            (512 bytes, -p) 8
      POSIX message queues     (bytes, -q) 819200
      real-time priority              (-r) 0
      stack size              (kbytes, -s) 8192
      cpu time               (seconds, -t) unlimited
      max user processes              (-u) 4096
      virtual memory          (kbytes, -v) unlimited
      file locks                      (-x) unlimited

      基本上,每项的意义从名称中已知大概。本文关心的主要是 max user processes
      这一项,用户最大进程数,超过这个进程数就 fork 不了啦。

    • 执行 ulimit -u 来设置最大进程数

      # ulimit -u 8192

      设置过后,再用 ulimit -a 就可以看到效果啦。
      如果你看到这个 “Operation not permitted”,是因为作为普通用户权限不够。
      如果你无法获得 root 权限,那么 ulimit -S 是你的选择,-S 是说设置
      soft limit,用于普通用户设置自己的子进程资源限制, -H 对应的就是
      hard limit,ulimit 默认使用 -H 选项,只有 root 有权限使用。

    • 查看 /etc/security/limits.conf

      有以下四栏

      <domain>      <type>  <item>         <value>

      每一栏的含义,在默认配置文件中已经有解释,以下以 test 用户为例,
      设置其最大进程数的 soft limit 与 hard limit 分别为 1024 和 8192

      @test        soft    noproc          1024
      @test        hard    noproc          8192

      下面是文件中对于资源项的解释,比 ulimit 给出的详细一点:

      core - limits the core file size (KB)
      data - max data size (KB)
      fsize - maximum filesize (KB)
      memlock - max locked-in-memory address space (KB)
      nofile - max number of open file descriptors
      rss - max resident set size (KB)
      stack - max stack size (KB)
      cpu - max CPU time (MIN)
      nproc - max number of processes
      as - address space limit (KB)
      maxlogins - max number of logins for this user
      maxsyslogins - max number of logins on the system
      priority - the priority to run user process with
      locks - max number of file locks the user can hold
      sigpending - max number of pending signals
      msgqueue - max memory used by POSIX message queues (bytes)
      nice - max nice priority allowed to raise to values: [-20, 19]
      rtprio - max realtime priority
    • 查看 /etc/security/limits.d 目录

      目录下是一些子配置文件,其配置项定义格式与 /etc/security/limits.conf
      中相同,使用场景是将不同程序的配置放在目录下作为独立文件,便于管理。

SYSTEMD TASKSMAX

systemd 也提供了一个基于 cgroup 的限制资源使用的机制。
最早宣布在此,代码提交在此,默认值设置在此,stackoverflow 上
有一个与此相关的提问

  • TasksMax
    对于任一 systemd 服务来说,在其服务文件中,设置 TasksMax 值来限制最大进程数。
    官方术语是说设置最大任务数,落实到 cgroup 中就是 pids.max 值,所以我认为说是
    进程数应该是可以的。 systemd 服务的所有属性,参见官方文档解释

    以我的 tmux@.service 文件来说,在 [Service] 下设置 TasksMax 即可

    [Service]
    Type=forking
    User=%I
    Restart=always
    TasksMax=infinity # infinity 是指不限制
    ExecStart=/usr/bin/tmux new-session -s %I -n %I -c /home/%I/ -d
    ExecStop=/usr/bin/tmux kill-server

    systemd service 文件的写法,不在本文范围内。
    查看相应服务的 TasksMax 值,只需使用 systemctl status <service name> 命令即可在”Tasks: ” 一栏中看到服务当前拥有的任务数以及其上限。

  • DefaultTasksMax
    TasksMax 的默认值由 DefaultTasksMax 指定。
    在文件 /etc/systemd/system.conf 或者 /etc/systemd/user.conf 都可以设置,
    分别掌管系统级服务与用户级服务的默认值。

    该值默认为 512。

  • UserTasksMax
    除了以上两个值之外,还有 UserTasksMax 值,该值限定了从一个 login-shell
    中可以运行的任务数的限制。在 /etc/systemd/logind.conf 的 [login] 段下设置。

    默认为 4096。


目录
相关文章
|
Oracle 关系型数据库 数据库
Oracle中merge Into的用法
Oracle中merge Into的用法
|
8月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回查询
本文介绍了Oracle数据库的闪回查询(Flashback Query)功能及其实际应用。闪回查询通过`AS OF`子句,结合时间戳或SCN号,可查询历史数据状态,帮助分析数据差异。文中通过具体示例演示了如何使用闪回查询:创建测试表、记录当前SCN号、更新数据并提交事务,最后通过闪回查询获取历史数据。附带的视频和代码块详细展示了操作步骤与结果。
311 4
|
机器学习/深度学习 监控 自动驾驶
深度学习之2D目标检测
2D目标检测是深度学习中的一个关键任务,旨在识别图像中的目标对象,并在每个目标对象周围生成一个边界框。该任务在自动驾驶、视频监控、机器人视觉等领域具有广泛应用。以下是对深度学习中2D目标检测的详细介绍,包括其基本概念、主要方法、常见模型、应用场景、优势和挑战。
331 4
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
897 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的培训与发展管理
【7月更文挑战第25天】 ERP系统中的培训与发展管理
776 2
|
存储 SQL 分布式计算
揭秘Delta Lake:如何以史诗级时间旅行能力,驾驭数据表的无限版本,让数据科学家直呼过瘾!
【8月更文挑战第27天】Delta Lake是一种开源的大数据存储层,它通过事务日志与快照机制管理表格的多版本,支持数据的时间旅行功能。其核心是维护一个详细的事务日志记录所有表操作,并通过快照保存特定时间点的表状态。用户可通过指定时间戳或版本号查询历史版本数据,系统默认保留30天的历史记录并支持自定义设置。借助Delta Lake,数据团队能高效地处理数据变更和审计需求。
259 0
|
机器学习/深度学习 移动开发 算法
二维矩形件排样算法之最低水平线算法实现
二维矩形件排样算法之最低水平线算法实现
553 0
|
机器学习/深度学习 人工智能 算法
深入了解AI算法及其实现过程
人工智能(AI)已经成为现代技术发展的前沿,广泛应用于多个领域,如图像识别、自然语言处理、智能推荐系统等。本文将深入探讨AI算法的基础知识,并通过一个具体的实现过程来展示如何将AI算法应用于实际问题。
1417 0
|
小程序 JavaScript 前端开发
微信小程序如何控制元素的显示和隐藏
微信小程序如何控制元素的显示和隐藏
|
传感器 编解码 API
大彩串口屏在RTOS编程中应该注意的要点
大彩串口屏在RTOS编程中应该注意的要点
411 0
大彩串口屏在RTOS编程中应该注意的要点