Linux是有文件句柄限制的,而且Linux默認不是很高,一般都是1024,生產服務器用其實很容易就達到這個數量
系統總限制是在這里,/proc/sys/fs/file-max.可以通過cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.
/proc/sys/fs/file-nr,可以看到整個系統目前使用的文件句柄數量linux 中數據的含義 /proc/sys/fs/file-nr
[root@localhost logs]# cat /proc/sys/fs/file-nr
2112 0 2100000已分配文件句柄的數目 已使用文件句柄的數目 文件句柄的最大數目
在Linux下面部署應用的時候,有時候會遇上Socket/File: Can’t open so many files的問題
在使用linux做為關鍵應用的過程中,特別是大壓力負載的時候,經常會遇到一些諸如“too many open files”,“系統默認最大線程數是多少?如何調整?”等問題。此時,我們就必須使用ulimit或proc去調整系統的某些參數。
查找文件句柄問題的時候,還有一個很實用的程序lsof.可以很方便看到某個進程開了那些句柄.也可以看到某個文件/目錄被什么進程占用了.
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
修改完重新登錄就可以見到, 如Centos,使用 ulimit -a 查看確認
- ulimit 命令
1.只對當前tty(終端有效),若要每次都生效的話,可以把ulimit參數放到對應用戶的.bash_profile里面;
2.ulimit命令本身就有分軟硬設置,加-H就是硬,加-S就是軟;
3.默認顯示的是軟限制,如果運行ulimit命令修改的時候沒有加上的話,就是兩個參數一起改變.生效;
+ 命令參數
-H 設置硬件資源限制.
-S 設置軟件資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩沖區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
unlimited 是一個特殊值,用於表示不限制
+ 設置 - 針對所有用戶的設置,在/etc/security/limits.conf文件,其是可以對系統用戶、組進行cpu、文件數等限制的,通過它可以針對某個用戶或全部進行限制。但不能超越系統的限制; (*表示所有用戶、soft表示可以超出,但只是警告;hard表示絕對不能超出,unlimited用於表示不限制) - 如果想對所有用戶設置,也可以放在/etc/profile文件里面,下面是該文件里面的默認參數: ulimit -S -c 0 > /dev/null 2>&1
-
/proc 目錄
-
/proc 目錄包括很多系統當前狀態的參數
/proc/meminfo
/proc/cpuinfo
/proc/sys/fs/file-max #系統總限制
/proc/sys/fs/file-nr #整個系統目前使用的文件句柄數量 -
proc目錄中的值可以進行動態的設置,若希望永久生效,可以修改/etc/sysctl.conf文件,並使用下面的命令確認: #sysctl -p
-
-
/etc/security/limit.conf
注意:要使 limits.conf 文件配置生效,必須要確保 pam_limits.so 文件被加入到啟動文件中。查看 /etc/pam.d/login 文件中有:session required /lib/security/pam_limits.so
+ 描述
limits.conf文件實際是Linux PAM(插入式認證模塊,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,突破系統的默認限制,對系統訪問資源有一定保護作用。 limits.conf 和sysctl.conf區別在於limits.conf是針對用戶,而sysctl.conf是針對整個系統參數配置。
+ 工作原理
limits.conf是 pam_limits.so的 配置文件,然后/etc/pam.d/下的應用程序調用pam_***.so模塊。譬如說,當用戶 訪問服務器,服務程序將請求發送到PAM模塊,PAM模塊根據服務名稱在/etc/pam.d目 錄下選擇一個對應的服務文件,然后根據服務文件的內容選擇具體的PAM模塊進行處理
example:限制admin用戶登錄到sshd的服務不能超 過2個
在/etc/pam.d/sshd中添加:session required pam_limits.so
echo "session required pam_limits.so" >> /etc/pam.d/sshd
在/etc/security/limits.conf中添加:admin - maxlogins 2
注意:
查看應用程序能否被PAM支持,用ldd
同理limits.conf要使用就必須保證/etc/pam.d/login 中有下面:session required pam_limits.so
+ 文件格式 username|@groupname type resource limit
1. username|@groupname
設置需要被限制的用戶名,組名前面加@和用戶名區別。也可用通配符*來做所有用戶的限制
2. type soft、hard、-
soft 指的是當前系統生效的設置值。hard 表明系統中所能設定的最大值。soft 的限制不能比har 限制高。用 - 就表明同時設置了soft 和hard的值
3. resource: 表示要限制的資源
* core - 限制內核文件的大小
core file : 當一個程序崩潰時,在進程當前工作目錄的core文件中復制了該進程的存儲圖像。core文件僅僅是一個內存映象(同時加上調試信息),主要是用來調試的。core文件是個二進制文件,需要用相應的工具來分析程序崩潰時的內存映像,系統默認core文件的大小為0,所以沒有被創建。可以用ulimit命令查看和修改core文件的大小。
#ulimit -c 0 #ulimit -c 1000 #ulimit -c unlimited
注意:如果想讓修改永久生效,則需要修改配置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf
* date - 最大數據大小
* fsize - 最大文件大小
* memlock - 最大鎖定內存地址空間
* nofile - 打開文件的最大數目
對於需要做許多套接字連接並使它們處於打開狀態的應用程序而言,最好通過使用ulimit -n,或者通過設置nofile參數,為用戶把文件描述符的數量設置得比默認值高一些
* rss - 最大持久設置大小
* stack - 最大棧大小
* cpu - 以分鍾為單位的最多 CPU 時間
* noproc - 進程的最大數目
* as - 地址空間限制
* maxlogins - 此用戶允許登錄的最大數目
4. 設置
* 暫時生效,ulimit 命令 * 永久生效,通過將一個相應的 ulimit 語句添加到由登錄 shell 讀取的文件之一(例如 ~/.profile),即特定於 shell 的用戶資源文件;或者通過編輯 /etc/security/limits.conf