linux线程数和文件句柄数配置

进程和文件句柄概念

一个程序可能会打开多个实体,即进程(也包括线程)
一个进程在运行中会打开很多资源,包括文件file、通讯连接socket、正在监听的端口等,我们把这些统称为句柄(handle),Linux中任何东西都是文件,当一个进程打开的句柄数超过系统限制时,就会告警:too many open files。
这两项指标一定成都上决定了服务器的并发处理性能。

进程数和文件句柄数的查看

查看用户能打开的最大进程和文件句柄数,可以执行 ulimit -a 命令,如下:

[root@localhost ~]# 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) 7721
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 200000    --最大文件句柄数
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) 100000   --最用进程数
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

如果我们用当前登录 的用户启动一个 nginx进程,那么这个进程的最大进程数 和 最大文件句柄数和 上述看到的相同。如下我们启动nginx 进程并通过进程id 查看该进程相关限制,和上述看到的相同。

[root@localhost ~]# /usr/local/openresty/nginx/sbin/nginx 
[root@localhost ~]# ps -ef|grep nginx
root       2449      1  0 15:10 ?        00:00:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx
nobody     2450   2449  0 15:10 ?        00:00:00 nginx: worker process
root       2460   2317  0 15:10 pts/0    00:00:00 grep --color=auto nginx
[root@localhost ~]# cat /proc/2449/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        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             100000               100000               processes 
Max open files            200000               200000               files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       7721                 7721                 signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us  

ulimit 修改进程数和文件句柄数限制

可以通过ulimit 命令进行临时修改,该修改仅对当前会话生效,重新登陆或重启服务器之后就会失效,如下修改文件句柄数生效(1000),但推出重新登陆后 就会回复原来值(200000).

[root@localhost ~]# ulimit -HSn 1000  --文件限制
[root@localhost ~]# ulimit -u 3000   --进程限制
[root@localhost ~]# 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) 7721
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1000
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) 3000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

而且如果将 ulimit -HSn 1000 命令 写入 shell 脚本中执行,那么 只在脚本执行过程中生效,对当前登录用户来说并不生效。

持久化修改用户进程数和文件句柄数限制

可以在/etc/security/limits.conf或/etc/security/limits.d/ 下的子配置文件中配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文件,后加载配置覆盖之前的配置。 配置格式如下,两者格式相似,但是有资料说某些环境limits.conf中不支持 * 这种写法,因此涉及*(代表所有用户) 的配置配置在/etc/security/limits.d/ 下的xml 配置文件中。

[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
*          hard    nproc   100000
*          soft    nproc   100000
*          hard    nofile   200000
*          soft    nofile   200000

上述文件中
第一列:用户名 * 表示所有用户
第二列:soft 表示warning值 超过这个限制会告警,但不会报错,hard 表示真实限制超过这个值就会报错
第三列:nproc 表示进程数限制 nofile 表示文件句柄数量
第四列:实际数量 unlimit 表示无限制
实际测试该配置会在用户远程重新登陆后生效。

只适用于通过PAM认证登录用户的资源限制,要确保该配置生效还要保证
在 /etc/pam.d/login 中,存在:session required pam_limits.so
在 /etc/pam.d/sshd 中,存在:session required pam_limits.so
在 /etc/ssh/ssh_config 中, 存在 UsePAM yes (有的说还要包含UseLogin yes 保证其他用户也能修改配置 测试中未增加这个也成功了)

持久化修系统服务进程数和文件句柄数限制

在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。

文件格式如下:增阿吉如下两项配置 分别表示 进程数量和文件句柄数量限制

[root@localhost ~]# cat  /etc/systemd/system.conf 
#  This file is part of systemd.
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
# See systemd-system.conf(5) for details.
[Manager]
DefaultLimitNPROC=100000
DefaultLimitNOFILE=200000

修改后执行 systemctl daemon-reload 命令使配置生效
实际测试 修改完该配置systemctl daemon-reload 命令执行后仍然无效。 必须重启才有效
修改配置后可以启动nginx 按照前文所述方法验证

针对单个服务也可以修改限制,以nginx服务为例,编辑/usr/lib/systemd/system/nginx.service文件,或者/usr/lib/systemd/system/nginx.service.d/my-limit.conf文件,增加如下配置:

[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000

重启生效

sudo systemctl daemon-reload
sudo systemctl restart nginx.service

linux系统总限制更新

上文我们给每个用户设置了其能打开的最大进程数,但这样并不能控制系统总的进程数(kernel.pid_max),假设kernel.pid_max=1000,用户的max user processes,值无论设置多大,最多能打开的进程数依然为1000。修改用户资源限制时必须同时根据需要考虑更新系统总限制,修改方式时修改 文件中添加 如下内容。

[root@localhost ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
kernel.pid_max=200000
fs.file-max=300000

修改后通过以下命令进行查看

cat  /proc/sys/fs/file-max
cat  /proc/sys/kernel/pid_max
cat /proc/sys/fs/file-nr   只读 查看当前系统打开的句柄数量 和最大句柄数量限制

sysctl -p 使配置生效

执行sysctl -p后通过上述命令查看配置生效

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux服务器中,文件句柄是内核用来管理文件的一个重要资源。当我们要处理大量的文件时,我们需要知道当前系统的文件句柄,便于优化系统性能和管理文件。那么,如何查看当前服务器文件句柄呢? 方法一:使用lsof命令 lsof命令在Linux服务器中十分常用,它可以查看系统当前打开的文件列表。通过使用该命令,我们可以查看当前所有打开的文件量,从而得知系统文件句柄。具体操作如下: 1.打开终端,输入以下命令: lsof | wc -l 2.回车后,就能看到当前系统的文件句柄。 方法二:使用cat命令 cat命令可以显示文件内容,也可以显示一些系统文件的信息。我们可以通过cat命令查看/proc/sys/fs/file-max文件中定义的最大文件打开,从而得知当前系统文件句柄。具体操作如下: 1.打开终端,输入以下命令: cat /proc/sys/fs/file-max 2.回车后,就能看到当前系统的最大文件打开。 3.如果要查看当前已打开的文件量,可以输入以下命令: cat /proc/sys/fs/file-nr | awk '{ print $1 }' 4.回车后,就能看到当前已打开的文件量。 综上所述,使用lsof和cat命令都可以查看Linux服务器的文件句柄。从以上两种方法可以看出,文件句柄是一个十分重要的资源。管理好文件句柄,可以让我们更好地了解服务器的运行情况,并优化服务器性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值