Linux 指令篇:系統設定--ulimit

47328983發表於2011-04-01

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

語  法:ulimit [-aHS][-c ][-d ][-f ][-m ][-n ][-p ][-s ][-t ][-u ][-v ]

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

參  數:
  -a  顯示目前資源限制的設定。 
  -c   設定core檔案的最大值,單位為區塊。 
  -d   程式資料節區的最大值,單位為KB。 
  -f   shell所能建立的最大檔案,單位為區塊。 
  -H  設定資源的硬性限制,也就是管理員所設下的限制。 
  -m   指定可使用記憶體的上限,單位為KB。 
  -n   指定同一時間最多可開啟的檔案數。 
  -p   指定管道緩衝區的大小,單位512位元組。 
  -s   指定堆疊的上限,單位為KB。 
  -S  設定資源的彈性限制。 
  -t   指定CPU使用時間的上限,單位為秒。 
  -u   使用者最多可開啟的程式數目。 
  -v   指定可使用的虛擬記憶體上限,單位為KB。

5.舉例
在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”,儲存重啟系統就可以了!

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的最大值的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/241379/viewspace-691490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章