ulimit 命令詳解


命   令:ulimit

功   能:控制shell程序的資源

語  法:ulimit [-aHS][-c <core文件上限>][-d <數據節區大小>][-f <文件大 小>][-m <內存大小>][-n <文件數目>][-p <緩沖區大小>][-s <堆棧大小>][-t <CPU時間>][-u <程序數目>][-v <虛擬內存大小>]

  

    補充說明:ulimit為shell內建指令,可用來控制shell執行程序的資源。 

  

    參  數: 

-H 設置硬件資源限制,是管理員所設下的限制.

-S 設置軟件資源限制,是管理員所設下的限制.

-a 顯示當前所有的資源限制.

-u 進程數目:用戶最多可啟動的進程數目.

-c size:設置core文件的最大值.單位:blocks

-d size:設置程序數據段的最大值.單位:kbytes

-f size:設置shell創建文件的最大值.單位:blocks

-l size:設置在內存中鎖定進程的最大值.單位:kbytes

-m size:設置可以使用的常駐內存的最大值.單位:kbytes

-n size:設置內核可以同時打開的文件描述符的最大值.單位:n

-p size:設置管道緩沖區的最大值.單位:kbytes

-s size:設置堆棧的最大值.單位:kbytes

-t size:設置CPU使用時間的最大上限.單位:seconds

-v size:設置虛擬內存的最大值.單位:kbytes

 

 

2. 系統調優

 

    如前所述, ulimit -a 用來顯示當前的各種用戶進程限制。

    Linux對於每個用戶,系統限制其最大進程數。為提高性能,可以根據設備資源情況,

    設置各linux 用戶的最大進程數,下面我把某linux用戶的最大進程數設為10000個: 

  

     ulimit -u 10000 

     對於需要做許多 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 是代表最大文件打開數 

 

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 

 

