AIX上ulimit -a輸出的含義
之前分享了有關linux下更改命令,不過AIX的命令和linux還不太一樣。
不過基本解決的都是 www.2cto.com
:too many open files的錯誤
AIX 用戶使用的系統資源限制包括兩個概念 --- 硬限制(hard limits) 和軟限制(soft limits)。
hard limits自AIX 4.1版本開始引入。hard limits 應由AIX系統管理員設置,只有security組的成員可以將此值增大,
用戶本身可以減小此限定值,但是其更改將隨著該用戶從系統退出而失效。使用下列命令可以查看hard limits的限定值:
www.2cto.com
ulimit -Ha
soft limits 是AIX核心使用的限制進程對系統資源的使用的上限值。此值可由任何人更改,但不能超出
hard limits值。這裡要注意的是只有security組的成員可使更改永久生效,普通用戶的更改在其退出系統
後將失效。使用以下命令可以查看soft limits的設置:
ulimit -a
在/etc/security/limits 將stack值設為了-1 為何用ulimit -a 看到的是 4194304?
出現這種問題的原因是在您的操作系統中設置了默認的stack的“硬限制”(hard limit)。要解決這個問題,您需要在/etc/security/limits中設置stack的新的硬限制(hard limit)為無限,然後再設置stack的限制。如:
default:
fsize = 2097151
core = 2097151
cpu = -1
data = 262144
rss = 65536
stack_hard = -1
stack = -1
nofiles = 2000
然後用受影響的用戶賬戶重新登錄並運行ulimit -a命令,新的stack的限制應該成為無限:
#ulimit -a
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) 131072
stack(kbytes) unlimited
memory(kbytes) 32768
coredump(blocks) 2097151
nofiles(descriptors) 2000
To view the current value specified for these shell limits, and to change them if necessary:
1.Enter the following command:
# smit chuser
很多問題也會由設置不當而引起,這些值可以通過ulimit -a來查看:
PEKAX528:/>ulimit -a
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) 4194304
memory(kbytes) 32768
coredump(blocks) unlimited
nofiles(descriptors) 2000
但是這些都是什麼含義呢?下面這段文字看了就明白了。
PEKAX528:/>more /etc/security/limits
*
* Sizes are in multiples of 512 byte blocks, CPU time is in seconds
*
* fsize --- soft file size in blocks
* core --- soft core file size in blocks
* cpu --- soft per process CPU time limit in seconds
* data --- soft data segment size in blocks
* stack --- soft stack segment size in blocks
* rss --- soft real memory usage in blocks
* nofiles --- soft file descriptor limit
* fsize_hard --- hard file size in blocks
* core_hard --- hard core file size in blocks
* cpu_hard --- hard per process CPU time limit in seconds
* data_hard --- hard data segment size in blocks
* stack_hard --- hard stack segment size in blocks
* rss_hard --- hard real memory usage in blocks
* nofiles_hard --- hard file descriptor limit
*
* The following table contains the default hard values if the
* hard values are not explicitly defined:
*
* Attribute Value
* ========== ============
* fsize_hard set to fsize
* cpu_hard set to cpu
* core_hard -1
* data_hard -1
* stack_hard 8388608
* rss_hard -1
* nofiles_hard -1
*
* NOTE: A value of -1 implies "unlimited"
*
default:
fsize = 2097151
core = 2097151
cpu = -1
data = 262144
rss = 65536
stack = 65536
nofiles = 2000
root:
fsize = -1
data = -1
stack = -1
core = -1
daemon:
bin:
sys:
adm:
uucp:
guest:
nobody:
lpd:
db2inst1:
core = -1
rss = -1
fsize = -1
data = 491519
oracle:
fsize = -1
data = -1
stack = -1
core = -1
fsize_hard = -1
cpu_hard = -1
data_hard = -1
stack_hard = -1
core_hard = -1
core_hard = -1
rss = -1
nofiles = 4000
ulimit 命令
用途
設置或報告用戶資源極限。
語法
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.2 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
文件
/usr/bin/ksh
包含ulimit內置命令。
在linux上的程序放到AIX560上,結果一跑就coredown.
用ulimit -a查看限制,發現內存限制太小。將內存改為無限制(也可以用smit),
ulimit -m unlimited 內存
ulimit -s unlimited 堆棧
ulimit -d unlimited 數據段
發現程序最多可以申請256M內存,再多還是coredown。
再將
export LDR_CNTRL=MAXDATA=0x40000000 1G
export LDR_CNTRL=MAXDATA=0x80000000 2G
也最多可以申請2G空間,以上是用32位編譯的。
采用64位編譯(-q64)後。
export LDR_CNTRL=MAXDATA=0xD0000000
export LDR_CNTRL=MAXDATA=0xF0000000 4G
可以最多申請4G空間。
最後設置
export LDR_CNTRL=MAXDATA=0xF00000000 4G
幾乎可以申請無限空間(超出物理內存)。
設置該環境變量同時,可以設置使用dsa屬性和是否使用最大頁
eg:
export LDR_CNTRL=MAXDATA=0xF00000000@dsa
export LDR_CNTRL=MAXDATA=0xF00000000@LARGE_PAGE_DATA=y
如果使用32位編譯的話,可以通過共享內存來擴展超過2G的內存申請。
以上環境變量僅對當前對話有效,也可以單獨設置到程序中,
采用編譯或者啟動時添加選項都可以
eg:
cc -bmaxdata:0xD0000000/dsa sample.o
LDR_CNTRL=MAXDATA=0xF00000000 a.out
該值(nofiles)只能在AIX 4.3.1 或以後的版本中更改。
上述定義作為默認值存放在文件 /etc/security/limits 中,在新用戶被加進系統後生效。直接更改此文件中的定義值需要將系統重新啟動以便使更改生效。將相應值該為"-1" 表示不受 soft limits的限制(unlimited)。
下面我們將就各字段逐一進行介紹:
fsize 用戶創建的文件大小限制。此定義值(512字節為單位)為該用戶可以生成的最大文件的大小。
core 生成的core文件大小的限制(512字節為單位)。
cpu 用戶進程可用cpu的限定值(以秒為單位)。普通用戶只能將此值減小,root可以將此值增大。這裡要注意的
是進程使用CPU的時間取決於AIX Kernel(核心程序)進程調度算法,該值在此僅做參考。
data 進程數據段大小的限定值(以字節為單位)。
stack 進程堆棧段大小的限定值(以字節為單位)。
rss 進程常駐內存段的限定值(以字節為單位)。AIX核心並不參考此限定。
nofiles 進程中打開文件的最大數量。