使用ulimit 命令、/etc/security/limits.conf、proc 調整系統參數


 

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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM