linux ulimit 修改文件最大数(ubuntu 20.04、CentOS)\su: /bin/bash: Too many open files in system

一、linux ulimit 修改文件最大数

1. 背景

对于一般的应用来说(Apache、系统进程)1024一般完全足够使用。但是如何象mysql、java等单进程处理大量请求的应用来说就有 点捉襟见肘了。

如果系统并发特别大,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。

2. 查看某个进程使用文件描述符

lsof -p 进程id |wc -l  //文件数量
ls /proc/进程id/fd |wc -l  //文件描述符数量

3. ulimit修改打开文件上限的方式(ubuntu 20.04亲测通过)

查询当前终端的文件句柄数: ulimit -n 回车,一般的系统默认的1024.

修改思路:
你登录的用户是什么身份,是不是root用户,由于服务器的root用户权限很大,一般是不能用来登录的,都是通过自己本人的登录权限进行登录,并通过sudo方式切换到root用户下进行工作。 用户登录的时候执行sh脚本的顺序:
/etc/profile.d/file
/etc/profile
/etc/bashrc
/mingjie/.bashrc
/mingjie/.bash_profile

由于ulimit -n的脚本命令加载在第二部分,用户登录时由于权限原因在第二步还不能完成ulimit的修改,所以ulimit的值还是系统默认的1024。

修改linux的软硬件限制文件/etc/security/limits.conf.

在文件尾部添加如下代码:

sudo tee -a /etc/security/limits.conf << EOF

# 
* soft nofile 204800
* hard nofile 204800
* soft nproc 204800
* hard nproc 204800
EOF
ulimit -n 204800

命令如下:

cat /proc/sys/fs/file-max
#系统
echo 'fs.file-max = 65535' | sudo tee -a /etc/sysctl.conf
#用户
echo 'fs.file-max = 65535' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Systemd
sudo sed -i '/DefaultLimitNOFILE/c DefaultLimitNOFILE=65535' /etc/systemd/*.conf
sudo systemctl daemon-reexec

验证需要重新登录或者打开新的终端:

# 查看系统限制
cat /proc/sys/fs/file-max

# 查看用户硬限制
ulimit -Hn
 
# 查看用户软限制
ulimit -Sn
 
# 查看某进程的限制
cat /proc/PID/limits # 将 PID 替换为具体的进程 ID
 
# 查看其他用户限制
su - www -c 'ulimit -aHS' -s '/bin/bash'

4. CentOS ulimit 修改文件最大数

操作系统版本为 CentOS Linux release 7.2.
[root@centos7 ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

ulimit -n查看大小,默认是1024
临时设置下只在此终端下有效

ulimit -n 204800

永久生效的方法:

修改 vi /etc/security/limits.conf文件

* soft nofile 204800
* hard nofile 204800
* soft nproc 204800
* hard nproc 204800
*            # 代表针对所有用户
noproc     #是代表最大进程数
nofile     #是代表最大文件打开数

然后重启服务器或重新登录即可生效。
进行测试

ulimit -n

5. file-max系统的总限制

使用ulimit -a 或者 ulimit -n。
是linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量)

这里只是对用户级别的限制,其实还有个是对系统的总限制

# cat /proc/sys/fs/file-max

man proc,可得到file-max的描述:

即file-max是设置系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。

也就是说,这项参数是系统级别的。

假如,我们设置进程打开的文件句柄数是1024 ,但是系统总线制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以。

echo  6553560 > /proc/sys/fs/file-max

上面是临时生效方法,重启机器后会失效;

永久生效方法:
修改 /etc/sysctl.conf, 加入

fs.file-max = 6553560 

查看效果

sysctl -p
cat /proc/sys/fs/file-max

二、工作常见问题整理

su: /bin/bash: Too many open files in system

问题背景:
su - xxx 发现报错:
su: /bin/bash: Too many open files in system

解决方法:

[root@tmp ~]# cat /proc/sys/fs/file-max
65536

[root@tmp ~]# vi /etc/sysctl.conf
修改fs.file-max = 6553600

[root@tmp~]# sysctl -p
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.sem = 1055 32000 100 128
kernel.shmmax = 2147483648
kernel.shmall = 2097152
net.core.optmem_max = 65535
net.core.rmem_default = 4194304
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 262144
fs.file-max = 6553600
[root@tmp~]# cat /proc/sys/fs/file-max
6553600

亲测可用!

修改/etc/security/limits.conf文件,重启后不生效怎么办?

https://support.huaweicloud.com/intl/zh-cn/trouble-ecs/ecs_trouble_0354.html

问题现象
修改/etc/security/limits.conf文件,重启后配置项不生效。

可能原因
Linux操作系统云服务器中限制资源使用的配置文件是/etc/security/limits.conf和/etc/security/limits.d/目录,/etc/security/limits.d/目录中的配置优先级高于/etc/security/limits.conf的配置。

如果修改/etc/security/limits.conf文件,重启后不生效,则可能是由于limits.conf中的修改被/etc/security/limits.d/目录中配置项的值所覆盖。

解决方案
修改/etc/security/limits.d/目录中配置项或修改/etc/security/limits.conf文件。

说明:
如果修改了/etc/security/limits.conf 文件没有生效,请检查/etc/security/limits.d/目录中配置项的值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西京刀客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值