linux下ulimit的用法__linux

來源:互聯網
上載者:User

ulimit命令
 
功能說明:控制shell程式的資源。

語  法:ulimit [-aHS][-c <core檔案上限>][-d <資料節區大小>][-f <檔案大小>][-m <記憶體大小>][-n <檔案數目>][-p <緩衝區大小>][-s <堆疊大小>][-t <CPU時間>][-u <程式數目>][-v <虛擬記憶體大小>]

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

參  數:
  -a  顯示目前資源限制的設定。
   -c <core檔案上限>  設定core檔案的最大值,單位為區塊。
   -d <資料節區大小>  程式資料節區的最大值,單位為KB。
   -f <檔案大小>  shell所能建立的最大檔案,單位為區塊。
   -H  設定資源的硬性限制,也就是管理員所設下的限制。
   -m <記憶體大小>  指定可使用記憶體的上限,單位為KB。
   -n <檔案數目>  指定同一時間最多可開啟的檔案數。
   -p <緩衝區大小>  指定管道緩衝區的大小,單位512位元組。
   -s <堆疊大小>  指定堆疊的上限,單位為KB。
   -S  設定資源的彈性限制式。
   -t <CPU時間>  指定CPU使用時間的上限,單位為秒。
   -u <程式數目>  使用者最多可開啟的程式數目。
   -v <虛擬記憶體大小>  指定可使用的虛擬記憶體上限,單位為KB。
 
舉例
 在Linux下寫程式的時候,如果程式比較大,經常會遇到“段錯誤”(segmentation fault)這樣的問題,這主要就是由於Linux系統初始的堆棧大小(stack size)太小的緣故,一般為10M。我一般把stack size設定成256M,這樣就沒有段錯誤了。命令為:
ulimit   -s 262140
如果要系統自動記住這個配置,就編輯/etc/profile檔案,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit   -s 262140”,儲存重啟系統就可以了。
1]在RH8的環境檔案/etc/profile中,我們可以看到系統是如何配置ulimit的:
 #grep ulimit /etc/profile
ulimit -S -c 0 > /dev/null 2>&1
這條語句設定了對軟體資源和對core檔案大小的設定
2]如果我們想要對由shell建立的檔案大小作些限制,如:
 #ll h
-rw-r--r-- 1 lee lee 150062 7月 22 02:39 h
 #ulimit -f 100 #設定建立檔案的最大塊(一塊=512位元組)
 #cat h>newh
 File size limit exceeded
 #ll newh
-rw-r--r-- 1 lee lee 51200 11月 8 11:47 newh
檔案h的大小是150062位元組,而我們設定的建立檔案的大小是512位元組x100塊=51200位元組
 當然系統就會根據你的設定產生了51200位元組的newh檔案.
3]可以像執行個體1]一樣,把你要設定的ulimit放在/etc/profile這個環境檔案中.
用途
 設定或報告使用者資源極限。
 文法
ulimit [ -H ] [ -S ] [ -a ] [ -c ] [ -d ] [ -f ] [ -m ] [ -n ] [ -s ] [ -t ] [ Limit ]
描述
ulimit 命令設定或報告使用者進程資源極限,如 /etc/security/limits 檔案所定義。檔案包含以下預設值極限:
fsize = 2097151
 core = 2097151
cpu = -1
 data = 262144
 rss = 65536
 stack = 65536
 nofiles = 2000
當新使用者添加到系統中時,這些值被作為預設值使用。當向系統中添加使用者時,以上值通過 mkuser 命令設定,或通過 chuser 命令更改。
 極限分為軟性或硬性。通過 ulimit 命令,使用者可將軟極限更改到硬極限的最大設定值。要更改資源硬極限,必須擁有 root 使用者權限。
 很多系統不包括以上一種或數種極限。 特定資源的極限在指定 Limit 參數時設定。Limit 參數的值可以是每個資源中指定單元中的數字,或者為值 unlimited。要將特定的 ulimit 設定為 unlimited,可使用詞 unlimited。
    註:在 /etc/security/limits 檔案中設定預設極限就是設定了系統寬度極限, 而不僅僅是建立使用者時使用者所需的極限。
 省略 Limit 參數時,將會列印出當前資源極限。除非使用者指定 -H 標誌,否則列印出軟極限。當使用者指定一個以上資源時,極限名稱和單元在值之前列印。如果未給予選項,則假定帶有了 -f 標誌。
 由於 ulimit 命令影響當前 shell 環境,所以它將作為 shell 常規內建命令提供。如果在獨立的命令執行環境中調用該命令,則不影響調用者環境的檔案大小極限。以下樣本中正是這種情況:
nohup ulimit -f 10000
 env ulimit 10000
一旦通過進程減少了硬極限,若無 root 特權則無法增加,即使返回到原值也不可能。
 關於使用者和系統資源極限的更多資訊,請參見 AIX 5L Version 5.3 Technical Reference: Base Operating System and Extensions Volume 1 中的 getrlimit、setrlimit 或 vlimit 子常式。
 標誌