/**************************************

 

有時候在程序里面需要打開多個文件,進行分析,系統一般默認數量是1024,(用ulimit -a可以看到)對於正常使用是夠了,但是對於程序來講,就太少了。

修改2個文件。

1) /etc/security/limits.conf

vi /etc/security/limits.conf

加上:

* soft nofile 8192

* hard nofile 20480

2) /etc/pam.d/login

session required /lib/security/pam_limits.so

**********

另外確保/etc/pam.d/system-auth文件有下面內容

session required /lib/security/$ISA/pam_limits.so

這一行確保系統會執行這個限制。

***********

3) 一般用戶的.bash_profile

#ulimit -n 1024

重新登陸ok

 

3. /proc目錄:

1)/proc目錄里面包括很多系統當前狀態的參數,例如:引用

/proc/sys/fs/file-max

/proc/sys/fs/inode-max

 

 

是對整個系統的限制,並不是針對用戶的;

2)proc目錄中的值可以進行動態的設置,若希望永久生效,可以修改/etc/sysctl.conf文件,並使用下面的命令確認:

# sysctl -p

ulimit 用於限制 shell 啟動進程所占用的資源,支持以下各種類型的限制:

    所創建的內核文件的大小、

    進程數據塊的大小、

    Shell 進程創建文件的大小、

    內存鎖住的大小、

    常駐內存集的大小、

    打開文件描述符的數量、

    分配堆棧的最大大小、

    CPU 時間、

    單個用戶的最大線程數、

   Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。

作為臨時限制,ulimit 可以作用於通過使用其命令登錄的 shell 會話,在會話終止時便結束限制,並不影響於其他 shell 會話。而對於長期的固定限制,ulimit 命令語句又可以被添加到由登錄 shell 讀取的文件中,作用於特定的 shell 用戶。

 

2、使用ulimit
ulimit 通過一些參數選項來管理不同種類的系統資源。

ulimit 命令的格式為:ulimit [options] [limit]

 

主要關注兩個:

1)open files:– 用戶可以打開文件的最大數目

對應ulimit 的命令ulimit -n,可以使用ulimit -n 臨時設置。

對應/etc/security/limits.conf的資源限制類型是:nofile

* soft nofile 4096    

 * hard nofile 4096

2)max user processes  – 用戶可以開啟進程/線程的最大數目

對應ulimit 的命令ulimit  -u  臨時修改max user processes的值:ulimit  -u   8192。

對應/etc/security/limits.conf的資源限制類型是:  noproc

*          soft    nproc     8192

 

具體的 options 含義以及簡單示例可以參考以下表格。
ulimit 參數說明

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

我們可以通過以下幾種方式來使用 ulimit:

一、在用戶的啟動腳本中

        如果用戶使用的是 bash,就可以在用戶的目錄下的 .bashrc 文件中,加入 ulimit – u 64,來限制用戶最多可以使用 64 個進程。此外,可以在與 .bashrc 功能相當的啟動腳本中加入 ulimt。

二、在應用程序的啟動腳本中

如果用戶要對某個應用程序 myapp 進行限制,可以寫一個簡單的腳本 startmyapp。

ulimit – s 512
myapp

以后只要通過腳本 startmyapp 來啟動應用程序,就可以限制應用程序 myapp 的線程棧大小為 512K。

 

三、直接在控制台輸入 

 ulimit – p 256 

限制管道的緩沖區為 256K。

四、修改所有 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 使其生效

四、也可以針對單個用戶的.bash_profile設置:

vi ~./.bash_profile

#ulimit -n 1024
重新登陸ok

 

3、用戶進程的有效范圍
ulimit 作為對資源使用限制的一種工作,是有其作用范圍的。那么,它限制的對象是單個用戶,單個進程,還是整個系統呢?事實上,ulimit 限制的是當前 shell 進程以及其派生的子進程。舉例來說,如果用戶同時運行了兩個 shell 終端進程,只在其中一個環境中執行了 ulimit – s 100,則該 shell 進程里創建文件的大小收到相應的限制,而同時另一個 shell終端包括其上運行的子程序都不會受其影響:

Shell 進程 1

ulimit –s 100
cat testFile > newFile
File size limit exceeded

Shell 進程 2

cat testFile > newFile
ls –s newFile
323669 newFile

 

針對用戶永久生效:

那么,是否有針對某個具體用戶的資源加以限制的方法呢?答案是有的,方法是通過修改系統的 /etc/security/limits.conf配置文件。該文件不僅能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對限定的一個描述。

limits.conf的格式如下:

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

username|@groupname       type        resource          limit

domain:username|@groupname:設置需要被限制的用戶名,組名前面加@和用戶名區別。也可以用通配符*來做所有用戶的限制。

type:有 soft,hard 和 -,soft 指的是當前系統生效的設置值。hard 表明系統中所能設定的最大值。soft 的最大值不能超過hard的值。用 – 就表明同時設置了 soft 和 hard 的值。

resource:
    core – 限制內核文件的大小
    date – 最大數據大小
    fsize – 最大文件大小
    memlock – 最大鎖定內存地址空間
    nofile – 打開文件的最大數目
    rss – 最大持久設置大小
    stack – 最大棧大小
    cpu – 以分鍾為單位的最多 CPU 時間
    noproc – 進程的最大數目(系統的最大進程數)
    as – 地址空間限制
   maxlogins – 此用戶允許登錄的最大數目

   要使 limits.conf 文件配置生效,必須要確保 pam_limits.so 文件被加入到啟動文件中。

   查看 /etc/pam.d/login 文件中有:
   session required /lib/security/pam_limits.so

 

例如:解除 Linux 系統的最大進程數和最大文件打開數限制:  

        vi /etc/security/limits.conf  

        # 添加如下的行  

        * soft noproc 20000  #軟連接   

        * hard noproc 20000  #硬連接  

        * soft nofile 4096    

        * hard nofile 4096  

       說明:* 代表針對所有用戶,noproc 是代表最大進程數,nofile 是代表最大文件打開數

 

需要注意一點:/etc/security/limits.d下也有noproc最大進參數的限制:

即 /etc/security/limits.d/下的文件覆蓋了/etc/security/limits.conf設置的值 

這個是官網答疑:https://access.redhat.com/solutions/406663

# /etc/security/limits.conf
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#Also note that configuration files in /etc/security/limits.d directory,
#That means for example that setting a limit for wildcard domain here

[root@tr10-46-65-29 ~]# cat /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     8192
root       soft    nproc     unlimited

現在已經可以對進程和用戶分別做資源限制了,看似已經足夠了,其實不然。很多應用需要對整個系統的資源使用做一個總的限制,這時候我們需要修改 /proc 下的配置文件。/proc 目錄下包含了很多系統當前狀態的參數,例如 /proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range 等等,從文件的名字大致可以猜出所限制的資源種類。

注意:

通過讀取/proc/sys/fs/file-nr可以看到當前使用的文件描述符總數。另外,對於文件描述符的配置,需要注意以下幾點:

 
所有進程打開的文件描述符數不能超過/proc/sys/fs/file-max

 
 
 
單個進程打開的文件描述符數不能超過user limit中nofile的soft limit

 
 
 
nofile的soft limit不能超過其hard limit

 
 
 
nofile的hard limit不能超過/proc/sys/fs/nr_open

 
4、用戶進程的有效范圍
 問題1:su切換用戶時提示:Resource temporarily unavailable

或者通過進程跟蹤 strace -p pid 看到:Resource temporarily unavailab

通過ulimit -a,得到結果:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63463
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
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

 

在上面這些參數中,通常我們關注得比較多:

open files: 一個進程可打開的最大文件數.

max user processes: 系統允許創建的最大進程數量.

通過 ps -efL|grep java |wc -l

#24001

這個得到的線程數竟然是2萬多,遠遠超過4096

我們可以使用 ulimit -u 20000 修改max user processes的值,但是只能在當前終端的這個session里面生效,重新登錄后仍然是使用系統默認值。

正確的修改方式是修改/etc/security/limits.d/20-nproc.conf文件中的值。先看一下這個文件包含什么:

$ cat /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
我們只要修改上面文件中的8192這個值,即可。

 

問題2:linux 打開文件數 too many open files 解決方法
在運行某些命令或者 tomcat等服務器持續運行 一段時間后可能遇到   too many open files。

出現這句提示的原因是程序打開的文件/socket連接數量超過系統設定值。

java進程如果遇到java.net.SocketException: Too many open files,接着可能導致域名解析ava.net.UnknownHostException:

原因是用戶進程無法打開系統文件了。

 

查看每個用戶最大允許打開文件數量


ulimit -a

其中 open files (-n) 65535 表示每個用戶最大允許打開的文件數量是65535 。 默認是1024。1024很容易不夠用。

永久修改open files 方法
vim /etc/security/limits.conf  
在最后加入  
* soft nofile 65535 
* hard nofile 65535  

或者只加入

 * - nofile 65535

最前的 * 表示所有用戶,可根據需要設置某一用戶,例如
fdipzone soft nofile 8192  
fdipzone hard nofile 8192  

注意"nofile"項有兩個可能的限制措施。就是項下的hard和soft。 要使修改過得最大打開文件數生效,必須對這兩種限制進行設定。 如果使用"-"字符設定, 則hard和soft設定會同時被設定。 
改完后注銷一下就能生效。

通過 ulimit -n或者ulimit -a 查看系統的最大文件打開數已經生效了。但此時查看進程的最大文件打開數沒有變,原因是這個值是在進程啟動的時候設定的,要生效必須重啟!

 

ok,那就重啟吧,重啟完畢,結果發現依然沒變!這奇了怪了,后來經過好久的排查,最終確認問題是,該程序是通過 supervisord來管理的,也就是這進程都是 supervisord 的子進程,而 supervisord 的最大文件打開數還是老的配置,此時必須重啟 supervisord 才可以。

當大家遇到limits修改不生效的時候,請查一下進程是否只是子進程,如果是,那就要把父進程也一並重啟才可以。

1. limits是一個進程的資源,會被子進程繼承
 
2. soft limit -S, hard limits -H
hard limits只能被root用戶修改,啟動的時候會加載配置/etc/security/limits.conf
soft limits可以被任何用戶修改,但不能超過hard limits
 
3. 在linux下,每個進程的limit信息保存在/proc/PID/limits文件中(linux OS kenerl > 2.6.24)。低於2.6.24版本的kenerl需要手動統計 /proc/PID/fd下面有多個少個文件。
 
4. lsof -p pid顯示所有的打開文件包括shared library
lsof 會統計一些duplicate的open file
 
5. system-wide fd
sysctl -a
vim /etc/sysctl.conf
 
6. max open file on the system
cat /proc/sys/fs/file-max
 
7. stat the openning file from the kenerl point of view
cat /proc/sys/fs/file-nr 
864     0       3274116
have 864 out of max
3274116 open files

8.利用lsof統計每個進程打開的文件數目
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more 

9. 設置普通用戶下打開文件的最大值
 ulimit -n 4096
-bash: ulimit: open files: cannot modify limit: Operation not permitted
9.1 在/etc/security/limits.conf中添加
* hard nofile 100000
* soft nofile 100000
9.2 /etc/pam.d/login 添加
session required     /lib64/security/pam_limits.so
9.3 重啟 ssh2和rccron,這樣只進程就自動繼承了nofile
/etc/init.d/ssh2 restart
rccron restart


免責聲明!

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



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