国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

linux包之bash之內(nèi)置命令ulimit

2024-06-28 13:26:25
字體:
供稿:網(wǎng)友
linux包之bash之內(nèi)置命令ulimit

概述

[root@localhost ~]# rpm -qa|grep bashbash-4.1.2-15.el6_4.x86_64

linux limits.conf 配置 limits.conf 文件實際是 Linux PAM(插入式認(rèn)證模塊,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,而且只針對于單個會話。

要使 limits.conf 文件配置生效,必須要確保 pam_limits.so 文件被加入到啟動文件中。查看 /etc/pam.d/login 文件中有:session required /lib/security/pam_limits.so

系統(tǒng)性能一直是一個受關(guān)注的話題,如何通過最簡單的設(shè)置來實現(xiàn)最有效的性能調(diào)優(yōu),如何在有限資源的條件下保證程序的運作,ulimit 是我們在處理這些問題時,經(jīng)常使用的一種簡單手段。ulimit 是一種 linux 系統(tǒng)的內(nèi)建功能,它具有一套參數(shù)集,用于為由它生成的 shell 進程及其子進程的資源使用設(shè)置限制。本文將在后面的章節(jié)中詳細(xì)說明 ulimit 的功能,使用以及它的影響,并以具體的例子來詳細(xì)地闡述它在限制資源使用方面的影響。

假設(shè)有這樣一種情況,當(dāng)一臺 Linux 主機上同時登陸了 10 個人,在系統(tǒng)資源無限制的情況下,這 10 個用戶同時打開了 500 個文檔,而假設(shè)每個文檔的大小有 10M,這時系統(tǒng)的內(nèi)存資源就會受到巨大的挑戰(zhàn)。而實際應(yīng)用的環(huán)境要比這種假設(shè)復(fù)雜的多,例如在一個嵌入式開發(fā)環(huán)境中,各方面的資源都是非常緊缺的,對于開啟文件描述符的數(shù)量,分配堆棧的大小,CPU 時間,虛擬內(nèi)存大小,等等,都有非常嚴(yán)格的要求。資源的合理限制和分配,不僅僅是保證系統(tǒng)可用性的必要條件,也與系統(tǒng)上軟件運行的性能有著密不可分的聯(lián)系。這時,ulimit 可以起到很大的作用,它是一種簡單并且有效的實現(xiàn)資源限制的方式。ulimit 用于限制 shell 啟動進程所占用的資源,支持以下各種類型的限制:所創(chuàng)建的內(nèi)核文件的大小、進程數(shù)據(jù)塊的大小、Shell 進程創(chuàng)建文件的大小、內(nèi)存鎖住的大小、常駐內(nèi)存集的大小、打開文件描述符的數(shù)量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數(shù)、Shell 進程所能使用的最大虛擬內(nèi)存。同時,它支持硬資源和軟資源的限制。作為臨時限制,ulimit 可以作用于通過使用其命令登錄的 shell 會話,在會話終止時便結(jié)束限制,并不影響于其他 shell 會話。而對于長期的固定限制,ulimit 命令語句又可以被添加到由登錄 shell 讀取的文件中,作用于特定的 shell 用戶。

解釋

linux下默認(rèn)是不產(chǎn)生core文件的,要用ulimit -c unlimited放開ulimit 通過一些參數(shù)選項來管理不同種類的系統(tǒng)資源。ulimit 命令的格式為:ulimit [options] [limit]

表 1. ulimit 參數(shù)說明

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

樣例:

在用戶的啟動腳本中如果用戶使用的是 bash,就可以在用戶的目錄下的 .bashrc 文件中,加入 ulimit -u 64,來限制用戶最多可以使用 64 個進程。此外,可以在與 .bashrc 功能相當(dāng)?shù)膯幽_本中加入 ulimt。

在應(yīng)用程序的啟動腳本中如果用戶要對某個應(yīng)用程序 myapp 進行限制,可以寫一個簡單的腳本 startmyapp。ulimit -s 512 myapp 以后只要通過腳本 startmyapp 來啟動應(yīng)用程序,就可以限制應(yīng)用程序 myapp 的線程棧大小為 512K。

