linux ll 文件大小單位_該如何改善 Linux 系統性能?

7f84cabd31fe4c79a48cf5c0fb807fdf.png

系統性能一直是一個受關注的話題,如何通過最簡單的設置來實現最有效的性能調優,如何在有限資源的條件下保證程序的運作,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命令的格式為:

$?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 作為對資源使用限制的一種工作,是有其作用范圍的。那么,它限制的對象是單個用戶,單個進程,還是整個系統呢?事實上,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等等,從文件的名字大致可以猜出所限制的資源種類。由于該目錄下涉及的文件眾多,在此不一一介紹。有興趣的讀者可打開其中的相關文件查閱說明。

使用ulimit限制shell的內存使用

在這一小節里向讀者展示如何使用-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)
使用ulimit限制程序所能創建的socket數量

考慮一個現實中的實際需求。對于一個 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

5月在線免費訓練營今日開講啦!5天運維技術免費學,掃碼搶免費聽課名額

?

afd8c4e1bbc7d36f2c6645a25d7a510e.png

如有疑問,速尋達妹微信:zdzc3087880280;達妹QQ:3535503962。

精彩推薦:

  • 拿到認證就獎勵1萬!這個證對運維來說有多重要?

  • 驚喜!華為認證和紅帽認證證書可抵扣個人所得稅!

  • 什么是紅帽認證?運維拿紅帽認證有何優勢?

  • 達內教育面向全國用戶提供免費課程!(文中申請)

15f0c05a90d8103c30d9f3dda7e03ecc.png

ec10f0dd2c1ecc6a516aaf1e27e43e0f.gif點擊“

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入Javascript中apply、call、bind

