首页 > 编程知识 正文

进程,线程,句柄,句柄 进程

时间:2023-05-03 22:28:37 阅读:216035 作者:4148

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 processvim /etc/security/limits.confroot soft nproc 10000root hard nproc 100002.2 修改普通用户max user process方法1:vim /etc/security/limits.conftomcat soft nproc 10000tomcat hard nproc 10000方法2:vim /etc/security/limits.d/20-nproc.conf* soft nproc 4096root soft nproc unlimitedtomcat soft nproc 10000tomcat 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 EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.serviceWants=network-online.target [Service]Type=notifyExecStart=/usr/xwdxl/dockerdExecReload=/xwdxl/kill -s HUP $MAINPIDLimitNPROC=16665 #修改容器的进程数限制,只能在docker服务的docker.service文件里修改TimeoutStartSec=16665 #修改容器的句柄数限制,只能在docker服务的docker.service文件里修改TimeoutStartSec=0Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=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.confkernel.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 -lps aux | wc -l2.查看系统当前所有线程ps -eLf | wc -l3.查看一个进程下有多少个线程pstack pidtop -H -p pidps hH p pid | wc -lcat /proc/pid/status | grep Threads4.查看系统当前允许最大线程数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 65535root hard nofile 65535修改tomcat用户句柄数限制方法1:vim /etc/security/limits.conftomcat soft nofile 65535tomcat hard nofile 65535方法2:vim /etc/security/limits.d/20-nproc.conftomcat hard nofile 99999tomcat 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 EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.serviceWants=network-online.target [Service]Type=notifyExecStart=/usr/xwdxl/dockerdExecReload=/xwdxl/kill -s HUP $MAINPIDLimitNOFILE=infinityLimitNPROC=16665 #修改容器的进程数限制,只能在docker服务的docker.service文件里修改TimeoutStartSec=16665 #修改容器的句柄数限制,只能在docker服务的docker.service文件里修改Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=60s [Install]WantedBy=multi-user.target

4.3 系统句柄数限制

查看系统允许最大句柄数cat /proc/sys/fs/file-max查看系统当前使用的总句柄数cat /proc/sys/fs/file-nr1408 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 -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 7284max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 99998pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 10000virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited

5.1 命令参数

命令参数-H 设置硬资源限制,一旦设置不能增加。 -S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 -a 显示当前所有的 limit 信息。 -c 最大的 core 文件的大小, 以 blocks 为单位。 -d 进程最大的数据段的大小,以 Kbytes 为单位。 -f 进程可以创建文件的最大值,以 blocks 为单位。-l 最xsdqj加锁内存大小,以 Kbytes 为单位。 -m 最大内存大小,以 Kbytes 为单位。-n Linux操作系统对一个进程可以打开最大文件描述符的数量。 -p 管道缓冲区的大小,以 Kbytes 为单位。 -s 线程栈大小,以 Kbytes 为单位。 -t 最大的 CPU 占用时间,以秒为单位。 -u 用户最xsdqj用的进程数。 -v 进程最xsdqj用的虚拟内存,以 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  )查看当前进程的最xsdqj以打开的文件数:cat /proc/PID/limits  (如果通过ulimit -n 设置或者修改/etc/security/limits.conf,看看进程是否生效)  查看系统总限制打开文件的最大数量:cat /proc/sys/fs/file-max

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。