這是一篇很是好的文章,對ulimit的各個限制參數講得很是透徹。原文連接:http://home.lupaworld.com/home-space-uid-56821-do-blog-id-232810.htmlhtml
通常能夠經過ulimit命令或編輯/etc/security/limits.conf從新加載的方式使之生效
經過ulimit比較直接,但只在當前的session有效,limits.conf中能夠根據用戶和限制項使用戶在下次登陸中生效.
對於limits.conf的設定是經過pam_limits.so的加載生效的,好比/etc/pam.d/sshd,這樣經過ssh登陸時會加載limit.
又或者在/etc/pam.d/login加載生效.
下面將對各類限制進行分析
core file size
data seg size
scheduling priority
file size
pending signals
max locked memory
max memory size
open files
pipe size
POSIX message queues
real-time priority
stack size
cpu time
max user processes
virtual memory
file locks
一)限制進程產生的文件大小(file size)
先來講說ulimit的硬限制和軟限制
硬限制用-H參數,軟限制用-S參數.
ulimit -a看到的是軟限制,經過ulimit -a -H能夠看到硬限制.
若是ulimit不限定使用-H或-S,此時它會同時把兩類限制都改掉的.
軟限制能夠限制用戶/組對資源的使用,硬限制的做用是控制軟限制.
超級用戶和普通用戶均可以擴大硬限制,但超級用戶能夠縮小硬限制,普通用戶則不能縮小硬限制.
硬限制設定後,設定軟限制時只能是小於或等於硬限制.
下面的測試應用於硬限制和軟限制.
1)軟限制不能超過硬限制
在超級用戶下,同時修改硬/軟限制,使當前會話只能建100KB的文件
ulimit -f 100
查看當前建立文件大小的硬限制爲100KB
ulimit -H -f
100
此時限制當前會話的軟限制爲1000KB,出現不能修改的報錯
ulimit -S -f 1000
-bash: ulimit: file size: cannot modify limit: Invalid argument
2)硬限制不能小於軟限制
在超級用戶下,用戶查看當前的軟限制,此時爲unlmiited
ulimit -S -f
unlimited
此時修改當前會話建立文件大小的硬限制爲1000KB,出現不能修改的報錯,說明硬限制不能小於軟限制
ulimit -H -f 1000
-bash: ulimit: file size: cannot modify limit: Invalid argument
若是咱們把建立文件大小的軟限制改成900KB,此後就能夠修改它的硬限制了
ulimit -S -f 900
ulimit -H -f 1000
3)普通用戶只能縮小硬限制,超級用戶能夠擴大硬限制
用普通用戶進入系統
su - test
查看建立文件大小的硬限制
ulimit -H -f
unlimited
此時能夠縮小該硬限制
ulimit -H -f 1000
但不能擴大該硬限制
ulimit -H -f 10000
4)硬限制控制軟限制,軟限制來限制用戶對資源的使用
用軟限制限制建立文件的大小爲1000KB
ulimit -S -f 1000
用硬限制限制建立文件的大小爲2000KB
ulimit -H -f 2000
建立3MB大小的文件
dd if=/dev/zero of=/tmp/test bs=3M count=1
File size limit exceeded
查看/tmp/test的大小爲1000KB,說明軟限制對資源的控制是起決定性做用的.
ls -lh /tmp/test
-rw-r--r-- 1 root root 1000K 2010-10-15 23:04 /tmp/test
file size單位是KB.
二)關於進程優先級的限制(scheduling priority)
這裏的優先級指NICE值
這個值只對普通用戶起做用,對超級用戶不起做用,這個問題是因爲CAP_SYS_NICE形成的.
例如調整普通用戶可使用的nice值爲-10到20之間.
硬限制nice的限制爲-15到20之間.
ulimit -H -e 35
軟限制nice的限制爲-10到20之間
ulimit -S -e 30
用nice命令,使執行ls的nice值爲-10
nice -n -10 ls /tmp
ssh-BossiP2810
用nice命令,使執行ls的nice值爲-11,此時超過了ulimit對nice的軟限制,出現了異常.
nice -n -11 ls /tmp
nice: cannot set niceness: Permission denied
三)內存鎖定值的限制(max locked memory)
這個值只對普通用戶起做用,對超級用戶不起做用,這個問題是因爲CAP_IPC_LOCK形成的.
linux對內存是分頁管理的,這意味着有不須要時,在物理內存的數據會被換到交換區或磁盤上.
有須要時會被交換到物理內存,而將數據鎖定到物理內存能夠避免數據的換入/換出.
採用鎖定內存有兩個理由:
1)因爲程序設計上須要,好比oracle等軟件,就須要將數據鎖定到物理內存.
2)主要是安全上的須要,好比用戶名和密碼等等,被交換到swap或磁盤,有泄密的可能,因此一直將其鎖定到物理內存.
鎖定內存的動做由mlock()函數來完成
mlock的原型以下:
int mlock(const void *addr,size_t len);
測試程序以下:
#include <stdio.h>
#include <sys/mman.h>
int main(int argc, char* argv[])
{