您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Linux下如何使用ulimit提高系統性能”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Linux下如何使用ulimit提高系統性能”這篇文章吧。
Linux對于每個用戶,系統限制其最大進程數。為提高性能,可以根據設備資源情況,設置各linux用戶的最大進程數,我們可以用ulimit來顯示當前的各種用戶進程限制,ulimit為shell內建命令,可用來控制shell執行程序的資源。
ulimit通過一些參數選項來管理不同種類的系統資源。在本節,我們將講解這些參數的使用。
ulimit命令的格式為:
$ ulimit [options] [limit] [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 限制的是當前 shell 進程以及其派生的子進程。舉例來說,如果用戶同時運行了兩個 shell 終端進程,只在其中一個環境中執行了 ulimit -s 100,則該 shell 進程里創建文件的大小收到相應的限制,而同時另一個 shell 終端包括其上運行的子程序都不會受其影響。
Shell 1
$ ll -h newfile -rw-r--r--. 1 root root 223K 4月 23 09:16 newfile $ ulimit -f 100 $ cat newfile > shell1 File size limit exceeded (core dumped) $ ll -h shell1 -rw-r--r--. 1 root root 100K 4月 23 09:20 shell1
Shell 2
$ cat newfile > shell2 $ ll -d shell2 -rw-r--r--. 1 root root 227690 4月 23 09:23 shell2 $ ll -h shell2 -rw-r--r--. 1 root root 223K 4月 23 09:23 shell2
那么,是否有針對某個具體用戶的資源加以限制的方法呢?答案是有的,臨時生效(不限制打開文件大小限制):
$ ulimit -f unlimited
或通過修改系統的/etc/security/limits.conf配置文件。該文件不僅能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對限定的一個描述,格式如下:
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等等,從文件的名字大致可以猜出所限制的資源種類。由于該目錄下涉及的文件眾多,在此不一一介紹。有興趣的讀者可打開其中的相關文件查閱說明。
在這一小節里向讀者展示如何使用-d,-m 和-v 選項來對shell所使用的內存進行限制。首先我們來看一下不設置ulimit限制時調用ls命令的情況:
$ ll shell1 -l -rw-r--r--. 1 root root 227690 4月 23 09:16 shell1
大家可以看到此時的 ls 命令運行正常。下面設置 ulimit:
$ ulimit -d 1000 -m 1000 -v 1000 這里再溫習一下前面章節里介紹過的這三個選項的含義: -d:設置數據段的最大值。單位:KB。 -m:設置可以使用的常駐內存的最大值。單位:KB。 -v:設置虛擬內存的最大值。單位:KB。
通過上面的 ulimit 設置我們已經把當前 shell 所能使用的最大內存限制在 1000KB 以下。接下來我們看看這時運行 ls 命令會得到什么樣的結果:
$ ll shell1 -l Segmentation fault (core dumped)
考慮一個現實中的實際需求。對于一個 C/S 模型中的 server 程序來說,它會為多個 client 程序請求創建多個 socket 端口給與響應。如果恰好有大量的 client 同時向 server 發出請求,那么此時 server 就會需要創建大量的 socket連接。但是在 Linux 下一切資源皆文件,普通文件是文件,磁盤打印機是文件,socket 當然也是文件。在 Linux 下創建一個新的socket 連接,實際上就是創建一個新的文件描述符。而Linux對單進程能打開的文件描述符是有限制的,默認單進程能打開的最大文件數量為1024,。ulimit 并沒有哪個選項直接說是用來限制socket的數量的。但是,我們有-n這個選項,它是用于限制一個進程所能打開的文件描述符的最大值。如下所示(查看某個進程當前打開的文件描述符信息):
$ ll /proc/36766/fd 總用量 0 lr-x------. 1 root root 64 4月 23 09:31 0 -> /dev/null l-wx------. 1 root root 64 4月 23 09:31 1 -> /mydata/localhost.localdomain.err lrwx------. 1 root root 64 4月 23 09:31 10 -> /mydata/ib_logfile1 lrwx------. 1 root root 64 4月 23 09:31 11 -> socket:[115703] lrwx------. 1 root root 64 4月 23 09:31 12 -> /tmp/ibLxLFBt (deleted) l-wx------. 1 root root 64 4月 23 09:31 13 -> /mydata/mysql-bin.000001 lrwx------. 1 root root 64 4月 23 09:31 14 -> socket:[115704] lrwx------. 1 root root 64 4月 23 09:31 15 -> /mydata/mysql/host.MYI .......................
因此,我們可以通過使用ulimit -n來限制但進程所能打開的最大文件描述符數量,默認單進程打開的文件描述符為1024,就是代表單個進程只能同時最多只能維持1024甚至更少(因為有其它文件的句柄被打開)。如果開啟4個進程維持用戶鏈接,那么整個應用能夠同時維持的連接數不會超過4*1024個,也就是說最多只能支持4×1024個用戶在線。可以增大這個設置以便服務能夠維持更多的TCP連接,從而達到限制socket創建的數量。
如果單個進程打開的文件句柄數量超過了系統定義的值,就會提到“too many files open”的錯誤提示。如何知道當前進程打開了多少個文件句柄呢?通過lsof命令可以幫你查看:
$ lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr| head -n 2 126 7015 93 1831
上面說明了,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在這個文件后加上:
* soft nofile 1024000 * hard nofile 1024000 root soft nofile 1024000 root hard nofile 1024000
以上是“Linux下如何使用ulimit提高系統性能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。