ulimit 的功能和用法

感謝有奉獻精神的人


轉自:http://www.360doc.com/content/13/0924/10/14006118_316679434.shtml

概述


系統性能一直是一個受關注的話題,如何通過最簡單的設置來實現最有效的性能調優,如何在有限資源的條件下保證程序的運作,ulimit 是我們在處理這些問題時,經常使用的一種簡單手段。ulimit 是一種 linux 系統的內鍵功能,它具有一套參數集,用於爲由它生成的 shell進程及其子進程的資源使用設置限制。本文將在後面的章節中詳細說明 ulimit 的功能,使用以及它的影響,並以具體的例子來詳細地闡述它在限制資源使用方面的影響。ulimit 功能簡述

假設有這樣一種情況,當一臺 Linux 主機上同時登陸了 10 個人,在系統資源無限制的情況下,這 10 個用戶同時打開了 500 個文檔,而假設每個文檔的大小有 10M,這時系統的內存資源就會受到巨大的挑戰。

而實際應用的環境要比這種假設複雜的多,例如在一個嵌入式開發環境中,各方面的資源都是非常緊缺的,對於開啓文件描述符的數量,分配堆棧的大小,CPU 時間,虛擬內存大小,等等,都有非常嚴格的要求。資源的合理限制和分配,不僅僅是保證系統可用性的必要條件,也與系統上軟件運行的性能有着密不可分的聯繫。這時,ulimit 可以起到很大的作用,它是一種簡單並且有效的實現資源限制的方式。

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

作爲臨時限制,ulimit 可以作用於通過使用其命令登錄的 shell 會話,在會話終止時便結束限制,並不影響於其他 shell 會話。而對於長期的固定限制,ulimit 命令語句又可以被添加到由登錄 shell 讀取的文件中,作用於特定的 shell 用戶。(crm www.pmway.com)


圖 1. ulimit 的使用
 

在下面的章節中,將詳細介紹如何使用 ulimit 做相應的資源限制。

如何使用 ulimit

ulimit 通過一些參數選項來管理不同種類的系統資源。在本節,我們將講解這些參數的使用。

ulimit 命令的格式爲:ulimit [options] [limit]

具體的 options 含義以及簡單示例可以參考以下表格。


表 1. ulimit 參數說明

選項 [options]

含義

例子

-H

設置硬資源限制,一旦設置不能增加。

ulimit – Hs 64;限制硬資源,線程棧大小爲 64K

-S

設置軟資源限制,設置後可以增加,但是不能超過硬資源設置。

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

我們可以通過以下幾種方式來使用 ulimit:

  • 在用戶的啓動腳本中

如果用戶使用的是 bash,就可以在用戶的目錄下的 .bashrc 文件中,加入 ulimit – u 64,來限制用戶最多可以使用 64 個進程。此外,可以在與 .bashrc 功能相當的啓動腳本中加入 ulimt。

  • 在應用程序的啓動腳本中

如果用戶要對某個應用程序 myapp 進行限制,可以寫一個簡單的腳本 startmyapp。

ulimit – s 512
myapp

以後只要通過腳本 startmyapp 來啓動應用程序,就可以限制應用程序 myapp 的線程棧大小爲 512K。

  • 直接在控制檯輸入  ulimit – p 256 

·         限制管道的緩衝區爲 256K。

用戶進程的有效範圍

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


Shell 進程 1

ulimit –s 100
cat testFile > newFile
File size limit exceeded

Shell 進程 2

cat testFile > newFile
ls –s newFile
323669 newFile

那麼,是否有針對某個具體用戶的資源加以限制的方法呢?答案是有的,方法是通過修改系統的 /etc/security/limits 配置文件。該文件不僅能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對限定的一個描述,格式如下:(www.huohubaike.com 火狐百科)

<domain> <type> <item> <value> 

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

* hard noflle 100

該行配置語句限定了任意用戶所能創建的最大文件數是 100。

現在已經可以對進程和用戶分別做資源限制了,看似已經足夠了,其實不然。很多應用需要對整個系統的資源使用做一個總的限制,這時候我們需要修改 /proc 下的配置文件。/proc 目錄下包含了很多系統當前狀態的參數,例如 /proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range 等等,從文件的名字大致可以猜出所限制的資源種類。由於該目錄下涉及的文件衆多,在此不一一介紹。有興趣的讀者可打開其中的相關文件查閱說明。



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