-a     列出所有當前資源極限。
-c     以 512 位元組塊為單位,指定核心轉儲的大小。
-d     以 K 位元組為單位指定資料區域的大小。
-f     使用 Limit 參數時設定檔案大小極限(以塊計),或者在未指定參數時報告檔案大小極限。預設值為 -f 標誌。
-H     指定設定某個給定資源的硬極限。如果使用者擁有 root 使用者權限,可以增大硬極限。任何使用者均可減少硬極限。
-m     以 K 位元組為單位指定實體儲存體器的大小。
-n     指定一個進程可以擁有的檔案描述符的數量的極限。
-s     以 K 位元組為單位指定堆棧的大小。
-S     指定為給定的資源設定軟極限。軟極限可增大到硬極限的值。如果 -H 和 -S 標誌均未指定,極限適用於以上二者。
-t     指定每個進程所使用的秒數。
 退出狀態
 返回以下退出值:
0     成功完成。
>0     拒絕對更高的極限的請求,或發生錯誤。
 樣本
 要將檔案大小極限設定為 51,200 位元組,輸入:
ulimit -f 100

 

 

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 是代表最大檔案開啟數
2)、讓 SSH 接受 Login 程式的登入,方便在 ssh 用戶端查看 ulimit -a 資源限制:
    a、vi /etc/ssh/sshd_config
       把 UserLogin 的值改為 yes,並把 # 注釋去掉
    b、重啟 sshd 服務:
       /etc/init.d/sshd restart
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
-------------
對於solaris

其實在系統裡面有這樣一個命令ulimit,以下是ulimit -a執行的結果:

time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) 8192
coredump(blocks) unlimited
nofiles(descriptors) 1024
memory(kbytes) unlimited
其中nofiles就是檔案描述符的變數值,該值受rlim_fd_cur這個參數的影響,可以用ulimit -n number命令來修改。但不管怎麼改,程式仍然不能突破fd=256的限制。在Solaris Tunable Parameters Reference Manua這本書裡面能查到以下的資料:

A 32-bit program using standard I/O is limited to 256 file descriptors。
A 64-bit program using standard I/O can use up to 2 billion descriptors。
這也就是說32位的程式是沒有辦法突破這個限制的,只有64位的程式才能使用高達2億個檔案描述符,SUN的軟硬體在很早以前就實現了64位的架構,現在唯一要解決的就是將程式編譯成64位程式,為了產生64位程式,就必須要有64位的編譯器(其實不是這樣的),如果你去www.sunfreeware.com下載64位編譯器gcc,網站上沒有特別註明是64位的gcc,但是會有個意外的收穫,就是該軟體的說明裡面註明了只要在用gcc編譯的時候加上-m64的option就能產生64位程式了。

於是用gcc -m64去編譯產生一個64位程式後,用ulimit -n 102400將number of fd設成很大的情況下,所有問題迎刃而解,再也不存在檔案描述符不夠用的情況。

在/etc/system檔案設定rlimi_fc_max和rlim_fd_cur格式如下:

* set hard limit on file descriptors
set rlim_fd_max = 4096
* set soft limit on file descriptors
set rlim_fd_cur = 1024
命令ulimit使用格式如下:

usage: ulimit [ -HSacdfnstv ] [ limit ]
ulimit -a是顯示各參數的設定值,ulimit -n是用來設定fd的最大值的。
*************************************************

修改檔案描述符限制

Solaris有兩個參數控制進程可開啟的檔案描述符:rlim_fd_max,rlim_fd_cur。前者修改是個硬設定,修改需要許可權,後者是個軟設定,使用者可以limit或者setrlimit() 修改,該值最大不能超過前者。一般我們在/etc/system裡修改這兩個參數

set rlim_fd_max = 65535

set rlim_fd_cur = 65535

==========================

ulimit 用於shell啟動進程所佔用的資源。

可以使用該命令查看進程佔用資源的情況。

使用方法:ulimit [-acdfHlmnpsStvw] [size]

-H 設定硬體資源限制.
-S 設定軟體資源限制.
-a 顯示當前所有的資源限制.
-c size:設定core檔案的最大值.單位:blocks
-d size:設定資料區段的最大值.單位:kbytes
-f size:設定建立檔案的最大值.單位:blocks
-l size:設定在記憶體中鎖定進程的最大值.單位:kbytes
-m size:設定可以使用的常駐記憶體的最大值.單位:kbytes
-n size:設定核心可以同時開啟的檔案描述符的最大值.單位:n
-p size:設定管道緩衝區的最大值.單位:kbytes
-s size:設定堆棧的最大值.單位:kbytes
-t size:設定CPU使用時間的最大上限.單位:seconds
-v size:設定虛擬記憶體的最大值.單位:kbytes 5
1]在RH8的環境檔案/etc/profile中,我們可以看到系統是如何配置ulimit的:

#grep ulimit /etc/profile
ulimit -S -c 0 > /dev/null 2>&1    (輸出重新導向,正常輸出和異常輸出都忽略)

這條語句設定了對軟體資源和對core檔案大小的設定
2]如果我們想要對由shell建立的檔案大小作些限制,如:

#ll h
-rw-r--r-- 1 lee lee 150062 7月 22 02:39 h
#ulimit -f 100 #設定建立檔案的最大塊(一塊=512位元組)
#cat h>newh
File size limit exceeded
#ll newh
-rw-r--r-- 1 lee lee 51200 11月 8 11:47 newh
檔案h的大小是150062位元組,而我們設定的建立檔案的大小是512位元組x100塊=51200位元組
當然系統就會根據你的設定產生了51200位元組的newh檔案.
3]可以像執行個體1]一樣,把你要設定的ulimit放在/etc/profile這個環境檔案中.
如果針對所有使用者佈建,可在/etc/security/limits.conf 設定.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.