linux进程数和句柄数使用及说明

 更新时间:2026年03月30日 16:40:47   作者:Zandon Cao  
本文主要介绍了Linux系统中进程和句柄的概念,并详细解释了用户资源限制、service资源限制、系统资源限制的配置方法和查看方式,重点讲解了进程数限制和句柄数限制的配置步骤和注意事项

注:linux版本CentOS7

一、进程和句柄概念

一个程序可能会打开多个实体,即进程;

一个进程在运行中会打开很多资源,包括文件file、通讯连接socket、正在监听的端口等,我们把这些统称为句柄(handle),Linux中任何东西都是文件,所以当一个进程打开的句柄数超过系统限制时,我们会收到告警:too many open files。

二、Linux资源限制

1. 用户资源限制

在Bash中有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制。主要包括打开文件描述符数量、用户的最大进程数量、coredump文件的大小等。

资源限制的配置可以在/etc/security/limits.conf或/etc/security/limits.d/ 下的子配置文件中配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文件,后加载配置覆盖之前的配置。 配置格式如下:

soft为warning值,hard为最大值,*代表匹配所有用户

*     soft   nofile    65535
*     hard   nofile    65535
*     soft   nproc     10000
*     hard   nproc     10000
*     soft   core      20000
*     hard   core      20000

查看登录当前shell的用户资源限制

[root@localdomain ~]# 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) 7424
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) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024  当前用户最多可打开的进程(包括线程)数
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

2.service 资源限制

上面我们一直提到shell,那么对于那些不是通过PAM认证登录的用户,如mysql、nginx等,上述配置是不生效的;

因为在CentOS 7/RHEL 7的系统中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf 文件的配置作用域缩小了一些,limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。