最近在看一下node package的源碼,發現很多里面都包含了function這個對象的apply、call、bind這三個方法,于是想拿出來再看看。。 apply、call 在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(context&#x…

優秀案例!教您如何設計現代簡約風格網頁

我們看到越來越多的設計師開始擁抱簡約的網站設計方法,消除網站不必要的元素,保留真正重要的內容,干凈、直觀的設計,就像今天的我們將展示的這些網站。 下面是一組不同風格的簡約設計的網站例子,美麗的導航、整潔的菜單…

怎么清理mysql的死鏈接_什么是死鏈接?如何正確處理死鏈接

什么是死鏈接?我們應該如何正確處理死鏈接呢?小剛SEO為你解答。什么是死鏈接?因鏈接更改或搜索引擎所收錄的網站路徑被刪除了,形成沒法打開的死鏈接。死鏈接的危害:1.死鏈數據過多時,對網站訪問體驗和用戶轉…

數據分頁和使用存儲過程的數據分頁

--使用存儲過程的數據分頁 --pageSize 一頁有多少條 --pageIndex 第幾頁 --totalCount 總共有多少條 --分頁的第一種方法 select top(10) * from Ams_Area where ar_id not in ( Select top(0) ar_id from Ams_Area order by ar_id ) order by ar_id --分頁的第二種方…

mysql generaton_Mysql 集成隨機唯一id mysql unique number generation

一句代碼:SELECT FLOOR(10000 RAND() * 89999) AS random_numberFROM table1WHERE "random_number" NOT IN (SELECT unique_id FROM table2)LIMIT 1隨機生成5位數字,并且不重復。上面的代碼真是給人無限的聯想力。例如:function g…

NavMeshAgent 動態加載障礙物

如果你想讓游戲人物繞開一些物體, 這些物體動態生成出來的.只需要給物體添加NavMeshObstacle組件即可 1. 綠色方塊添加NavMeshObstacle組件 2. 紅色方塊沒有添加NavMeshObstacle組件,被小球穿透了%>_<% 轉載于:https://www.cnblogs.com/plateFace/p/4385629.html

多任務 schedule python_Python3.6 Schedule 模塊定時任務 (實例講解)

Python3.6 Schedule 模塊定時任務 (實例講解)Python 是一種面向對象解釋型計算機程序設計語言, 由 Guido van Rossum 于 1989 年底發明, 第一個公開發行版發行于 1991 年 Python 語法簡潔而清晰, 具有豐富和強大的類庫它常被昵稱為膠水語言, 它能夠把用其他語言制作的各種模塊 …

UVa 11468 (AC自動機 概率DP) Substring

將K個模板串構成一個AC自動機&#xff0c;那些能匹配到的單詞節點都稱之為禁止節點。 然后問題就變成了在Tire樹上走L步且不經過禁止節點的概率。 根據全概率公式用記憶化搜索求解。 1 #include <cstdio>2 #include <cstring>3 #include <queue>4 using name…

mysql 檢查點_my05_mysql檢查點簡述

簡單描述一下mysql 檢查點&#xff0c;對mysql數據庫恢復的理解有所幫助。數據庫版本mysql> selectversion();-----------| version() |-----------| 8.0.11 |-----------1 row in set (0.00 sec)檢查點查看mysql>show engine innodb status\G;---LOG---Log sequence num…

VS2010無法執行自動化測試解決方案

在實際的工作過程中&#xff0c;當你發現你的VS2010無法執行自動化測試用例&#xff0c;剛好你發現你的電腦安裝有VS2012&#xff0c;那么好了&#xff0c;請卸載你的VS2012再試試...轉載于:https://www.cnblogs.com/captainR/p/3566751.html

停止Hadoop或HBase集群的腳本

#!/bin/sh #echo "waring" #read NAME #等待用戶輸入并把輸入的值付給NAME NAME$1 #將腳本第一個參數賦給NAME #引用變量時加上"{}",是個好習慣,利于shell辨別變量邊界 if [ -z ${NAME} ] ; then #執行腳本沒有輸入參數,默認關閉hadoopstop-all.sh elif [ …

css 偽元素分享!!!

最近接觸到的css 偽元素覺得還算不錯 分享下&#xff1a; 1、清楚內盒浮動設置&#xff1a; .back_list ul{padding:12px 0 0 12px;zoom:1;} .back_list ul:after{clear: both;content: ".";display: block;height: 0;visibility: hidden;}/*清楚內盒浮動設置*/ 2、偽…

公鑰和私鑰 java_公鑰與私鑰 - yxhxj2006 - BlogJava

評論# re: 公鑰與私鑰 [未登錄]2014-01-08 17:43workeruseful for me 回復 更多評論# re: 公鑰與私鑰2014-04-18 11:05Eva特別棒&#xff01; 謝謝&#xff01;worker回復 更多評論# re: 公鑰與私鑰 [未登錄]2014-06-11 17:10mike# re: 公鑰與私鑰2014-11-10 17:05游客太有用…

zepto學習之路--源代碼提取

最近在看zepto的源代碼&#xff0c;把一些有用的函數摘出來&#xff0c;看看zepto是怎么實現的&#xff0c;自己做的時候也可以用。說實話&#xff0c;zepto的實現有一些看起來還是很晦澀的&#xff0c;可能是自己的水平不夠&#xff0c;看不透作者的真正的意圖。 1、zepto的正…

java byte 整數_java整數與byte數組的轉換實現代碼

java整數與byte數組的轉換實現代碼這里對java中整數與byte數組的轉換進行了實現&#xff0c;平時的項目中很少用的到&#xff0c;但是特定需求的時候還是需要的&#xff0c;這里就記錄下&#xff0c;親測可用&#xff0c;實現代碼&#xff1a;public class NumberUtil {/*** in…

藍橋杯 花朵數

一個N位的十進制正整數&#xff0c;如果它的每個位上的數字的N次方的和等于這個數本身&#xff0c;則稱其為花朵數。 例如&#xff1a; 當N3時&#xff0c;153就滿足條件&#xff0c;因為 1^3 5^3 3^3 153&#xff0c;這樣的數字也被稱為水仙花數&#xff08;其中&#xff0…

windows 2003添加刪除windows組件中無iis應用程序服務器項的解決方法

解決方法如下: 1.開始 -- 運行,輸入 c:\Windows\inf\sysoc.inf,會打開這個文件;在sysoc.inf中找到"[Components]"這一段,并繼續找到類 似"iisiis.dll,OcEntry,iis.inf,hide,7" 的一行字,把這一行替換為"iisiis.dll,OcEntry,iis.inf,,7"。如果已經…

java打印菱形代碼_Java打印菱形高效簡潔代碼

importjava.util.Scanner;publicclass打印菱形{publicstaticvoidmain(String[]args){/**菱形**************************/ScannerinputScannernewScanner(System.in);System.out.prin...import java.util.Scanner;public class 打印菱形 {public static void main(String[] arg…

QT mainwindow四件套

最近在學習QT。下面總結一下mainwindow的設置步驟。 使用的平臺為vs2013qt5.3.2qt-vs-addin1.2.3 1)安裝軟件 首先安裝vs2013&#xff0c;這個不多介紹。 然后安裝qt5.3.2和addin1.2.3。并設置相關環境。詳細見http://tieba.baidu.com/p/3451630520?pid61264366864#6126436686…

go mysql recover_golang用panic和recover做業務流程中斷的嘗試

隨著使用golang越來越頻繁&#xff0c;發現golang有一個地方非常不方便&#xff0c;就是在錯誤處理方面。先來看看golang中通常的錯誤處理方法&#xff1a;通常的error處理package mainimport ("errors""fmt")func a() (err error) {err errors.New("…