直接在控制臺輸入user@tc511-ui:~>ulimit -p 256 限制管道的緩沖區(qū)為 256K。

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

那么,是否有針對某個具體用戶的資源加以限制的方法呢?答案是有的,方法是通過修改系統(tǒng)的 /etc/security/limits 配置文件。該文件不僅能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對限定的一個描述,格式如下:<domain> <type> <item> <value> domain 表示用戶或者組的名字,還可以使用 * 作為通配符。Type 可以有兩個值,soft 和 hard。Item 則表示需要限定的資源,可以有很多候選值,如 stack,cpu,nofile 等等,分別表示最大的堆棧大小,占用的 cpu 時間,以及打開的文件數(shù)。通過添加對應(yīng)的一行描述,則可以產(chǎn)生相應(yīng)的限制。例如: * hard noflle 100 該行配置語句限定了任意用戶所能創(chuàng)建的最大文件數(shù)是 100。

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

案例:ulimit 提供了在 shell 進程中限制系統(tǒng)資源的功能。本章列舉了一些使用 ulimit 對用戶進程進行限制的例子,詳述了這些限制行為以及對應(yīng)的影響,以此來說明 ulimit 如何對系統(tǒng)資源進行限制,從而達到調(diào)節(jié)系統(tǒng)性能的目的。

使用 ulimit 限制 shell 的內(nèi)存使用在這一小節(jié)里向讀者展示如何使用 -d,-m 和 -v 選項來對 shell 所使用的內(nèi)存進行限制。限制前[root@localhost lianxi]# echo "testwwww" >test[root@localhost lianxi]# ll test -rw-r--r--. 1 root root 9 May 10 10:21 test限制后[root@localhost lianxi]# ulimit -d 1000 -m 1000 -v 1000[root@localhost lianxi]# ll testSegmentation fault以上是在centos6.5-64位上運行的,與其它版本的報錯信息可能不一致

通過上面的 ulimit 設(shè)置我們已經(jīng)把當(dāng)前 shell 所能使用的最大內(nèi)存限制在 1000KB 以下從上面的結(jié)果可以看到,此時 ls 運行失敗。根據(jù)系統(tǒng)給出的錯誤信息我們可以看出是由于調(diào)用 libc 庫時內(nèi)存分配失敗而導(dǎo)致的 ls 出錯。那么我們來看一下這個 libc 庫文件到底有多大:從上面的信息可以看出,這個 libc 庫文件的大小是 1.5MB。而我們用 ulimit 所設(shè)置的內(nèi)存使用上限是 1000KB,小于 1.5MB,這也就充分證明了 ulimit 所起到的限制 shell 內(nèi)存使用的功能。

使用 ulimit 限制 shell 創(chuàng)建的文件的大小接下來向讀者展示如何使用 -f 選項來對 shell 所能創(chuàng)建的文件大小進行限制。限制前可以創(chuàng)建任何大小的文件[root@localhost lianxi]# cp win2k3_r2_ent_sp1_cd2.iso test1[root@localhost lianxi]# lltotal 273980-rw-r--r--. 1 root root 9 May 10 10:21 test-rw-r--r--. 1 root root 140273664 May 10 10:38 test1-rw-r--r--. 1 root root 140273664 Jul 31 2006 win2k3_r2_ent_sp1_cd2.iso限制后[root@localhost lianxi]# ulimit -f 100000[root@localhost lianxi]# cp win2k3_r2_ent_sp1_cd2.iso test3File size limit exceeded

