1. 程式人生 > >linux中ulimit作用

linux中ulimit作用

https://www.cnblogs.com/kongzhongqijing/p/5784293.html

一、作用

Linux對於每個使用者,系統限制其最大程序數。為提高效能,可以根據裝置資源情況,設定各linux 使用者的最大程序數。

複製程式碼
ulimit主要是用來限制程序對資源的使用情況的,它支援各種型別的限制,常用的有:

核心檔案的大小限制

程序資料塊的大小限制

Shell程序建立檔案大小限制

可加鎖記憶體大小限制

常駐記憶體集的大小限制

開啟檔案控制代碼數限制

分配堆疊的最大大小限制

CPU佔用時間限制使用者最大可用的程序數限制

Shell程序所能使用的最大虛擬記憶體限制
複製程式碼

有個疑問:伺服器資源是有限制的,limits.conf會限制資源,但是對於ulimit來說限制是粒度是哪些?  

1)使用者 ? 程序? 

2)如果是程序的限制,系統中會有多個程序,那所有的程序同時需要受限於使用者或整個系統的資源限制。

二、用法

ulimit使用的基本格式為:ulimit [options] [limit]

具體的options引數含義如下表所示:

複製程式碼
選項 含義

-a 顯示當前系統所有的limit資源資訊。 

-H 設定硬資源限制,一旦設定不能增加。

-S 設定軟資源限制,設定後可以增加,但是不能超過硬資源設定。

-c 最大的core檔案的大小,以 blocks 為單位。

-f 程序可以建立檔案的最大值,以blocks 為單位.

-d 程序最大的資料段的大小,以Kbytes 為單位。

-m 最大記憶體大小,以Kbytes為單位。 -n 檢視程序可以開啟的最大檔案描述符的數量。 -s 執行緒棧大小,以Kbytes為單位。 -p 管道緩衝區的大小,以Kbytes 為單位。 -u 使用者最大可用的程序數。 -v 程序最大可用的虛擬記憶體,以Kbytes 為單位。 -t 最大CPU佔用時間,以秒為單位。 -l 最大可加鎖記憶體大小,以Kbytes 為單位。
複製程式碼

 其中ulimit -n用於限制程序能夠開啟的檔案描述符的最大數目。因為任何裝置在linux下都是檔案,通訊的介面也有專門的介面檔案負責,所以linux下程序tcp連結的最大併發量也受限於該值。

