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。


目录
相关文章
|
监控 调度
jconsole线程面板中的阻塞总数和等待总数(转)
阻塞总数 Blocked count is the total number of times that the thread blocked to enter or reenter a monitor.
1781 0
|
7月前
如何同时或者按顺序间隔启动多个程序
该内容是一个指南,介绍如何使用一个工具来设置定时启动程序。工具可以从百度网盘或蓝奏云下载,提取码分别为&qwu2&quot;和&quot;2r1z&quot;。步骤包括:1) 打开工具并切换到定时器模块;2) 新建定时器并设置单次数量,例如设为1表示执行一次任务;3) 添加子事件,选择程序类型;4) 指定程序启动路径,如QQ;5) 复制QQ的启动路径并确认。通过增加子事件和调整单次数量,可实现同时启动多个程序。
|
7月前
|
Java
线程数设置
线程数设置
74 0
|
监控 Shell Apache
监控httpd的进程数,根据监控情况做相应处理
监控httpd的进程数,根据监控情况做相应处理
132 1
|
并行计算 算法 数据挖掘
GATK4丨如何设置线程数和内存大小?
GATK4丨如何设置线程数和内存大小?
|
自然语言处理 算法 Linux
Linux中的pstree 查看进程树、netstat 显示网络状态和端口占用信息、kill 终止进程、进程管理类、ps 查看当前系统进程状态、内存置换算法LRU、查看与sshd相关进程
这时候没有了sshd守护进程了,那么远程登录就都登录不上了,只有再把sshd守护进程开启才可以再次远程登录,如果没有开启sshd守护进程,把所有的root进程的远程登录关掉,那么只能用主机操作了。比如将sshd全部杀死,这样的话远程登录的全部停了,而且也不能再次远程登录了,只能在主机上打开sshd守护进程才可以,这个就不演示了。killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这 在系统因负载过大而变得很慢时很有用)linux常用命令下。linux常用命令中。linux常用命令上。.netstat –nlp | grep 端口号 (功能描述:查看网络端口号占用情况)ne
532 1
Linux中的pstree 查看进程树、netstat 显示网络状态和端口占用信息、kill 终止进程、进程管理类、ps 查看当前系统进程状态、内存置换算法LRU、查看与sshd相关进程
12.8 Linux调整进程的优先级(nice和renice命令)
当 Linux 内核尝试决定哪些运行中的进程可以访问 CPU 时,其中一个需要考虑的因素就是进程优先级的值(也称为 nice 值)。每个进程都有一个介于 -20 到 19 之间的 nice 值。默认情况下,进程的 nice 值为 0。
579 0
12.8 Linux调整进程的优先级(nice和renice命令)
|
缓存 Shell Android开发
【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 )(二)
【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 )(二)
611 0
【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 )(二)

相关实验场景

更多