ulimit -n/nr_open/limits.conf/file-max直接的關係 + lsof

查看進程打開的文件句柄個數(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 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 

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

echo "end"

echo "re-login to make it effective"

 

發佈了157 篇原創文章 · 獲贊 25 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章