ulimit 命令詳解

命   令:ulimitjava

功   能:控制shell程序的資源node

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

  

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

  

    參  數: vim

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

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

-a 顯示當前全部的資源限制.服務器

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

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

-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 用戶。

 

二、使用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:

1、在用戶的啓動腳本中

        若是用戶使用的是 bash,就能夠在用戶的目錄下的 .bashrc 文件中,加入 ulimit – u 64,來限制用戶最多可使用 64 個進程。此外,能夠在與 .bashrc 功能至關的啓動腳本中加入 ulimt。

2、在應用程序的啓動腳本中

若是用戶要對某個應用程序 myapp 進行限制,能夠寫一個簡單的腳本 startmyapp。

ulimit – s 512
myapp

之後只要經過腳本 startmyapp 來啓動應用程序,就能夠限制應用程序 myapp 的線程棧大小爲 512K。

 

3、直接在控制檯輸入 

 ulimit – p 256 

限制管道的緩衝區爲 256K。

4、修改全部 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 使其生效

4、也能夠針對單個用戶的.bash_profile設置:

vi ~./.bash_profile

#ulimit -n 1024
從新登錄ok

 

三、用戶進程的有效範圍
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

 
四、用戶進程的有效範圍
 問題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
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 添加cat /proc/sys/fs/file-nr
864     0       3274116
have 864 out of max
session required     /lib64/security/pam_limits.so
9.3 重啓 ssh2和rccron,這樣只進程就自動繼承了nofile/etc/init.d/ssh2 restartrccron restart
相關文章
相關標籤/搜索