Shell ulimit命令:顯示並設定進程資源限度

2020-07-16 10:04:45
系統的可用資源是有限的,如果不限制使用者和進程對系統資源的使用,則很容易陷入資源耗盡的地步,而使用 ulimit 命令可以控制進程對可用資源的存取(ulimit 是一個 Shell 內建命令)。

預設情況下 Linux 系統的各個資源都做了軟硬限制,其中硬限制的作用是控制軟限制(換言之,軟限制不能高於硬限制)。使用ulimit -a可以檢視當前系統的軟限制,使用命令ulimit -a –H可檢視系統的硬限制。

下面是該命令的執行結果,筆者對每行輸出都做了註解。
[[email protected] ~]# ulimit -a
#core檔案大小,單位是block,預設為0
core file size          (blocks, -c) 0
#資料段大小,單位是kbyte,預設不做限制
data seg size           (kbytes, -d) unlimited
#排程優先順序,預設為0
scheduling priority             (-e) 0
#建立檔案的大小,單位是block,預設不做限制
file size               (blocks, -f) unlimited
#掛起的信號數量,預設是8192
pending signals                 (-i) 8192
#最大鎖定記憶體的值,單位是kbyte,預設是32
max locked memory       (kbytes, -l) 32
#最大可用的常駐記憶體值,單位是kbyte,預設不做限制
max memory size         (kbytes, -m) unlimited
#最大開啟的檔案數,預設是1024
open files                      (-n) 1024
#管道最大緩衝區的值
pipe size            (512 bytes, -p) 8
#訊息佇列的最大值,單位是byte
POSIX message queues     (bytes, -q) 819200
#程式的實時性優先順序,預設為0
real-time priority              (-r) 0
#棧大小,單位是kbyte
stack size              (kbytes, -s) 10240
#最大cpu占用時間,預設不做限制
cpu time               (seconds, -t) unlimited
#使用者最大進程數,預設是8192
max user processes              (-u) 8192
#最大虛擬記憶體,單位是kbyte,預設不做限制
virtual memory          (kbytes, -v) unlimited
#檔案鎖,預設不做限制
file locks                      (-x) unlimited

每一行中都包含了相應的改變該項設定的引數,以最大可以開啟的檔案數為例(open files 預設是 1024),想要增大至 4096 則按照如下命令設定(可參照此方法調整其他引數)。
#設定最大開啟的檔案數
#該命令會同時設定硬限制和軟限制
[[email protected] ~]# ulimit -n 4096
#使用-S引數單獨設定軟限制
#[[email protected] ~]# ulimit -S -n 4096
#使用-H引數單獨設定硬限制
#[[email protected] ~]# ulimit -H -n 4096

使用 ulimit 直接調整引數,只會在當前執行時生效,一旦系統重新啟動,所有調整過的引數就會變回系統預設值。所以建議將所有的改動放在 ulimit 的系統組態檔中。相關設定方法請參考筆者對相關組態檔的注釋。
[[email protected] ~]# cat /etc/security/limits.conf
# /etc/security/limits.conf
#該檔案是ulimit的組態檔,任何對系統的ulimit的修改都應該寫入該檔案
#請將所有的設定寫到該檔案的最後
#Each line describes a limit for a user in the form:
#設定應該寫成下面這行的格式,即每個設定占用1行,每行4列
#每列分別是<domain> <type> <item> <value>
#<domain>        <type>  <item>  <value>
#
#其中:
#<domain>可以取的值如下:
#       - 一個使用者名稱
#       - 一個組名,組名前面用@符號
#       - 萬用字元*
#       - 萬用字元%
#Where:
#<domain> can be:
#        - an user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#
#<type>只有以下兩個可用值:
#       - soft用於設定軟限制
#       - hard用於設定硬限制
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item>的值可以是以下任意一種:
#        - core - core檔案大小的限制 (KB)
#        - data - 最巨量資料段限制 (KB)
#        - fsize - 最大檔案大小 (KB)
#        - memlock - 最大鎖定的記憶體大小 (KB)
#        - nofile - 最大開啟檔案數
#        - rss - 最大常駐記憶體值 (KB)
#        - stack - 最大棧空間大小 (KB)
#        - cpu - 最大CPU使用時間 (MIN)
#        - nproc - 最大進程數
#        - as - 虛擬地址空間
#        - maxlogins - 某使用者的最大登入數
#        - maxsyslogins - 系統使用者最大登入數
#        - priority - 使用者進程的執行優先順序
#        - locks – 使用者最大可以鎖定檔案的數量
#        - sigpending - 最大掛起的號誌數
#        - msgqueue - POSIX信號佇列使用的最大記憶體值 (bytes)
#        - nice - 最大nice值
#        - rtprio - 最大實時優先順序
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open files
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to
#        - rtprio - max realtime priority
#
#<domain>      <type>  <item>         <value>
#
#以下是使用樣例,請參照設定
#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4