Linux Limit相關內容設定大全(值得收藏)

自由早晚亂餘生發表於2021-05-16

一、 /etc/security/limits.conf 詳解

/etc/security/limits.conf 檔案實際是 Linux PAM(插入式認證模組,Pluggable Authentication Modules)中 pam_limits.so 的配置檔案,而且只針對於單個會話。 該設定不會影響系統服務的資源限制。還要注意 /etc/security/limits.d/ 的這個目錄,

/etc/security/limits.conf 配置解析

# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
該檔案為通過PAM登入的使用者設定資源限制。
#It does not affect resource limits of the system services.
#它不影響系統服務的資源限制。
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
請注意/etc/security/limits.d下按照字母順序排列的配置檔案會覆蓋 /etc/security/limits.conf中的
domain相同的的配置

#That means for example that setting a limit for wildcard domain here
#can be overriden with a wildcard setting in a config file in the
#subdirectory, but a user specific setting here can be overriden only
#with a user specific setting in the subdirectory.
這意味著,例如使用萬用字元的domain會被子目錄中相同的萬用字元配置所覆蓋,但是某一使用者的特定配置
只能被字母路中使用者的配置所覆蓋。其實就是某一使用者A如果在/etc/security/limits.conf有配置,當
/etc/security/limits.d子目錄下配置檔案也有使用者A的配置時,那麼A中某些配置會被覆蓋。最終取的值是 /etc/security/limits.d 下的配置檔案的配置。

#
#Each line describes a limit for a user in the form:
#每一行描述一個使用者配置
#<domain> <type> <item> <value>

#Where:
#<domain> can be:
# - a user name    一個使用者名稱
# - a group name, with @group syntax    使用者組格式為@GROUP_NAME
# - the wildcard *, for default entry    預設配置為*,代表所有使用者
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit 
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits 
# - "hard" for enforcing hard limits
有soft,hard和-,soft指的是當前系統生效的設定值,軟限制也可以理解為警告值。
hard表名系統中所能設定的最大值。soft的限制不能比hard限制高,用-表名同時設定了soft和hard的值。
#<item> can be one of the following:    <item>可以使以下選項中的一個
# - 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 file descriptors 最大開啟的檔案數(以檔案描敘符,file descripter計數) 
# - rss - max resident set size (KB) 最大持久設定大小
# - stack - max stack size (KB) 最大棧大小
# - cpu - max CPU time (MIN)    最多CPU佔用時間,單位為MIN分鐘
# - nproc - max number of processes 程式的最大數目
# - as - address space limit (KB) 地址空間限制 
# - 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 values: [-20, 19] max nice優先順序允許提升到值
# - rtprio - max realtime pr iority
#
#<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
#@st

/etc/security/limits.d/目錄

  • /etc/security/limits.d/ 目錄
    該目錄下預設有 *-nproc.conf 檔案,該檔案是用於限制使用者的執行緒限制。我們也可以在該目錄建立配置檔案在 /etc/security/limits.d/ 下,以 .conf 結尾。

    • centos 7

      在CentOS 7版本中為/etc/security/limits.d/20-nproc.conf

      # Default limit for number of user's processes to prevent
      # accidental fork bombs.
      # See rhbz #432903 for reasoning.
      
      *          soft    nproc     4096 # 所有的使用者預設可以開啟最大的程式數為 4096
      root       soft    nproc     unlimited # root 使用者預設可以開啟最大的程式數 無限制的。
      
      
    • CentOS 6

      在CentOS 6版本中為/etc/security/limits.d/90-nproc.conf

二、 ulimit 如何配置

配置注意事項

注意不能設定 nofile不能設定 unlimitednoproc可以.
當我們設定了 nofile不能設定 unlimited 後,我們進行 ssh 登入,是登入不了的,並且報錯下面的內容。

Dec  1 14:57:57 localhost sshd[1543]: pam_limits(sshd:session): Could not set limit for 'nofile': Operation not permitted

當我們設定的 nofile 的值可以設定的最大值為 1048576(2**20),設定的值大於該數,就會進行登入不了。也會顯示上面的登入錯誤。(親測)

基礎配置

