ulimit的一些理解和在docker中的經驗


本文主要搬運自:

    1、http://weibo.com/p/1001603867707551442110

    2、http://blog.yufeng.info/archives/tag/ulimit

    3、https://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/

   以及參雜着一些我的理解,用於記憶備份,我是勤勞的搬運工。


一、ulimit的理解與使用

  ulimit 用於限制 shell 啓動進程所佔用的資源,支持以下各種類型的限制:所創建的內核文件的大小、進程數據塊的大小、Shell 進程創建文件的大小、內存鎖住的大小、常駐內存集的大小、打開文件描述符的數量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數、Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。

  ulimit的使用方法如下:

  ulimit [options] [limit],如設置打開文件描述符的數量ulimit -n 1024,查看則使用對應選項ulimit -n,參看所有參數設置使用ulimit -a。

  wKiom1WwpEXxMYCFAAIxD3iN2F4836.jpg

  具體的options含義及簡單設置可以參照下表:


選項
含義例子
-H
設置硬資源限制,一旦設置不能增加。ulimit – Hs 64;限制硬資源,線程棧大小爲 64K。
-S設置軟資源限制,設置後可以超過,會有warning,但是不能超過硬資源設置。ulimit – Sn 32;限制軟資源,32 個文件描述符。
-a顯示當前所有的 limit 信息。ulimit – a;顯示當前所有的 limit 信息。
-c最大的 core 文件的大小, 以 blocks 爲單位。ulimit – c unlimited; 對生成的 core 文件的大小不進行限制。
-d進程最大的數據段的大小,以 Kbytes 爲單位。ulimit -d unlimited;對進程的數據段大小不進行限制。
-f進程可以創建文件的最大值,以 blocks 爲單位。ulimit – f 2048;限制進程可以創建的最大文件大小爲 2048 blocks。
-l最大可加鎖內存大小,以 Kbytes 爲單位。ulimit – l 32;限制最大可加鎖內存大小爲 32 Kbytes。
-m 最大內存大小,以 Kbytes 爲單位。ulimit – m unlimited;對最大內存不進行限制。
-n可以打開最大文件描述符的數量。ulimit – n 128;限制最大可以使用 128 個文件描述符。
-p管道緩衝區的大小,以 Kbytes 爲單位。ulimit – p 512;限制管道緩衝區的大小爲 512 Kbytes。
-s線程棧大小,以 Kbytes 爲單位。ulimit – s 512;限制線程棧的大小爲 512 Kbytes。
-t最大的 CPU 佔用時間,以秒爲單位。ulimit – t unlimited;對最大的 CPU 佔用時間不進行限制。
-u用戶最大可用的進程數。ulimit – u 64;限制用戶最多可以使用 64 個進程。
-v進程最大可用的虛擬內存,以 Kbytes 爲單位。ulimit – v 200000;限制最大可用的虛擬內存爲 200000 Kbytes。


  有些限制option並不是很好理解,但是常用的HSafmntuv這些應該還是比較直白的。我們用下面的例子來驗證一下ulimit的效果。

wKiom1WwqFfCRFlsAAF9wqer6Ug528.jpg

  可以看到,我們使用ulimit限定最大文件大小爲100個blocks,超過限制大小則會被拒絕寫入。其他選項我們將不一一驗證了。

  然而,這裏有一點需要特別注意的是:ulimit 作爲對資源使用限制的一種工作,是有其作用範圍的。那麼,它限制的對象是單個用戶,單個進程,還是整個系統呢?事實上,ulimit 限制的是當前 shell 進程以及其派生的子進程。舉例來說,如果用戶同時運行了兩個 shell 終端進程,只在其中一個環境中執行了 ulimit -s 100,則該 shell 進程裏創建文件的大小收到相應的限制,而同時另一個 shell 終端包括其上運行的子程序都不會受其影響。

  那麼我們怎麼實施ulimit的限制呢?

  1、針對當前會話

    在當前shell環境中執行即可。

  2、針對某個用戶或全部用戶

    添加至/etc/profile或者~/.bashrc。這裏可以應用在企業中的跳板機,很多運維人員爲了方便常常在跳板機上跑腳本,佔據了大量的CPU、硬盤,增加跳板機的壓力,管理人員就可以通過ulimit來限制用戶對資源的佔用。

  3、通過配置文件

    ulimit的主配置文件爲/etc/security/limits.conf,配置文件目錄爲/etc/security/limits.d,後者定義的選項可以覆蓋前者。

    配置文件的語法爲:<domain> <type> <item> <value>

   domain 表示用戶或者組的名字,還可以使用 * 作爲通配符。Type 可以有兩個值,soft 和 hard。Item 則表示需要限定的資源,可以有很多候選值,如 stack,cpu,nofile 等等,分別表示最大的堆棧大小,佔用的 cpu 時間,以及打開的文件數。通過添加對應的一行描述,則可以產生相應的限制。

wKiom1WwrQ2DRkVOAACmxWSe8J8540.jpg

    

二、在docker中ulimit的限制

  問題描述,在環境centos6.5、docker1.3.2的環境下,原博主遇到這樣的問題:在/etc/profile設置的ulimit配置未能被docker讀取,使用了1024的默認值。這裏主要的原因是如上文紅字部分所說,由ulimit的限制範圍導致。/etc/profile在開機過程中,並未被讀取,導致配置沒有生效。解決方法有多樣,原博主修改了/etc/init.d/functions,這樣在service docker start的過程中,就會將配置讀取進來。當然你也可以通過修改ulimit的配置文件等其他方法來解決。

  進一步分析,docker1.3.2對於不同的系統ulimit的取值方法是不一致,對於centos7、debian等系統有docker的默認值,而對於centos6來說,則繼承自OS。而在docker1.6可以通過啓動參數進行設置了,如:docker run -d --ulimit nofile=20480:40960 nproc=1024:2048。

  這樣也就解決了docker在文件句柄方面的相關疑問。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章