使用 ulimit 限制程序所能創(chuàng)建的 socket 數(shù)量考慮一個現(xiàn)實中的實際需求。對于一個 C/S 模型中的 server 程序來說,它會為多個 client 程序請求創(chuàng)建多個 socket 端口給與響應(yīng)。如果恰好有大量的 client 同時向 server 發(fā)出請求,那么此時 server 就會需要創(chuàng)建大量的 socket 連接。但在一個系統(tǒng)當(dāng)中,往往需要限制單個 server 程序所能使用的最大 socket 數(shù),以供其他的 server 程序所使用。那么我們?nèi)绾蝸碜龅竭@一點呢?答案是我們可以通過 ulimit 來實現(xiàn)!細(xì)心的讀者可能會發(fā)現(xiàn),通過前面章節(jié)的介紹似乎沒有限制 socket 使用的 ulimit 選項。是的,ulimit 并沒有哪個選項直接說是用來限制 socket 的數(shù)量的。但是,我們有 -n 這個選項,它是用于限制一個進程所能打開的文件描述符的最大值。在 Linux 下一切資源皆文件,普通文件是文件,磁盤打印機是文件,socket 當(dāng)然也是文件。在 Linux 下創(chuàng)建一個新的 socket 連接,實際上就是創(chuàng)建一個新的文件描述符。

776 ? 00:00:00 rsyslogd[root@localhost fd]# cd /proc/776/fd[root@localhost fd]# lltotal 0lrwx------. 1 root root 64 May 10 10:53 0 -> socket:[10173]l-wx------. 1 root root 64 May 10 10:53 1 -> /var/log/securel-wx------. 1 root root 64 May 10 10:53 2 -> /var/log/mailloglr-x------. 1 root root 64 May 10 10:53 3 -> /proc/kmsgl-wx------. 1 root root 64 May 10 10:53 4 -> /var/log/messagesl-wx------. 1 root root 64 May 10 10:53 5 -> /var/log/cron

840 ? 00:00:00 sshd[root@localhost fd]# cd /proc/840/fd[root@localhost fd]# lltotal 0lrwx------. 1 root root 64 May 10 10:53 0 -> /dev/nulllrwx------. 1 root root 64 May 10 10:53 1 -> /dev/nulllrwx------. 1 root root 64 May 10 10:53 2 -> /dev/nulllrwx------. 1 root root 64 May 10 10:53 3 -> socket:[10348]lrwx------. 1 root root 64 May 10 10:53 4 -> socket:[10352]

因此,我們可以通過使用 ulimit -n 來限制程序所能打開的最大文件描述符數(shù)量,從而達到限制 socket 創(chuàng)建的數(shù)量。

使用 ulimit 限制 shell 多線程程序堆棧的大小(增加可用線程數(shù)量)在最后一個例子中,向大家介紹如何使用 -s(單位 KB)來對線程的堆棧大小進行限制,從而減少整個多線程程序的內(nèi)存使用,增加可用線程的數(shù)量。這個例子取自于一個真實的案例。我們所遇到的問題是系統(tǒng)對我們的多線程程序有如下的限制:# ulimit -v 200000根據(jù)本文前面的介紹,這意味著我們的程序最多只能使用不到 200MB 的虛擬內(nèi)存。由于我們的程序是一個多線程程序,程序在運行時會根據(jù)需要創(chuàng)建新的線程,這勢必會增加總的內(nèi)存需求量。一開始我們對堆棧大小的限制是 1024 (本例子中使用 1232 來說明):# ulimit -s 1232當(dāng)我們的程序啟動后,通過 pmap 來查看其內(nèi)存使用情況,可以看到多個占用 1232KB 的數(shù)據(jù)段,這些就是程序所創(chuàng)建的線程所使用的堆棧:# pmap -x pid每當(dāng)一個新的線程被創(chuàng)建時都需要新分配一段大小為 1232KB 的內(nèi)存空間,而我們總的虛擬內(nèi)存限制是 200MB,所以如果我們需要創(chuàng)建更多的線程,那么一個可以改進的方法就是減少每個線程的固定堆棧大小,這可以通過 ulimit -s 來實現(xiàn):# ulimit -s 512 我們將堆棧大小設(shè)置為 512KB,這時再通過 pmap 查看一下我們的設(shè)置是否起作用:# pmap -x pid從上面的信息可以看出,我們已經(jīng)成功的將線程的堆棧大小改為 512KB 了,這樣在總內(nèi)存使用限制不變的情況下,我們可以通過本小節(jié)介紹的方法來增加可以創(chuàng)建的線程數(shù),從而達到改善程序的多線程性能。