我們不將所有的配置配置在/etc/security/limits.conf 而是將配置放在 /etc/security/limits.d/ 下。
比如我們將 nofile的配置放在 /etc/security/limits.d/20-nofile.conf ,nproc 的配置放在 /etc/security/limits.d/20-nproc.conf.

一般我們需要配置的 /etc/security/limits.d/20-nofile.conf 為。

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

/etc/security/limits.d/20-nproc.conf 設定為

*    -     nproc   65535
root soft  nproc  unlimited
root hard  nproc  unlimited

注意覆蓋點的問題。

示例一:
/etc/security/limits.conf 配置了:

root soft nofile 65538
root hard nofile 65538
* soft nofile 65539
* hard nofile 65539

這個root 使用者的 預設取值是 65538 ,* 統配符雖然在 root 配置後面,但是 root 的配置只能被 root 進行覆蓋。

我們看下這個配置,當這樣配置的時候

root soft nofile 65538
root hard nofile 65538
* soft nofile 65539
* hard nofile 65539
root soft nofile 65539

這個的 root 使用者的取值還是 65538 ,因為雖然 root soft nofile 65539 會覆蓋我們之前的配置,但是這個配置是不生效的。因為 root soft nofile 65539 配置的值大於root hard nofile 65538 , soft 配置的值不能大於 hard.

示例二:
當我們在 /etc/security/limits.conf 配置了:

root soft nofile 65538
root hard nofile 65538
* soft nofile 65539
* hard nofile 65539

然後我們在 /etc/security/limits.d/20-nofile.conf 配置了:

root soft nofile 65536
root hard nofile 65536
* soft nofile 65540
* hard nofile 65540

最後的取值是會取 /etc/security/limits.d/20-nofile.conf 裡面的值。

  1. 配置,只能被特定覆蓋。
  2. /etc/security/limits.d/ 下檔案的相同配置可以覆蓋 /etc/security/limits.conf
  3. softhard需要都進行設定,才能生效。
  4. nofile不能設定 unlimited
  5. nofile可以設定的最大值為 1048576(2**20),設定的值大於該數,就會進行登入不了。
  6. soft 設定的值 一定要小於或等於 hard 的值。

具體詳細配置根據應用情況進行配置。

三、ulimit 配置後生效

臨時配置

設定可以開啟檔案的最大數為 65536

ulimit  -SHn  65536

重啟後失效。

永久配置

配置到配置檔案/etc/security/limits.conf或者 /etc/security/limits.d/ 中。
然後退出當前會話,重新登入。 即可生效,重啟配置也會保留。

三、ulimit 配置後生效

臨時配置

設定可以開啟檔案的最大數為 65536

ulimit  -SHn  65536

重啟後失效。

永久配置

配置到配置檔案/etc/security/limits.conf或者 /etc/security/limits.d/ 中。
然後退出當前會話,重新登入。 即可生效,重啟配置也會保留。

配置不生效的問題

2020年3月6日補充

問題

按照上面的配置好了之後,我們進行設定登入到伺服器,我發現是配置沒有生效的,但是我使用 su - root 之後,發現配置是生效的。 很怪異。
裝置環境: Centos6.

問題原因

主要是 Centos6 的原因,我們排查到 sshd 服務的 PAM 模組是沒有開啟的,而/etc/security/limits.conf 檔案實際是 Linux PAM(插入式認證模組,Pluggable Authentication Modules)中 pam_limits.so 的配置檔案,我們沒有開啟 PAM 模組,最終也就沒有讀取到 /etc/security/limits.conf 的內容。 而 su 進行切換的時候使用的是 終端tty登陸(預設使用PAM模組),

解決辦法

/etc/ssh/sshd_configUsePAM no 更改為 UsePAM yes, 然後重啟 sshd 服務。

