您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Linux下如何使用ulimit提高系統(tǒng)性能”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux下如何使用ulimit提高系統(tǒng)性能”這篇文章吧。
Linux對(duì)于每個(gè)用戶,系統(tǒng)限制其最大進(jìn)程數(shù)。為提高性能,可以根據(jù)設(shè)備資源情況,設(shè)置各linux用戶的最大進(jìn)程數(shù),我們可以用ulimit來顯示當(dāng)前的各種用戶進(jìn)程限制,ulimit為shell內(nèi)建命令,可用來控制shell執(zhí)行程序的資源。
ulimit通過一些參數(shù)選項(xiàng)來管理不同種類的系統(tǒng)資源。在本節(jié),我們將講解這些參數(shù)的使用。
ulimit命令的格式為:
$ ulimit [options] [limit] [options] -H: 設(shè)置硬資源限制,一旦設(shè)置不能增加。如,ulimit -Hs 64;限制硬資源,線程棧大小為64K。 -S: 設(shè)置軟資源限制,設(shè)置后可以增加,但是不能超過硬資源設(shè)置。如,ulimit -Sn 32;限制軟資源,32個(gè)文件描述符。 -a: 顯示當(dāng)前所有的limit信息。如,ulimit -a;顯示當(dāng)前所有的limit信息。 -c: 最大的core文件的大小, 以blocks為單位。如,ulimit -c unlimited;對(duì)生成的core文件的大小不進(jìn)行限制。 -d: 進(jìn)程最大的數(shù)據(jù)段的大小,以Kbytes為單位。如,ulimit -d unlimited;對(duì)進(jìn)程的數(shù)據(jù)段大小不進(jìn)行限制。 -f: 進(jìn)程可以創(chuàng)建文件的最大值,以 blocks 為單位。如,ulimit -f 2048;限制進(jìn)程可以創(chuàng)建的最大文件大小為2048 blocks。 -l: 最大可加鎖內(nèi)存大小,以Kbytes為單位。如,ulimit -l 32;限制最大可加鎖內(nèi)存大小為32Kbytes。 -m: 最大內(nèi)存大小,以Kbytes為單位。如,ulimit -m unlimited;對(duì)最大內(nèi)存不進(jìn)行限制。 -n: 可以打開最大文件描述符的數(shù)量。如,ulimit -n 128;限制最大可以使用128個(gè)文件描述符。 -p: 管道緩沖區(qū)的大小,以Kbytes為單位。如,ulimit -p 512;限制管道緩沖區(qū)的大小為512Kbytes。 -s: 線程棧大小,以Kbytes為單位。如,如,ulimit -s 512;限制線程棧的大小為512Kbytes。 -t: 最大的CPU占用時(shí)間,以秒為單位。 如,ulimit -t unlimited;對(duì)最大的CPU占用時(shí)間不進(jìn)行限制。 -u: 用戶最大可用的進(jìn)程數(shù)。如,ulimit -u 64;限制用戶最多可以使用64個(gè)進(jìn)程。 -v: 進(jìn)程最大可用的虛擬內(nèi)存,如,以Kbytes為單位。如,ulimit -v 200000;限制最大可用的虛擬內(nèi)存為200000Kbytes。
ulimit 作為對(duì)資源使用限制的一種工作,是有其作用范圍的。那么,它限制的對(duì)象是單個(gè)用戶,單個(gè)進(jìn)程,還是整個(gè)系統(tǒng)呢?事實(shí)上,ulimit 限制的是當(dāng)前 shell 進(jìn)程以及其派生的子進(jìn)程。舉例來說,如果用戶同時(shí)運(yùn)行了兩個(gè) shell 終端進(jìn)程,只在其中一個(gè)環(huán)境中執(zhí)行了 ulimit -s 100,則該 shell 進(jìn)程里創(chuàng)建文件的大小收到相應(yīng)的限制,而同時(shí)另一個(gè) shell 終端包括其上運(yùn)行的子程序都不會(huì)受其影響。
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
那么,是否有針對(duì)某個(gè)具體用戶的資源加以限制的方法呢?答案是有的,臨時(shí)生效(不限制打開文件大小限制):
$ ulimit -f unlimited
或通過修改系統(tǒng)的/etc/security/limits.conf配置文件。該文件不僅能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對(duì)限定的一個(gè)描述,格式如下:
domain 表示用戶或者組的名字,還可以使用 * 作為通配符。Type 可以有兩個(gè)值,soft 和 hard。Item 則表示需要限定的資源,可以有很多候選值,如 stack,cpu,nofile 等等,分別表示最大的堆棧大小,占用的 cpu 時(shí)間,以及打開的文件數(shù)。通過添加對(duì)應(yīng)的一行描述,則可以產(chǎn)生相應(yīng)的限制。例如:
* hard noflle 100
該行配置語句限定了任意用戶所能創(chuàng)建的最大文件數(shù)是 100?,F(xiàn)在已經(jīng)可以對(duì)進(jìn)程和用戶分別做資源限制了,看似已經(jīng)足夠了,其實(shí)不然。很多應(yīng)用需要對(duì)整個(gè)系統(tǒng)的資源使用做一個(gè)總的限制,這時(shí)候我們需要修改/proc下的配置文件。/proc目錄下包含了很多系統(tǒng)當(dāng)前狀態(tài)的參數(shù),例如/proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range等等,從文件的名字大致可以猜出所限制的資源種類。由于該目錄下涉及的文件眾多,在此不一一介紹。有興趣的讀者可打開其中的相關(guān)文件查閱說明。
在這一小節(jié)里向讀者展示如何使用-d,-m 和-v 選項(xiàng)來對(duì)shell所使用的內(nèi)存進(jìn)行限制。首先我們來看一下不設(shè)置ulimit限制時(shí)調(diào)用ls命令的情況:
$ ll shell1 -l -rw-r--r--. 1 root root 227690 4月 23 09:16 shell1
大家可以看到此時(shí)的 ls 命令運(yùn)行正常。下面設(shè)置 ulimit:
$ ulimit -d 1000 -m 1000 -v 1000 這里再溫習(xí)一下前面章節(jié)里介紹過的這三個(gè)選項(xiàng)的含義: -d:設(shè)置數(shù)據(jù)段的最大值。單位:KB。 -m:設(shè)置可以使用的常駐內(nèi)存的最大值。單位:KB。 -v:設(shè)置虛擬內(nèi)存的最大值。單位:KB。
通過上面的 ulimit 設(shè)置我們已經(jīng)把當(dāng)前 shell 所能使用的最大內(nèi)存限制在 1000KB 以下。接下來我們看看這時(shí)運(yùn)行 ls 命令會(huì)得到什么樣的結(jié)果:
$ ll shell1 -l Segmentation fault (core dumped)
考慮一個(gè)現(xiàn)實(shí)中的實(shí)際需求。對(duì)于一個(gè) C/S 模型中的 server 程序來說,它會(huì)為多個(gè) client 程序請(qǐng)求創(chuàng)建多個(gè) socket 端口給與響應(yīng)。如果恰好有大量的 client 同時(shí)向 server 發(fā)出請(qǐng)求,那么此時(shí) server 就會(huì)需要?jiǎng)?chuàng)建大量的 socket連接。但是在 Linux 下一切資源皆文件,普通文件是文件,磁盤打印機(jī)是文件,socket 當(dāng)然也是文件。在 Linux 下創(chuàng)建一個(gè)新的socket 連接,實(shí)際上就是創(chuàng)建一個(gè)新的文件描述符。而Linux對(duì)單進(jìn)程能打開的文件描述符是有限制的,默認(rèn)單進(jìn)程能打開的最大文件數(shù)量為1024,。ulimit 并沒有哪個(gè)選項(xiàng)直接說是用來限制socket的數(shù)量的。但是,我們有-n這個(gè)選項(xiàng),它是用于限制一個(gè)進(jìn)程所能打開的文件描述符的最大值。如下所示(查看某個(gè)進(jìn)程當(dāng)前打開的文件描述符信息):
$ 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來限制但進(jìn)程所能打開的最大文件描述符數(shù)量,默認(rèn)單進(jìn)程打開的文件描述符為1024,就是代表單個(gè)進(jìn)程只能同時(shí)最多只能維持1024甚至更少(因?yàn)橛衅渌募木浔淮蜷_)。如果開啟4個(gè)進(jìn)程維持用戶鏈接,那么整個(gè)應(yīng)用能夠同時(shí)維持的連接數(shù)不會(huì)超過4*1024個(gè),也就是說最多只能支持4×1024個(gè)用戶在線??梢栽龃筮@個(gè)設(shè)置以便服務(wù)能夠維持更多的TCP連接,從而達(dá)到限制socket創(chuàng)建的數(shù)量。
如果單個(gè)進(jìn)程打開的文件句柄數(shù)量超過了系統(tǒng)定義的值,就會(huì)提到“too many files open”的錯(cuò)誤提示。如何知道當(dāng)前進(jìn)程打開了多少個(gè)文件句柄呢?通過lsof命令可以幫你查看:
$ lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr| head -n 2 126 7015 93 1831
上面說明了,7015進(jìn)程打開了126個(gè)文件描述符,你可以通過ps命令看看7015這個(gè)進(jìn)程是什么服務(wù)(這里都是以我的舉例說明的,你在實(shí)驗(yàn)時(shí)要根據(jù)自己的進(jìn)程進(jìn)行查看,相信你有這個(gè)意識(shí))。
修改單進(jìn)程所能打開的最大文件數(shù)
1)ulimit -n 102400
這只是在當(dāng)前終端有效,退出之后,open files又變?yōu)槟J(rèn)值。
2)將ulimit -n 102400寫到/etc/profile中,這樣每次登錄終端時(shí),都會(huì)自動(dòng)執(zhí)行/etc/profile。
3)令修改open files的數(shù)值永久生效,則必須修改配置文件:/etc/security/limits.conf在這個(gè)文件后加上:
* soft nofile 1024000 * hard nofile 1024000 root soft nofile 1024000 root hard nofile 1024000
以上是“Linux下如何使用ulimit提高系統(tǒng)性能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。