需要通过文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf配置, 同样,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/*.conf 和 /etc/systemd/user.conf.d/*.conf。

其中,system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。system.conf.d/*.conf中配置会覆盖system.conf。

配置格式如下:

=左侧为资源类型,右侧为大小

vi /etc/systemd/system.conf 
......................
[Manager]
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
#DumpCore=yes
#CrashShell=no
#ShowStatus=yes
#CrashChVT=1
#CtrlAltDelBurstAction=reboot-force
#CPUAffinity=1 2
......................

查看某个service的资源限制

cat /proc/YOUR-PID/limits

如查看nginx service的配置效果:

$ cat /proc/$(cat /run/nginx.pid)/limits
  Limit                     Soft Limit           Hard Limit           Units
  Max cpu time              unlimited            unlimited            seconds
  Max file size             unlimited            unlimited            bytes
  Max data size             unlimited            unlimited            bytes
  Max stack size            8388608              unlimited            bytes
  Max core file size        unlimited            unlimited            bytes
  Max resident set          unlimited            unlimited            bytes
  Max processes             100000               100000               processes
 Max open files            100000               100000               files
 Max locked memory         65536                65536                bytes
 Max address space         unlimited            unlimited            bytes
 Max file locks            unlimited            unlimited            locks
 Max pending signals       1030606              1030606              signals
 Max msgqueue size         819200               819200               bytes
 Max nice priority         0                    0
 Max realtime priority     0                    0
 Max realtime timeout      unlimited            unlimited            us

3. 系统资源限制

前面对user和service进行了资源,但系统总的资源数量是多少呢?这就涉及到了内核参数,内核参数众多,我们只需要知道如何修改常用的,如进程数、句柄数即可

三、 进程数限制

1. 用户进程数限制

/etc/security/limits.d/下默认存在一个子配置文件20-nproc.conf,用于设置每个用户最大进程数

查看/etc/security/limits.d/20-nproc.conf会发现,默认root用户无限制,普通用户进程数最大为4096

实际上roott和普通用户默认是 # cat /proc/sys/kernel/threads-max的值/2,即系统线程数的一半

[root@localhost ~]# cat /etc/security/limits.d/20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
*          soft    nproc     4096
root       soft    nproc     unlimited

设置每个用户最大进程数

vim  /etc/security/limits.d/20-nproc.conf 
$ cat /etc/security/limits.d/90-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
#针对所有用户,设置其可打开最大进程数为4096(hard),warning值为2048(soft);ulimit看大的是soft大小
* soft nproc 2048
* hard nproc 4096
限制用户root可打开最大进程数为65535
root soft nproc 65535
root hard nproc 65535

注意:修改配置文件,不会改变当前已经登录的用户的进程数限制

2. service进程数限制

[root@zandon ~]# vi /etc/systemd/system.conf 
#修改以下参数
DefaultLimitNPROC=65535
#使配置生效
systemctl daemon-reload
#如果某个服务句柄数已达到原限制,也需要重启;
systemctl restart nginx.service

注意:修改配置文件,不会改变当前已经启动的service的进程数限制 ,需重启

3. 系统总进程数

上面我们给每个用户设置了其能打开的最大进程数,但这样并不能控制系统总的进程数(kernel.pid_max),假设kernel.pid_max=1000,用户的max user processes,值无论设置多大,最多能打开的进程数依然为1000

查看全局的pid_max方法:

  • 方法一:
cat /proc/sys/kernel/pid_max
  • 方法二:
# sysctl kernel.pid_max
kernel.pid_max = 32768

临时修改这个值方法:

echo 65535 > /proc/sys/kernel/pid_max

所以以上都操作完成后,才算是正确修改了max user processes 的值

上面只是临时生效,重启机器后会失效,永久生效方法:

在/etc/sysctl.conf中添加kernel.pid_max = 65535

# vim /etc/sysctl.conf
kernel.pid_max = 65535

或者:

echo "kernel.pid_max = 65535" >> /etc/sysctl.conf

然后重启机器。

四、 句柄数限制

1. 用户句柄数限制

登录用户的限制,与上面讲的一样,可通过/etc/security/limits.conf或 /etc/security/limits.d/下的子配置文件来配置,如下:

vi /etc/security/limits.conf
# /etc/security/limits.conf
#该文件只影响通过PAM登录的用户,不影响系统服务的资源限制
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
........................................................
#<domain>      <type>  <item>         <value>
#
#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4
#限制单进程可打开最大句柄数为65535(默认1024)
#soft为warning大小,hard为最大数量
* soft nofile 65535 
* hard nofile 65535
# End of file

注意:修改配置文件,不会改变当前已经登录的用户的句柄数限制

2. service句柄数限制

#修改service句柄数限制
sed -i "s/#DefaultLimitNOFILE=/DefaultLimitNOFILE=655350/g"  /etc/systemd/system.conf
#使配置生效
sudo systemctl daemon-reload
#如果某个服务句柄数已达到原限制,也需要重启;
sudo systemctl restart nginx.service

注意:修改配置文件,不会改变当前已经启动的service的句柄数限制

3. 系统总句柄数

上面设置了每个用户可打开的进程数,每个进程可打开的句柄数;还有一个文件设置了系统所有进程可打开的总句柄数,也就是说,这项参数是系统级别的。

  • 修改系统总句柄数最大值,方法如下(配置后即生效):
echo  6553560 > /proc/sys/fs/file-max
  • 查看系统当前使用的总句柄数:
[root@bogon security]# cat /proc/sys/fs/file-nr
1408    0       95852    //1408为使用数,95852为总数

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Ubuntu下安装rsh实现无密码访问详解

    Ubuntu下安装rsh实现无密码访问详解

    这篇文章主要为大家详细介绍了Ubuntu下安装rsh实现无密码访问的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 解决Linux删除文件空间仍然不释放问题

    解决Linux删除文件空间仍然不释放问题

    本文记录了Linux服务器在移动文件过程中出现磁盘空间不足的问题,找到占用磁盘最多的目录或非必要的日志文件删除后,空间仍然不释放,经查证,是因为文件仍然被线程占用,故提出了通过echo清空文件内容或者使用sudolsof+L1找到并清理占用文件的线程的解决方案
    2024-10-10
  • 最新Linux下安装tomcat8图解过程

    最新Linux下安装tomcat8图解过程

    这篇文章主要介绍了最新的Linux下安装tomcat8图解过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 关于Linux下conda安装caffe与pb转caffe问题

    关于Linux下conda安装caffe与pb转caffe问题

    这篇文章主要介绍了关于Linux下conda安装caffe与pb转caffe问题,文中以图文说明了conda安装caffe的方法,需要的朋友可以参考下
    2023-03-03
  • 安装ubuntu18.04报:failed to load ldlinux.c32的问题及解决步骤

    安装ubuntu18.04报:failed to load ldlinux.c32的问题及解决步骤

    这篇文章主要介绍了安装ubuntu18.04报:failed to load ldlinux.c32的问题,本文通过图文并茂的形式给大家分享解决方法,需要的朋友可以参考下
    2020-08-08
  • PHP中的.htaccess伪静态文件

    PHP中的.htaccess伪静态文件

    htaccess是apache的伪静态文件了不过普通人不熟悉linux不熟悉apache,可能都用惯了iis,可是又不懂伪静态规则,现在项目就只提供了这么一个.htaccess文件,真叫人苦恼。方案来了彻底解决你的苦恼让伪静态妥妥的windows7,windows8,windows8.1,windows2008-2012都行。
    2016-05-05
  • linux中设置固定ip的方法(亲测有效)

    linux中设置固定ip的方法(亲测有效)

    这篇文章主要介绍了linux设置固定ip的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 在Linux x64系统开发一个完整的Qt GUI文字识别应用

    在Linux x64系统开发一个完整的Qt GUI文字识别应用

    本文介绍了如何在Linux x64系统上使用C++开发一个完整的QtGUI文字识别应用,该应用集成了百度飞桨的PP-OCRv5 server模型,具备图片上传、OCR识别、结果展示、剪贴板操作等功能,需要的朋友可以参考下
    2026-03-03
  • VirtualBox 错误:This kernel requires the following features not present on the CPU

    VirtualBox 错误:This kernel requires the following features no

    这篇文章主要介绍了VirtualBox 错误:This kernel requires the following features not present on the CPU的相关资料,希望通过本文能帮助到大家,解决这样的问题,需要的朋友可以参考下
    2017-10-10
  • CentOS 6 启动流程详细介绍

    CentOS 6 启动流程详细介绍

    这篇文章主要介绍了CentOS 6 启动流程详细介绍的相关资料,这里对centos 启动进行了分析,希望能帮助到大家理解centos 启动流程,需要的朋友可以参考下
    2017-07-07

最新评论