热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux之进程数和句柄数:linux句柄数含义

本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投

本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的【Linux】相关技术问题。

linux句柄数含义

Linux之进程数和句柄数

1.背景

由于业务的需要,我们在阿里云上面申请了30多台主机,安装的是centos7.2.1511系统。一般情况下,我们需要对文件句柄数、进程数等做一些标准化的配置。

2.进程和句柄的概念

一个程序可能打开多个进程,一个进程在运行中会打开很多资源,如文件file、通讯连接socket、正在监听的端口等,我们都统称为句柄(handle)。linux任何东西都是文件,所以当一个进程打开的句柄数超过系统限制时,会提示too many open files。

3.进程数限制

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

3.1 用户资源限制

2.1 修改root用户max user process
vim /etc/security/limits.conf
root     soft   nproc     10000
root     hard   nproc     10000

2.2 修改普通用户max user process
方法1:
vim /etc/security/limits.conf
tomcat     soft   nproc     10000
tomcat     hard   nproc     10000
方法2:
vim /etc/security/limits.d/20-nproc.conf
*          soft    nproc     4096
root       soft    nproc     unlimited
tomcat     soft    nproc     10000
tomcat     hard    nproc     10000

说明:
1.soft为warning值,hard为最大值,*代表匹配所有用户。
2.在limits.conf里配置针对所有用户(*)的max user process的不生效,只能在20-nproc.conf里配置。
3.如果单独对某一用户,如tomcat这种,可以在limits.conf配置文件里单独配置,也可以在20-nproc.conf里配置。
4.如果20-nproc.conf和limits.conf同时配置了如tomcat用户的max user process,系统以20-nproc.conf里的配置值为标准。

3.2 service资源限制

对于那些不是通过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。

示例1:docker容器的进程数限制

vim /etc/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNPROC=16665         #修改容器的进程数限制,只能在docker服务的docker.service文件里修改
TimeoutStartSec=16665    #修改容器的句柄数限制,只能在docker服务的docker.service文件里修改
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

注明:查看某个服务的资源限制 (cat /proc/pid/limits)。

3.3 系统资源限制

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

查看全局的pid_max方法:
方法1:
cat /proc/sys/kernel/pid_max
方法2:
cat /etc/sysctl.conf
kernel.pid_max = 32768

修改全局pid_max方法
临时修改:echo 65535 > /proc/sys/kernel/pid_max
永久修改:echo "kernel.pid_max = 65535" >> /etc/sysctl.conf && sysctl -p

3.4 查看进程数

1.查看系统下所有进程
ps -eFH | wc -l
ps aux | wc -l

2.查看系统当前所有线程
ps -eLf | wc -l

3.查看一个进程下有多少个线程
pstack pid
top -H -p pid
ps hH p pid | wc -l
cat /proc/pid/status | grep Threads

4.查看系统当前允许最大线程数
cat /proc/sys/kernel/threads-max 

4.句柄数限制

4.1 用户句柄数限制

登录用户的限制,可通过/etc/security/limits.conf或 /etc/security/limits.d/下的子配置文件来配置。

修改root用户的句柄数限制
vim /etc/security/limits.conf
#该文件只影响通过PAM登录的用户,不影响系统服务的资源限制
root soft nofile 65535
root hard nofile 65535

修改tomcat用户句柄数限制
方法1:
vim /etc/security/limits.conf
tomcat soft nofile 65535
tomcat hard nofile 65535
方法2:
vim /etc/security/limits.d/20-nproc.conf
tomcat hard nofile 99999
tomcat soft nofile 99999

注明:如果需要单独对某一用户的文件句柄数进行限制,如tomcat,则如上述方法,如果对所有用户的文件句柄数进行限制,则为 * hard nofile 99999和* soft nofile 99999。

4.2 service句柄数限制

示例1:docker容器的进程数限制

vim /etc/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=16665         #修改容器的进程数限制,只能在docker服务的docker.service文件里修改
TimeoutStartSec=16665    #修改容器的句柄数限制,只能在docker服务的docker.service文件里修改
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

4.3 系统句柄数限制

查看系统允许最大句柄数
cat /proc/sys/fs/file-max

查看系统当前使用的总句柄数
cat /proc/sys/fs/file-nr
1408    0       95852    #1408为使用数,95852为总数

临时修改
echo  6553560 > /proc/sys/fs/file-max

永久修改
echo "fs.file-max=655350" >> /etc/sysctl.conf && sysctl -p

5.ulimit命令

[root@docker ~]# 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) 7284
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 99998
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) 10000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

5.1 命令参数

命令参数
-H   设置硬资源限制,一旦设置不能增加。 
-S   设置软资源限制,设置后可以增加,但是不能超过硬资源设置。   
-a   显示当前所有的 limit 信息。  
-c   最大的 core 文件的大小, 以 blocks 为单位。 
-d   进程最大的数据段的大小,以 Kbytes 为单位。 
-f   进程可以创建文件的最大值,以 blocks 为单位。
-l   最大可加锁内存大小,以 Kbytes 为单位。   
-m   最大内存大小,以 Kbytes 为单位。
-n   Linux操作系统对一个进程可以打开最大文件描述符的数量。 
-p   管道缓冲区的大小,以 Kbytes 为单位。 
-s   线程栈大小,以 Kbytes 为单位。   
-t   最大的 CPU 占用时间,以秒为单位。    
-u   用户最大可用的进程数。   
-v   进程最大可用的虚拟内存,以 Kbytes 为单位。

resource:
core - 限制内核文件的大小
date - 最大数据大小
fsize - 最大文件大小
memlock - 最大锁定内存地址空间
nofile - 打开文件的最大数目
rss - 最大持久设置大小
stack - 最大栈大小
cpu - 以分钟为单位的最多 CPU 时间
noproc - 进程的最大数目
as - 地址空间限制
maxlogins - 此用户允许登录的最大数目

5.2 查看句柄数

查看系统用户所有限制值:ulimit -a
设置用户open files(用户可以打开文件的最大数目):ulimit -n 4096。执行该命令非root用户只能设置到4096。想要设置到8192需要sudo权限或者root用户。
查看当前系统打开的文件数量: lsof | wc -l ?
查看当前进程的打开文件数量:lsof -p pid | wc -l? ? ? (lsof -p 1234 | wc -l? )
查看当前进程的最大可以打开的文件数:cat /proc/PID/limits? (如果通过ulimit -n 设置或者修改/etc/security/limits.conf,看看进程是否生效)??
查看系统总限制打开文件的最大数量:cat /proc/sys/fs/file-max

注明:lsof只能以root权限执行。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

本文《Linux之进程数和句柄数》版权归东城绝神所有,引用Linux之进程数和句柄数需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文介绍如何通过更改软件源来提前体验Ubuntu 8.10,包括详细的配置步骤和相关注意事项。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • andr ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • CentOS系统安装与配置常见问题及解决方案
    本文详细介绍了在CentOS系统安装过程中遇到的常见问题及其解决方案,包括Vi编辑器的操作、图形界面的安装、网络连接故障排除等。通过本文,读者可以更好地理解和解决这些常见问题。 ... [详细]
author-avatar
丁军东建宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有