當前位置:
首頁 > 知識 > Linux通過ulimit改善系統性能

Linux通過ulimit改善系統性能

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

ulimit的功能和用法ulimit功能簡述

假設有這樣一種情況,當一台 Linux 主機上同時登陸了 10 個人,在系統資源無限制的情況下,這 10 個用戶同時打開了 500 個文檔,而假設每個文檔的大小有 10M,這時系統的內存資源就會受到巨大的挑戰。而實際應用的環境要比這種假設複雜的多,例如在一個嵌入式開發環境中,各方面的資源都是非常緊缺的,對於開啟文件描述符的數量,分配堆棧的大小,CPU 時間,虛擬內存大小,等等,都有非常嚴格的要求。資源的合理限制和分配。

不僅僅是保證系統可用性的必要條件,也與系統上軟體運行的性能有著密不可分的聯繫。這時,ulimit可以起到很大的作用,它是一種簡單並且有效的實現資源限制的方式。ulimit用於限制shell啟動進程所佔用的資源,支持以下各種類型的限制:所創建的內核文件的大小、進程數據塊的大小、Shell進程創建文件的大小、內存鎖住的大小、常駐內存集的大小、打開文件描述符的數量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數、Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。

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

如何使用ulimit

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

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;限制最大可加鎖內存大小為32Kbytes。

-m: 最大內存大小,以Kbytes為單位。如,ulimit -m unlimited;對最大內存不進行限制。

-n: 可以打開最大文件描述符的數量。如,ulimit -n 128;限制最大可以使用128個文件描述符。

-p: 管道緩衝區的大小,以Kbytes為單位。如,ulimit -p 512;限制管道緩衝區的大小為512Kbytes。

-s: 線程棧大小,以Kbytes為單位。如,如,ulimit -s 512;限制線程棧的大小為512Kbytes。

-t: 最大的CPU佔用時間,以秒為單位。 如,ulimit -t unlimited;對最大的CPU佔用時間不進行限制。

-u: 用戶最大可用的進程數。如,ulimit -u 64;限制用戶最多可以使用64個進程。

-v: 進程最大可用的虛擬內存,如,以Kbytes為單位。如,ulimit -v 200000;限制最大可用的虛擬內存為200000Kbytes。

ulimit使用實例用戶進程的有效範圍

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

Shell 1

Shell 2

那麼,是否有針對某個具體用戶的資源加以限制的方法呢?答案是有的,臨時生效(不限制打開文件大小限制):

或通過修改系統的/etc/security/limits.conf配置文件。該文件不僅能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對限定的一個描述,格式如下:

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

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

使用ulimit限制shell的內存使用

在這一小節里向讀者展示如何使用-d,-m 和-v 選項來對shell所使用的內存進行限制。首先我們來看一下不設置ulimit限制時調用ls命令的情況:

大家可以看到此時的 ls 命令運行正常。下面設置 ulimit:

這裡再溫習一下前面章節里介紹過的這三個選項的含義:

-d:設置數據段的最大值。單位:KB。

-m:設置可以使用的常駐內存的最大值。單位:KB。

-v:設置虛擬內存的最大值。單位:KB。

通過上面的 ulimit 設置我們已經把當前 shell 所能使用的最大內存限制在 1000KB 以下。接下來我們看看這時運行 ls 命令會得到什麼樣的結果:

使用ulimit限制程序所能創建的socket數量

考慮一個現實中的實際需求。對於一個 C/S 模型中的 server 程序來說,它會為多個 client 程序請求創建多個 socket 埠給與響應。如果恰好有大量的 client 同時向 server 發出請求,那麼此時 server 就會需要創建大量的 socket連接。但是在 Linux 下一切資源皆文件,普通文件是文件,磁碟印表機是文件,socket 當然也是文件。在 Linux 下創建一個新的socket 連接,實際上就是創建一個新的文件描述符。而Linux對單進程能打開的文件描述符是有限制的,默認單進程能打開的最大文件數量為1024,。ulimit 並沒有哪個選項直接說是用來限制socket的數量的。但是,我們有-n這個選項,它是用於限制一個進程所能打開的文件描述符的最大值。如下所示(查看某個進程當前打開的文件描述符信息):

因此,我們可以通過使用ulimit -n來限制但進程所能打開的最大文件描述符數量,默認單進程打開的文件描述符為1024,就是代表單個進程只能同時最多只能維持1024甚至更少(因為有其它文件的句柄被打開)。如果開啟4個進程維持用戶鏈接,那麼整個應用能夠同時維持的連接數不會超過4*1024個,也就是說最多只能支持4×1024個用戶在線。可以增大這個設置以便服務能夠維持更多的TCP連接,從而達到限制socket創建的數量。

如果單個進程打開的文件句柄數量超過了系統定義的值,就會提到「too many files open」的錯誤提示。如何知道當前進程打開了多少個文件句柄呢?通過lsof命令可以幫你查看:

上面說明了,7015進程打開了126個文件描述符,你可以通過ps命令看看7015這個進程是什麼服務(這裡都是以我的舉例說明的,你在實驗時要根據自己的進程進行查看,相信你有這個意識)。

修改單進程所能打開的最大文件數

1)ulimit -n 102400

這只是在當前終端有效,退出之後,open files又變為默認值。

2)將ulimit -n 102400寫到/etc/profile中,這樣每次登錄終端時,都會自動執行/etc/profile。

3)令修改open files的數值永久生效,則必須修改配置文件:/etc/security/limits.conf在這個文件後加上:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux資訊速推 的精彩文章:

教你如何在CentOS 6.5下部署Open-Falcon監控系統

TAG:Linux資訊速推 |