綜上所述,linux 系統(tǒng)中的 ulimit 指令,對資源限制和系統(tǒng)性能優(yōu)化提供了一條便捷的途徑。從用戶的 shell 啟動腳本,應(yīng)用程序啟動腳本,以及直接在控制臺,都可以通過該指令限制系統(tǒng)資源的使用,包括所創(chuàng)建的內(nèi)核文件的大小、進程數(shù)據(jù)塊的大小、Shell 進程創(chuàng)建文件的大小、內(nèi)存鎖住的大小、常駐內(nèi)存集的大小、打開文件描述符的數(shù)量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數(shù)、Shell 進程所能使用的最大虛擬內(nèi)存,等等方面。本文中的示例非常直觀的說明了 ulimit 的使用及其產(chǎn)生的效果,顯而易見,ulimit 對我們在 Linux 平臺的應(yīng)用和開發(fā)工作是非常實用的。

840 ? 00:00:00 sshd[root@localhost fd]# pmap -x 840

[root@localhost ~]# ulimit -a顯示所有已設(shè)值

修改/etc/profile文件,加入:  ulimit -u 10240  ulimit -n 4096  ulimit -d unlimited  ulimit -m unlimited  ulimit -s unlimited  ulimit -t unlimited  ulimit -v unlimited

永久性改變 解除 Linux 系統(tǒng)的最大進程數(shù)和最大文件打開數(shù)限制: vi /etc/security/limits.conf # 添加如下的行 * soft noproc 11000 #軟連接 * hard noproc 11000 #硬連接 * soft nofile 4100 * hard nofile 4100 說明:* 代表針對所有用戶,noproc 是代表最大進程數(shù),nofile 是代表最大文件打開數(shù)

-bash:fork:Resource temporarily unavailable的問題出現(xiàn)這個問題的原因是linux用戶的連接數(shù)設(shè)置的太小,只要修改max user processes就可以

open files (-n) 65536需要修改 (因為是tcp協(xié)議 要打開套接字,要打開文件句柄,而單進程的最大打開文件句柄操作系統(tǒng)是有限制的,默認(rèn)是1024)

最近在Linux服務(wù)器上發(fā)布應(yīng)用時碰到一個如下的異常:Caused by: java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:640)初看可能會認(rèn)為是系統(tǒng)的內(nèi)存不足,如果這樣想的話就被這段提示帶到溝里面去了。上面這段錯誤提示的本質(zhì)是Linux操作系統(tǒng)無法創(chuàng)建更多進程,導(dǎo)致出錯。因此要解決這個問題需要修改Linux允許創(chuàng)建更多的進程。正確的做法是修改/etc/security/limit.conf文件或limits.d目錄中添加相應(yīng)的限制,而非什么都往/etc/profile里添加當(dāng)前session臨時生效,重新登錄失效ulimit -u 先查看ulimit -u 10240 再修改ulimit -u與ulimit -a都可以查看 修改/etc/security/limits.d/90-nproc.conf文件中的值,永久生效不管是在limit.conf里還是90-nproc.conf里如果都不設(shè)置默認(rèn)顯示3788如果要設(shè)置要用hard,用soft好像沒有效果。* soft nproc 4096

下面的兩篇文章非常重要,對認(rèn)識ulimit,網(wǎng)上其它文章都沒有太大價值,全一樣。

http://coolnull.com/2800.html

http://blog.yufeng.info/archives/2568


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广灵县| 新沂市| 迭部县| 仪征市| 繁峙县| 山西省| 广东省| 阜宁县| 隆德县| 滦平县| 六枝特区| 商都县| 新野县| 神农架林区| 双牌县| 孟州市| 河南省| 白城市| 澄城县| 阳新县| 黄骅市| 谷城县| 翼城县| 北碚区| 镶黄旗| 饶河县| 涞水县| 汝州市| 天门市| 双牌县| 新田县| 连平县| 莱阳市| 隆子县| 吴旗县| 富裕县| 崇仁县| 九龙坡区| 高清| 永定县| 留坝县|