1. 程式人生 > >Linux中最大進程數和最大文件數

Linux中最大進程數和最大文件數

second nice AI pre 添加記錄 cde sys 前言 over

前言

Linux系統中可以設置關於資源的使用限制,比如:進程數量,文件句柄數,連接數等等。
在日常的工作中應該遇到過:

-bash: fork: retry: Resource temporarily unavailable

或者

too many open files

這些類似的操作錯誤,前者是由於當前用戶的進程數超出限制,後者由於當前用戶的文件打開數超出限制。

下面就簡單的介紹下配置用戶進程數和文件打開數。

一.ulimit命令

Provides control over the resources available to the shell and to processes started by it, on systems that allow such control.

Linux的man文檔中是這樣描述ulimit的:提供了當前shell控制系統資源的能力。從這裏可以分析出ulimit的特點:

  • 可控系統資源:cpu、memory、process、file等等
  • 控制的 作用域在當前shell會話中

ulimit的語法:

ulimit [-HSTabcdefilmnpqrstuvx [limit]]

分為參數和值兩部分,參數用於表示特定的資源類型,值表示在對特定的資源進行限制的量度。

命令參數 描述 例子
-H 設置硬資源限制,一旦設置不能增加 ulimit –Hs 64;限制硬資源,線程棧大小為 64K
-S 設置軟資源限制,設置後可以增加,但是不能超過硬資源設置 ulimit –Sn 32;限制軟資源,32 個文件描述符
-a 顯示當前所有的 limit 信息 ulimit – a;顯示當前所有的 limit 信息
-c 最大的 core 文件的大小, 以 blocks 為單位 ulimit –c unlimited; 對生成的 core 文件的大小不進行限制
-d 進程最大的數據段的大小,以 Kbytes 為單位 ulimit -d unlimited;對進程的數據段大小不進行限制
-f 進程可以創建文件的最大值,以 blocks 為單位 ulimit –f 2048;限制進程可以創建的最大文件大小為 2048 blocks
-l 最大可加鎖內存大小,以 Kbytes 為單位 ulimit –l 32;限制最大可加鎖內存大小為 32 Kbytes
-m 最大內存大小,以 Kbytes 為單位 ulimit – m unlimited;對最大內存不進行限制
-n 可以打開最大文件描述符的數量 ulimit –n 128;限制最大可以使用 128 個文件描述符
-p 管道緩沖區的大小,以 Kbytes 為單位 ulimit –p 512;限制管道緩沖區的大小為 512 Kbytes
-s 線程棧大小,以 Kbytes 為單位 ulimit – s 512;限制線程棧的大小為 512 Kbytes
-t 最大的 CPU 占用時間,以秒為單位 ulimit – t unlimited;對最大的 CPU 占用時間不進行限制
-u 用戶最大可用的進程數 ulimit – u 64 限制用戶最多可以使用 64 個進程
-v 進程最大可用的虛擬內存,以 Kbytes 為單位 ulimit – v 200000;限制最大可用的虛擬內存為 200000 Kbytes

根據以上表格所列,如果需要設置當前用戶的最大進程數和文件打開數只要如下設置即可:

  • ulimit -u 8192 設置當前用戶的最大進程數為8192,只在當前shell中生效
  • ulimit -n 8192 設置當前用戶的最大文件打開數8192,只在當前shell中生效

同時可以通過參數-a查看當前用戶的所有限制情況:

[post@PostOS ~]$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127510
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 32768
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可以通過max user processes和open files 看出當前post用戶的最大進程數和最大打開文件數分別為32768和8192。

二.設置配置文件

前面介紹了ulimit的方式修改系統資源的限制,但是有局限性:ulimit只對當前shell會話生效。如果重新打開一個shell,配置又重新變成之前的限制了。如果需要永久生效需要修改文件讓其配置持久化。

配置文件主要分為:

  • 將命令寫至profile和bashrc中,相當於在登陸時自動動態修改限制
  • 在/etc/security/limits.conf中添加記錄(需重啟生效,並且在/etc/pam.d/中的seesion有使用到limit模塊)

第一種方式很好理解,就是每次shell用戶登錄時,加載當前的用戶的profile執行ulimit命令,以達到修改資源限制。
下面主要介紹下:如何修改/etc/security/limits.conf。

#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
#        - 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
#
#<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 file descriptors
#        - 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 (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]
#        - 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

# End of file
* soft nofile 32768
* hard nofile 65536
#use for oracle
postgres soft nproc 2047
postgres hard nproc 16384
postgres soft nofile 2048
postgres hard nofile 65536
postgres soft stack 10240

從文件的註釋說明中可以看出該文件的配置含義,配置主要分為四個部分:

  • domain部分:用來表示用戶名或者組名。@後接用戶名或者組名表示用戶名或者組名;*表示所有用戶
  • type部分:表示資源層面,有兩種值soft和hard。soft表示在軟件層面,hard表示在硬件層面
  • item部分:表示可以限制的資源類型。core限制核心的文件大小;locks表示用戶可以持有的最大文件鎖數量;nproc表示最大的進程數;nofile表示最大的打開文件句柄數
  • value部分:限制的資源數量的值

如上面的配置: #@student hard nproc 20,表示student用戶在硬件上最大的進程數只有20,* soft nofile 32768表示軟件上所有用戶的最大文件打開數是32768。

只修改了這個文件還無法完成配置,還需要修改 /etc/security/limits.d/90-nproc.conf配置文件,可以先查看下這個文件的內容:

# Default limit for number of user‘s processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     8192
root       soft    nproc     unlimited

從註釋中可以看出,是針對用戶進程的默認限制。從配置中可以看出root用戶不做進程數量的限制,其他用戶的最大進程數為8192。

關於Linux中為何既有/etc/security/limit.conf又還配置一個limits.d/90-nproc.conf,這個問題由於個人能力有限,無法回答。讀者感興趣可以自行研究,不吝賜教。

參考

ulimit限制之nproc問題

Linux中最大進程數和最大文件數