複製程式碼
[[email protected]
~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited max nice (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 4096 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 max rt priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 4096 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited||<
複製程式碼

其中 "open files (-n) 1024 "是Linux作業系統對一個程序開啟的檔案控制代碼數量的限制(也包含開啟的SOCKET數量,可影響MySQL的併發連線數目)。

這個值可用ulimit 命令來修改,但ulimit命令修改的數值只對當前登入使用者的目前使用環境有效,系統重啟或者使用者退出後就會失效.

有時候為了方便起見,也可以將使用者資源的限制統一由一個檔案來配置,這個檔案就是/etc/security/limits.conf,該檔案不但能對指定使用者的資源進行限制,還能對指定組的資源進行限制。該檔案的使用規則如下:

 <domain> <type> <item> <value> 

其中:

domain表示使用者或者組的名字,還可以使用 * 作為萬用字元,表示任何使用者或使用者組。

Type 表示限制的型別,可以有兩個值,soft 和 hard,分別表示軟、硬資源限制。軟限制是指限制使用者同時開啟的檔案數目,硬限制是指系統根據硬體資源(主要指記憶體)計算出來的最多可開啟的檔案數目。通常軟限制低於硬限制;建議不要將軟限制和硬限制修改過大。

item 表示需要限定的資源名稱,常用的有nofile、cpu、stack等。分別表示最大開啟控制代碼數、佔用的cpu時間、最大的堆疊大小。

value 表示限制各種資源的具體數值。

除了limits.conf檔案之外,還有一個/etc/security/limits.d目錄,可以將資源限制建立一個檔案放到這個目錄中,預設系統會首先去讀取這個目錄下的所有檔案,然後才去讀取limits.conf檔案。所有資源限制設定完成後,退出shell終端,再次登入shell終端後,ulimit設定即可自動生效。

 注意:各種配置的生效方式。 

對於需要做許多 socket 連線並使它們處於開啟狀態的Java 應用程式而言,最好通過使用 ulimit -n xx 修改每個程序可開啟的檔案數,預設值是 1024。

ulimit -n 4096 將每個程序可以開啟的檔案數目加大到4096,預設為1024

其他建議設定成無限制(unlimited)的一些重要設定是:
資料段長度:ulimit -d unlimited
最大記憶體大小:ulimit -m unlimited
堆疊大小:ulimit -s unlimited
CPU 時間:ulimit -t unlimited
虛擬記憶體:ulimit -v unlimited

配置生效方式

    暫時地,適用於通過 ulimit 命令登入 shell 會話期間。
    永久地,通過將一個相應的 ulimit 語句新增到由登入 shell 讀取的檔案中, 即特定於 shell 的使用者資原始檔,如:
1)、解除 Linux 系統的最大程序數和最大檔案開啟數限制:
        vi /etc/security/limits.conf
        # 新增如下的行
        * soft noproc 11000
        * hard noproc 11000
        * soft nofile 4100
        * hard nofile 4100
      說明:* 代表針對所有使用者,noproc 是代表最大程序數,nofile 是代表最大檔案開啟數
2)、讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端檢視 ulimit -a 資源限制:
        a、vi /etc/ssh/sshd_config
            把 UserLogin 的值改為 yes,並把 # 註釋去掉
        b、重啟 sshd 服務:
              /etc/init.d/sshd restart
3)、修改所有 linux 使用者的環境變數檔案:
    vi /etc/profile
    ulimit -u 10000
    ulimit -n 4096
    ulimit -d unlimited
    ulimit -m unlimited
    ulimit -s unlimited
    ulimit -t unlimited
    ulimit -v unlimited
 儲存後執行#source /etc/profile 使其生效

在使用ulimit時,有以下幾種使用方法:

(1)在使用者環境變數中加入

如果使用者使用的是bash,那麼就可以在使用者目錄的環境變數檔案.bashrc或者.bash_profile中加入“ulimit -u 128”來限制使用者最多可以使用128個程序。

(2)在應用程式的啟動指令碼中加入

如果應用程式是tomcat,那麼就可以在tomcat的啟動指令碼startup.sh指令碼中加入“ulimit -n 65535”來限制使用者最多可以使用65535個檔案描述符。

(3)直接在shell命令終端執行ulimit命令

這種方法的資源限制僅僅在執行命令的終端生效,退出或者關閉終端後,設定失效,並且這個設定不影響其它shell終端。

公司伺服器需要調整 ulimit的stack size 引數調整為unlimited 無限,使用ulimit -s unlimited時只能在當時的shell見效,重開一個shell就失效了。。於是得在/etc/profile 的最後面新增ulimit -s unlimited 就可以了,source /etc/profile使修改檔案生效。


如果碰到類似的錯誤提示ulimit: max user processes: cannot modify limit: 不允許的操作 ulimit: open files: cannot modify limit: 不允許的操作
為啥root使用者是可以的?普通使用者又會遇到這樣的問題?
看一下/etc/security/limits.conf大概就會明白。
linux對使用者有預設的ulimit限制,而這個檔案可以配置使用者的硬配置和軟配置,硬配置是個上限。超出上限的修改就會出“不允許的操作”這樣的錯誤。
在limits.conf加上
*        soft    noproc 10240
*        hard    noproc 10240
*        soft    nofile 10240
*        hard    nofile 10240
就是限制了任意使用者的最大程序數和檔案數為10240

