廣州總校區(qū)切換校區(qū)
復(fù)制成功
微信號(hào):togogoi
添加微信好友, 詳細(xì)了解課程
已復(fù)制成功,如果自動(dòng)跳轉(zhuǎn)微信失敗,請(qǐng)前往微信添加好友
打開微信
圖片

行業(yè)新聞

該如何改善 Linux 系統(tǒng)性能?

發(fā)布時(shí)間: 2020-05-22

  該如何改善 Linux 系統(tǒng)性能?

  系統(tǒng)性能一直是一個(gè)受關(guān)注的話題,如何通過(guò)最簡(jiǎn)單的設(shè)置來(lái)實(shí)現(xiàn)最有效的性能調(diào)優(yōu),如何在有限資源的條件下保證程序的運(yùn)作,ulimit 是我們?cè)谔幚磉@些問(wèn)題時(shí),經(jīng)常使用的一種簡(jiǎn)單手段。ulimit 是一種 linux 系統(tǒng)的內(nèi)鍵功能,它具有一套參數(shù)集,用于為由它生成的 shell 進(jìn)程及其子進(jìn)程的資源使用設(shè)置限制。本文將在后面的章節(jié)中詳細(xì)說(shuō)明 ulimit 的功能,使用以及它的影響,并以具體的例子來(lái)詳細(xì)地闡述它在限制資源使用方面的影響。
  ulimit 的功能和用法
  ulimit功能簡(jiǎn)述
  假設(shè)有這樣一種情況,當(dāng)一臺(tái) Linux 主機(jī)上同時(shí)登陸了 10 個(gè)人,在系統(tǒng)資源無(wú)限制的情況下,這 10 個(gè)用戶同時(shí)打開了 500 個(gè)文檔,而假設(shè)每個(gè)文檔的大小有 10M,這時(shí)系統(tǒng)的內(nèi)存資源就會(huì)受到巨大的挑戰(zhàn)。而實(shí)際應(yīng)用的環(huán)境要比這種假設(shè)復(fù)雜的多,例如在一個(gè)嵌入式開發(fā)環(huán)境中,各方面的資源都是非常緊缺的,對(duì)于開啟文件描述符的數(shù)量,分配堆棧的大小,CPU 時(shí)間,虛擬內(nèi)存大小,等等,都有非常嚴(yán)格的要求。資源的合理限制和分配。
  不僅僅是保證系統(tǒng)可用性的必要條件,也與系統(tǒng)上軟件運(yùn)行的性能有著密不可分的聯(lián)系。這時(shí),ulimit可以起到很大的作用,它是一種簡(jiǎn)單并且有效的實(shí)現(xiàn)資源限制的方式。ulimit用于限制shell啟動(dòng)進(jìn)程所占用的資源,支持以下各種類型的限制:所創(chuàng)建的內(nèi)核文件的大小、進(jìn)程數(shù)據(jù)塊的大小、Shell進(jìn)程創(chuàng)建文件的大小、內(nèi)存鎖住的大小、常駐內(nèi)存集的大小、打開文件描述符的數(shù)量、分配堆棧的較大大小、CPU 時(shí)間、單個(gè)用戶的較大線程數(shù)、Shell 進(jìn)程所能使用的較大虛擬內(nèi)存。同時(shí),它支持硬資源和軟資源的限制。
  作為臨時(shí)限制,ulimit 可以作用于通過(guò)使用其命令登錄的 shell 會(huì)話,在會(huì)話終止時(shí)便結(jié)束限制,并不影響于其他 shell 會(huì)話。而對(duì)于長(zhǎng)期的固定限制,ulimit 命令語(yǔ)句又可以被添加到由登錄 shell 讀取的文件中,作用于特定的 shell 用戶。
  如何使用ulimit
  ulimit通過(guò)一些參數(shù)選項(xiàng)來(lái)管理不同種類的系統(tǒng)資源。在本節(jié),我們將講解這些參數(shù)的使用。
  ulimit命令的格式為:
  $ ulimit [options] [limit]
  [options]
  -H: 設(shè)置硬資源限制,一旦設(shè)置不能增加。如,ulimit -Hs 64;限制硬資源,線程棧大小為64K。
  -S: 設(shè)置軟資源限制,設(shè)置后可以增加,但是不能超過(guò)硬資源設(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 使用實(shí)例
  用戶進(jìn)程的有效范圍
  ulimit 作為對(duì)資源使用限制的一種工作,是有其作用范圍的。那么,它限制的對(duì)象是單個(gè)用戶,單個(gè)進(jìn)程,還是整個(gè)系統(tǒng)呢?事實(shí)上,ulimit 限制的是當(dāng)前 shell 進(jìn)程以及其派生的子進(jìn)程。舉例來(lái)說(shuō),如果用戶同時(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
  或通過(guò)修改系統(tǒng)的/etc/security/limits.conf配置文件。該文件不僅能限制指定用戶的資源使用,還能限制指定組的資源使用。該文件的每一行都是對(duì)限定的一個(gè)描述,格式如下:
  <domain> <type> <item> <value>
  domain 表示用戶或者組的名字,還可以使用 * 作為通配符。Type 可以有兩個(gè)值,soft 和 hard。Item 則表示需要限定的資源,可以有很多候選值,如 stack,cpu,nofile 等等,分別表示較大的堆棧大小,占用的 cpu 時(shí)間,以及打開的文件數(shù)。通過(guò)添加對(duì)應(yīng)的一行描述,則可以產(chǎn)生相應(yīng)的限制。例如:
  * hard noflle 100
  該行配置語(yǔ)句限定了任意用戶所能創(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)文件查閱說(shuō)明。
  使用ulimit限制shell的內(nèi)存使用
  在這一小節(jié)里向讀者展示如何使用-d,-m 和-v 選項(xiàng)來(lái)對(duì)shell所使用的內(nèi)存進(jìn)行限制。首先我們來(lái)看一下不設(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é)里介紹過(guò)的這三個(gè)選項(xiàng)的含義:
  -d:設(shè)置數(shù)據(jù)段的較大值。單位:KB。
  -m:設(shè)置可以使用的常駐內(nèi)存的較大值。單位:KB。
  -v:設(shè)置虛擬內(nèi)存的較大值。單位:KB。
  通過(guò)上面的 ulimit 設(shè)置我們已經(jīng)把當(dāng)前 shell 所能使用的較大內(nèi)存限制在 1000KB 以下。接下來(lái)我們看看這時(shí)運(yùn)行 ls 命令會(huì)得到什么樣的結(jié)果:
  $ ll shell1 -l
  Segmentation fault (core dumped)
  使用ulimit限制程序所能創(chuàng)建的socket數(shù)量
  考慮一個(gè)現(xiàn)實(shí)中的實(shí)際需求。對(duì)于一個(gè) C/S 模型中的 server 程序來(lái)說(shuō),它會(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 并沒(méi)有哪個(gè)選項(xiàng)直接說(shuō)是用來(lái)限制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
  .......................
  因此,我們可以通過(guò)使用ulimit -n來(lái)限制但進(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ì)超過(guò)4*1024個(gè),也就是說(shuō)最多只能支持4×1024個(gè)用戶在線。可以增大這個(gè)設(shè)置以便服務(wù)能夠維持更多的TCP連接,從而達(dá)到限制socket創(chuàng)建的數(shù)量。
  如果單個(gè)進(jìn)程打開的文件句柄數(shù)量超過(guò)了系統(tǒng)定義的值,就會(huì)提到“too many files open”的錯(cuò)誤提示。如何知道當(dāng)前進(jìn)程打開了多少個(gè)文件句柄呢?通過(guò)lsof命令可以幫你查看:
  $ lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr| head -n 2
  126 7015
  93 1831
  上面說(shuō)明了,7015進(jìn)程打開了126個(gè)文件描述符,你可以通過(guò)ps命令看看7015這個(gè)進(jìn)程是什么服務(wù)(這里都是以我的舉例說(shuō)明的,你在實(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

上一篇: 考華為認(rèn)證HCIE大概需要多長(zhǎng)時(shí)間?

下一篇: 快速排查無(wú)線AP故障的十種方法

<
在線咨詢 ×

您好,請(qǐng)問(wèn)有什么可以幫您?我們將竭誠(chéng)提供最優(yōu)質(zhì)服務(wù)!