四、ulimit 常用命令

      -S	use the `soft' resource limit # 設定軟限制
      -H	use the `hard' resource limit # 設定硬限制
      -a	all current limits are reported# 顯示所有的配置。
      -b	the socket buffer size # 設定socket buffer 的最大值。
      -c	the maximum size of core files created # 設定core檔案的最大值.
      -d	the maximum size of a process's data segment  # 設定執行緒資料段的最大值
      -e	the maximum scheduling priority (`nice') # 設定最大排程優先順序
      -f	the maximum size of files written by the shell and its children # 建立檔案的最大值。
      -i	the maximum number of pending signals # 設定最大的等待訊號
      -l	the maximum size a process may lock into memory #設定在記憶體中鎖定程式的最大值
      -m	the maximum resident set size 
      -n	the maximum number of open file descriptors # 設定最大可以的開啟檔案描述符。
      -p	the pipe buffer size
      -q	the maximum number of bytes in POSIX message queues
      -r	the maximum real-time scheduling priority
      -s	the maximum stack size
      -t	the maximum amount of cpu time in seconds
      -u	the maximum number of user processes  # 設定使用者可以建立的最大程式數。
      -v	the size of virtual memory  # 設定虛擬記憶體的最大值
      -x	the maximum number of file locks

檢視配置

檢視所有的配置

ulimit  -a

檢視配置的最大開啟檔案數

ulimit  -n

更改配置

ulimit  -SHn  65536

五、systemd 相關的limit

最近一次故障中才發現的問題,就是我們通過systemd 管理的服務,檔案最大開啟數是 1024(軟限制),硬限制是4096. 但是我們的 /etc/security/limits.conf/etc/security/limits.d/20-nofile.conf 設定的值都不是1024。

引申出來,我們的 systemd 管理的服務有單獨的limit 限制

systemd 管理的服務limit 配置取決於以下三個位置:

  1. 系統服務的預設全域性配置 /etc/systemd/system.conf
  2. 使用者服務預設全域性配置 /etc/systemd/user.conf
  3. 單個系統服務的配置 /usr/lib/systemd/system/*.conf

問題一 如何檢視現有系統服務的Limit

  1. systemctl show sshd
[root@djx128 ~]# systemctl show  sshd |grep '^Limit'
LimitCPU=18446744073709551615
LimitFSIZE=18446744073709551615
LimitDATA=18446744073709551615
LimitSTACK=18446744073709551615
LimitCORE=18446744073709551615
LimitRSS=18446744073709551615
LimitNOFILE=4096
LimitAS=18446744073709551615
LimitNPROC=11222
LimitMEMLOCK=65536
LimitLOCKS=18446744073709551615
LimitSIGPENDING=11222
LimitMSGQUEUE=819200
LimitNICE=0
LimitRTPRIO=0
LimitRTTIME=18446744073709551615
  1. 如果是已經執行的服務,可以通過基於程式進行檢視, cat /proc/pid/limits

    [root@djx128 ~]#  cat /proc/943/limits
    Limit                     Soft Limit           Hard Limit           Units     
    Max cpu time              unlimited            unlimited            seconds   
    Max file size             unlimited            unlimited            bytes     
    Max data size             unlimited            unlimited            bytes     
    Max stack size            8388608              unlimited            bytes     
    Max core file size        0                    unlimited            bytes     
    Max resident set          unlimited            unlimited            bytes     
    Max processes             11222                11222                processes 
    Max open files            1024                 4096                 files     
    Max locked memory         65536                65536                bytes     
    Max address space         unlimited            unlimited            bytes     
    Max file locks            unlimited            unlimited            locks     
    Max pending signals       11222                11222                signals   
    Max msgqueue size         819200               819200               bytes     
    Max nice priority         0                    0                    
    Max realtime priority     0                    0                    
    Max realtime timeout      unlimited            unlimited            us   
    

問題二 一個服務,如何調整 Limit 限制

  1. 改全域性配置 /etc/systemd/system.conf

    改全域性配置如何生效? 這個需要注意。

  2. 更改單服務配置(推薦)

    1. 增加 LimitNOFILE 配置

      vim  /usr/lib/systemd/system/mariadb.service
      [Service]
      LimitNOFILE=32768
      
    2. 重新載入配置

      systemctl daemon-reload
      
    3. 重啟服務

      systemctl restart mariadb
      

六、 擴充套件

  1. 如何檢視當前執行程式的limit 限制

    cat /proc/程式號/limits
    
  2. 如何更改當前的程式的最大檔案數限制

    getrlimit, setrlimit, prlimit - get/set resource limits

    https://man7.org/linux/man-pages/man1/prlimit.1.html

    prlimit --pid 13134 --nofile=1024:4096
    

文章參考:

/etc/security/limits.conf配置檔案詳解

linux ulimit的若干坑 - ulimit真不是亂設的

相關文章