如何設定普通使用者的ulimit值1、vim /etc/profile增加 ulimit -n 10240source /etc/profile 重新啟動就不需要執行這個命令了。2、修改/etc/security/limits.conf增加*      hard     nofile     10240   \\限制開啟檔案數102403、測試,新建普通使用者,切換到普通使用者使用ulit -a 檢視是否修改成功。

檢視系統級別資源限制:

1.系統級別:

sysctl -a (-a:顯示當前所有可用的值)

系統總限制:cat /proc/sys/fs/file-max 等一系列值,修改/etc/sysctl.conf 中也可以控制

 /proc/sys/fs/file-nr,可以看到整個系統目前使用的檔案控制代碼數量

修改此硬限制的方法是修改/etc/rc.local指令碼,在指令碼中新增如下行:

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

這是讓Linux在啟動完成後強行將系統級開啟檔案數硬限制設定為800037。

這表明這臺Linux系統最多允許同時開啟(即包含所有使用者開啟檔案數總和)800037個檔案,是Linux系統級硬限制,所有使用者級的開啟檔案數限制都不應超過這個數值。該值是Linux系統在啟動時根據系統硬體資源狀況計算出來的最佳的最大同時開啟檔案數限制,如果沒有特殊需要,不應該修改此限制,除非想為使用者級開啟檔案數限制設定超過此限制的值。

查詢檔案控制代碼問題的時候,lsof可以很方便看到某個程序開了那些控制代碼.也可以看到某個檔案/目錄被什麼程序佔用了.

2.session 設定:

ulimit -a # 檢視所有的 

ulimit -S -n1024 #設定當前會話的開啟檔案數軟連線數為 1024.

ulimit -H -n1024 #設定當前會話的開啟檔案數硬連線數為 1024.

ulimit -n 996 #設定當前會話的開啟檔案數硬&&軟連線數都為 1024.

3.設定使用者(只針對使用者的每個程序):

#<domain> <type> <item> <value>

#

* soft nofile 32768

* hard nofile 65536

ulimit -n vs. file-max ? 
簡單的說, ulimit -n控制程序級別能夠開啟的檔案控制代碼的數量, 而max-file表示系統級別的能夠開啟的檔案控制代碼的數量。

ulimit -n的設定在重啟機器後會丟失,因此需要修改limits.conf的限制,limits.conf中有兩個值soft和hard,soft代表只警告,hard代表真正的限制

Cat /etc/security/limits.conf

*               soft    nofile          150000  
*               hard    nofile          150000  

這裡我們把soft和hard設定成一樣的。

“cat /proc/sys/fs/file-max”,或“sysctl -a | grep fs.file-max”檢視系統能開啟的最大檔案數。檢視和設定例如:

複製程式碼
[[email protected] ~]# sysctl -a |grep fs.file-max  
fs.file-max = 200592  
[[email protected] ~]# echo "fs.file-max = 2005920" >> /etc/sysctl.conf   
[[email protected] ~]# sysctl -p  
[[email protected] ~]# cat /proc/sys/fs/file-max                          
2005920
複製程式碼

file-nr是隻讀檔案,第一個數代表了目前分配的檔案控制代碼數;第二個數代表了系統分配的最大檔案控制代碼數;比如線上系統檢視結果:

複製程式碼
# cat /proc/sys/fs/file-max  
1106537  
# cat /proc/sys/fs/file-nr       
1088  0       1106537  
# lsof | wc -l  
1506
複製程式碼

可以看到file-nr和lsof的值不是很一致,但是數量級一致。為什麼會不一致?原因如下: 

寫到lsof是列出系統所佔用的資源,但是這些資源不一定會佔用開啟檔案號的。如共享記憶體,訊號量,訊息佇列,記憶體對映.等,雖然佔用了這些資源,但不佔用開啟檔案號.

我曾經在前端機上很長時間都無法得到lsof | wc -l 的結果,這個時候可以通過file-nr粗略的估算一下開啟的檔案控制代碼數。

參考資料: