ulimit -n/nr_open/limits.conf/file-max直接的关系 + lsof + vm.max_map_count自动化配置脚本

查看进程打开的文件句柄个数(yum install -y lsof)

lsof -p pid  |wc -l

查看进程打开的socket句柄个数

lsof -p 25973 | grep TCP|wc -l

 

ulimit -a 用来显示当前的各种用户进程限制,注意是当前用户,而且要root

ulimit -n 无法设置超过操作系统支持的最大文件句柄个数

 

 

/proc/sys/fs/nr_open 默认1048576  ulimit -n 设置不能超过nr_open这个值, 可以修改 echo  6553560 >  /proc/sys/fs/nr_open 临时修改,logout之后就不生效了

永久修改进程打开文件最大值限制:
echo fs.nr_open  = 16000000 >> /etc/sysctl.conf
sysctl -p  #不需要重启就可以生效,注意我没有修改fs.file-max,如果要修改的话,网上说: soft limit < hard limit < nr_open < file-max(可以非常大,和内存大小相关)

修改/etc/security/limits.conf可以对所有用户永久生效,修改后不需要重启,logout再重新登录就生效了(重启当然也生效)
只有root用户才有权限修改/etc/security/limits.conf,对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户,对于非root用户,ulimit -n设置一次之后,只能越设置越小,root用户则无限制
(在 init.d 中启用的进程,或者daemons运行的进程并不生效),需要修改  /etc/systemd/system.conf(主要用于systemd service的资源限制)以后必须使用daemon-reexec

root soft nofile 1048576  #有些ubantu系统设置了*还要设置下root,否则root 不生效,centos7.5没有这个问题
root hard nofile 1048576  #硬件的限制,默认最大值好像是4096,如果没有调大这个值,soft nofile没办法加大
* soft nofile 1048570     #* 表示所有用户 不能超过系统的nr_open大小(如果不修改nr_open,默认是1048576,你哪怕设置1048577,logout后无法再进系统)      
* hard nofile 1048570     #有些帖子说这个值一旦设置了就不能改了,至少我在虚拟机上是可以反复修改的

 

#!/bin/bash

if [ $# != 1 ];then 
    echo "Error:need 1 arg num"
    echo "\"sudo ./fd_limit 4096\""
    exit 1
fi

fd_limit=1024

if [ $1 -gt 0 ] 2>/dev/null;then
    fd_limit=$1
else
    echo "Error:invalid arg type"
    echo "\"sudo ./fd_limit 4096\""
    exit 1
fi

if [[ $EUID -ne 0 ]]; then
        echo "Error:This script must be run as root!" 1>&2
        echo "\"sudo ./fd_limit 4096\""
        exit 1
fi

echo "set fd limit to ${fd_limit}"

nr_open=$(cat /proc/sys/fs/nr_open)

if [ ${nr_open} -gt 0 ] 2>/dev/null;then
    nr_open=$nr_open
else
    echo "/proc/sys/fs/nr_open is not number"
    exit 1
fi

if [ ${fd_limit} -gt ${nr_open} ];then
    echo "limit > nr_open, update"
    echo "updating /etc/sysctl.conf"
    sudo sh -c "echo fs.nr_open = ${fd_limit} >> /etc/sysctl.conf"
    echo "updated /etc/sysctl.conf"
    echo "reading values"
    sudo echo "vm.max_map_count=262144" >> /etc/sysctl.conf
    sudo sysctl -p
    echo "read values end"
else
    echo "limit <= nr_open, skip"
fi

echo "updating /etc/security/limits.conf"

sudo echo "
* hard nofile ${fd_limit}
* soft nofile ${fd_limit}
root hard nofile ${fd_limit}
root soft nofile ${fd_limit}
" >> /etc/security/limits.conf 

sudo echo "
*     soft    nproc           4096
*     hard    nproc           4096
" >> /etc/security/limits.conf 



echo "updated /etc/security/limits.conf"

echo "end"

echo "re-login to make it effective"

运行:

./set.sh 16000000 (参数是你要设置的最大nr_open)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值