Linux系統(tǒng)性能優(yōu)化:七個實戰(zhàn)經(jīng)驗
共 8465字,需瀏覽 17分鐘
·
2024-04-26 08:00
來源公眾號:twt社區(qū)IT社區(qū)
原文鏈接:https://mp.weixin.qq.com/s/Rey0gSnnj-zoAEwE6J-Gjw
1、影響Linux系統(tǒng)性能的因素一般有哪些?
@zhaoxiaoyong081 平安科技 資深工程師:
Linux系統(tǒng)的性能受多個因素的影響。以下是一些常見的影響Linux系統(tǒng)性能的因素:
CPU負(fù)載:CPU的利用率和負(fù)載水平對系統(tǒng)性能有直接影響。高CPU負(fù)載可能導(dǎo)致進(jìn)程響應(yīng)變慢、延遲增加和系統(tǒng)變得不穩(wěn)定。
內(nèi)存使用:內(nèi)存是系統(tǒng)運行的關(guān)鍵資源。當(dāng)系統(tǒng)內(nèi)存不足時,可能會導(dǎo)致進(jìn)程被終止、交換分區(qū)使用過多以及系統(tǒng)性能下降。
磁盤I/O:磁盤I/O性能是影響系統(tǒng)響應(yīng)時間和吞吐量的重要因素。高磁盤I/O負(fù)載可能導(dǎo)致延遲增加、響應(yīng)變慢和系統(tǒng)性能下降。
網(wǎng)絡(luò)負(fù)載:網(wǎng)絡(luò)流量的增加和網(wǎng)絡(luò)延遲會對系統(tǒng)性能產(chǎn)生影響。高網(wǎng)絡(luò)負(fù)載可能導(dǎo)致網(wǎng)絡(luò)延遲增加、響應(yīng)變慢和系統(tǒng)資源競爭。
進(jìn)程調(diào)度:Linux系統(tǒng)使用進(jìn)程調(diào)度器來管理和分配CPU資源。調(diào)度算法的選擇和配置會影響進(jìn)程的優(yōu)先級和執(zhí)行順序,從而影響系統(tǒng)的響應(yīng)能力和負(fù)載均衡。
文件系統(tǒng)性能:文件系統(tǒng)的選擇和配置對磁盤I/O性能有影響。不同的文件系統(tǒng)可能在性能方面有所差異,適當(dāng)?shù)奈募到y(tǒng)選項和調(diào)整可以改善系統(tǒng)性能。
內(nèi)核參數(shù):Linux內(nèi)核有許多可調(diào)整的參數(shù),可以影響系統(tǒng)的性能和行為。例如,TCP/IP參數(shù)、內(nèi)存管理參數(shù)、文件系統(tǒng)緩存等。適當(dāng)?shù)膬?nèi)核參數(shù)調(diào)整可以改善系統(tǒng)的性能和資源利用率。
資源限制和配額:在多用戶環(huán)境中,資源限制和配額的設(shè)置可以控制每個用戶或進(jìn)程可使用的資源量。適當(dāng)?shù)馁Y源管理可以避免某些進(jìn)程耗盡系統(tǒng)資源而導(dǎo)致性能問題。
2、工作中有沒有快速排除故障的辦法?
@zhaoxiaoyong081 平安科技 資深工程師:
1.CPU 性能分析
利用 top、vmstat、pidstat、strace 以及 perf 等幾個最常見的工具,獲取 CPU 性能指標(biāo)后,再結(jié)合進(jìn)程與 CPU 的工作原理,就可以迅速定位出 CPU 性能瓶頸的來源。
比如說,當(dāng)你收到系統(tǒng)的用戶 CPU 使用率過高告警時,從監(jiān)控系統(tǒng)中直接查詢到,導(dǎo)致 CPU 使用率過高的進(jìn)程;然后再登錄到進(jìn)程所在的 Linux 服務(wù)器中,分析該進(jìn)程的行為。你可以使用 strace,查看進(jìn)程的系統(tǒng)調(diào)用匯總;也可以使用 perf 等工具,找出進(jìn)程的熱點函數(shù);甚至還可以使用動態(tài)追蹤的方法,來觀察進(jìn)程的當(dāng)前執(zhí)行過程,直到確定瓶頸的根源。
2.內(nèi)存性能分析
可以通過 free 和 vmstat 輸出的性能指標(biāo),確認(rèn)內(nèi)存瓶頸;然后,再根據(jù)內(nèi)存問題的類型,進(jìn)一步分析內(nèi)存的使用、分配、泄漏以及緩存等,最后找出問題的來源。
比如說,當(dāng)你收到內(nèi)存不足的告警時,首先可以從監(jiān)控系統(tǒng)中。找出占用內(nèi)存最多的幾個進(jìn)程。然后,再根據(jù)這些進(jìn)程的內(nèi)存占用歷史,觀察是否存在內(nèi)存泄漏問題。確定出最可疑的進(jìn)程后,再登錄到進(jìn)程所在的 Linux 服務(wù)器中,分析該進(jìn)程的內(nèi)存空間或者內(nèi)存分配,最后弄清楚進(jìn)程為什么會占用大量內(nèi)存。
3.磁盤和文件系統(tǒng) I/O 性能分析
當(dāng)你使用 iostat ,發(fā)現(xiàn)磁盤 I/O 存在性能瓶頸(比如 I/O 使用率過高、響應(yīng)時間過長或者等待隊列長度突然增大等)后,可以再通過 pidstat、 vmstat 等,確認(rèn) I/O 的來源。接著,再根據(jù)來源的不同,進(jìn)一步分析文件系統(tǒng)和磁盤的使用率、緩存以及進(jìn)程的 I/O 等,從而揪出 I/O 問題的真兇。
比如說,當(dāng)你發(fā)現(xiàn)某塊磁盤的 I/O 使用率為 100% 時,首先可以從監(jiān)控系統(tǒng)中,找出 I/O 最多的進(jìn)程。然后,再登錄到進(jìn)程所在的 Linux 服務(wù)器中,借助 strace、lsof、perf 等工具,分析該進(jìn)程的 I/O 行為。最后,再結(jié)合應(yīng)用程序的原理,找出大量 I/O 的原因。
4.網(wǎng)絡(luò)性能分析
而要分析網(wǎng)絡(luò)的性能,要從這幾個協(xié)議層入手,通過使用率、飽和度以及錯誤數(shù)這幾類性能指標(biāo),觀察是否存在性能問題。比如 :
在鏈路層,可以從網(wǎng)絡(luò)接口的吞吐量、丟包、錯誤以及軟中斷和網(wǎng)絡(luò)功能卸載等角度分析;
在網(wǎng)絡(luò)層,可以從路由、分片、疊加網(wǎng)絡(luò)等角度進(jìn)行分析;
在傳輸層,可以從 TCP、UDP 的協(xié)議原理出發(fā),從連接數(shù)、吞吐量、延遲、重傳等角度進(jìn)行分析;
3、Linux環(huán)境下,怎么排查os中系統(tǒng)負(fù)載過高的原因瓶頸?
@zhaoxiaoyong081 平安科技 資深工程師:
在Linux環(huán)境下排查系統(tǒng)負(fù)載過高的原因和瓶頸,可以采取以下步驟:
使用top或htop命令觀察系統(tǒng)整體負(fù)載情況。查看load average的值,分別表示系統(tǒng)在1分鐘、5分鐘和15分鐘內(nèi)的平均負(fù)載。如果負(fù)載值超過CPU核心數(shù)量的70-80%,表示系統(tǒng)負(fù)載過高。
使用top或htop命令查看CPU占用率。觀察哪些進(jìn)程占用了大量的CPU資源。如果有某個進(jìn)程持續(xù)高CPU占用,可能是引起負(fù)載過高的原因之一。
使用free命令查看系統(tǒng)內(nèi)存使用情況。觀察內(nèi)存的使用量和剩余量。如果內(nèi)存使用量接近或超過物理內(nèi)存容量,可能導(dǎo)致系統(tǒng)開始使用交換空間(swap),進(jìn)而影響系統(tǒng)性能。
使用iotop命令查看磁盤I/O使用情況。觀察磁盤讀寫速率和占用率。如果磁盤I/O負(fù)載過高,可能導(dǎo)致系統(tǒng)響應(yīng)變慢。
使用netstat命令或類似工具查看網(wǎng)絡(luò)連接情況。觀察是否存在大量的網(wǎng)絡(luò)連接或網(wǎng)絡(luò)流量。如果網(wǎng)絡(luò)連接過多或網(wǎng)絡(luò)流量過大,可能影響系統(tǒng)的性能。
檢查日志文件。查看系統(tǒng)日志文件(如/var/log/messages、/var/log/syslog)以及應(yīng)用程序日志,尋找任何異常或錯誤信息,可能有助于確定導(dǎo)致負(fù)載過高的問題。
使用perf或strace等工具進(jìn)行進(jìn)程級別的性能分析。這些工具可以幫助你跟蹤進(jìn)程的系統(tǒng)調(diào)用、函數(shù)調(diào)用和性能瓶頸,進(jìn)一步確定導(dǎo)致負(fù)載過高的具體原因。
檢查系統(tǒng)的配置和參數(shù)設(shè)置。審查相關(guān)的配置文件(如/etc/sysctl.conf、/etc/security/limits.conf)和參數(shù)設(shè)置,確保系統(tǒng)的設(shè)置與實際需求相匹配,并進(jìn)行適當(dāng)?shù)恼{(diào)整。
4、Linux怎么找出占用負(fù)載top5的進(jìn)程及主要瓶頸在哪個資源(CPU or 內(nèi)容 or 磁盤 IO)?
@zhaoxiaoyong081 平安科技 資深工程師:
CPU 使用排名
ps aux --sort=-%cpu | head -n 5
內(nèi)存 使用排名
ps aux --sort=-%mem | head -n 6
IO 使用排名
iotop -oP
@zwz99999 dcits 系統(tǒng)工程師:
查看最占用 CPU 的 10 個進(jìn)程
#ps aux|grep -v USER|sort +2|tail -n 10
查看最占用內(nèi)存的 10 個進(jìn)程
#ps aux|grep -v USER|sort +3|tail -n 10
io
5、Linux的內(nèi)存計算不準(zhǔn)如何解決?
@Acdante HZTYYJ 技術(shù)總監(jiān):
free是執(zhí)行時間的瞬時計數(shù),/proc/memory內(nèi)存是實時變化的。
而且free會把緩存和緩沖區(qū)內(nèi)存都計入使用內(nèi)存,所以會導(dǎo)致看到的可用內(nèi)存少很多。
準(zhǔn)確值的話,建議結(jié)合多種監(jiān)控指標(biāo)和命令手段去持續(xù)觀測內(nèi)存情況。
如:htop 、 nmon 、 syssta、top等,可以結(jié)合運維軟件和平臺,而非站在某個時間點,最好是有一定時間的性能數(shù)據(jù)積累,從整體趨勢和具體問題點位去分析。
內(nèi)存只是一個資源指標(biāo),使用內(nèi)存的調(diào)用才是問題根源。
@zhaoxiaoyong081 平安科技 資深工程師:
在一些情況下,通過ps或top命令查看的內(nèi)存使用累計值與free命令或/proc/meminfo文件中的內(nèi)存統(tǒng)計值之間可能存在較大差異。這可以由以下原因?qū)е拢?/span>
緩存和緩沖區(qū):Linux系統(tǒng)使用緩存和緩沖區(qū)來提高文件系統(tǒng)性能。這些緩存和緩沖區(qū)占用的內(nèi)存會被標(biāo)記為"cached"(緩存)和"buffers"(緩沖區(qū))類型。然而,這些內(nèi)存并不一定是實際被進(jìn)程使用的內(nèi)存,而是被內(nèi)核保留用于提高IO性能。因此,ps或top命令顯示的內(nèi)存使用累計值可能包括了這些緩存和緩沖區(qū),而free命令或/proc/meminfo中的統(tǒng)計值通常不包括它們。
共享內(nèi)存:共享內(nèi)存是一種特殊的內(nèi)存區(qū)域,多個進(jìn)程可以訪問和共享它。ps或top命令顯示的內(nèi)存使用累計值可能會包括共享內(nèi)存的大小,而free命令或/proc/meminfo中的統(tǒng)計值通常不會將其計算在內(nèi)。
內(nèi)存回收:Linux系統(tǒng)具有內(nèi)存回收機制,可以在需要時回收未使用的內(nèi)存。這意味著一些進(jìn)程釋放的內(nèi)存可能不會立即反映在ps或top命令顯示的內(nèi)存使用累計值中。相比之下,free命令或/proc/meminfo中的統(tǒng)計值通常更及時地反映實際的內(nèi)存使用情況。
綜上所述,ps或top命令顯示的內(nèi)存使用累計值和free命令或/proc/meminfo中的內(nèi)存統(tǒng)計值之間的差異通常是由于緩存和緩沖區(qū)、共享內(nèi)存以及內(nèi)存回收等因素造成的。如果你需要更準(zhǔn)確地了解進(jìn)程實際使用的內(nèi)存,建議參考free命令或/proc/meminfo中的統(tǒng)計值,并結(jié)合其他工具和方法進(jìn)行綜合分析
@wenwen123 項目經(jīng)理:
在Linux中,可能會出現(xiàn)內(nèi)存計算不準(zhǔn)確的情況,導(dǎo)致ps、top命令中的內(nèi)存使用累計值與free命令或/proc/meminfo中的內(nèi)存統(tǒng)計值之間存在較大差異。這種差異可能由以下原因?qū)е拢?/span>
共享內(nèi)存:共享內(nèi)存是多個進(jìn)程之間共享的一塊內(nèi)存區(qū)域,用于進(jìn)程間通信。共享內(nèi)存不會被ps、top等工具計算在內(nèi)存使用量中,因為它們只統(tǒng)計進(jìn)程的私有內(nèi)存使用量。因此,如果進(jìn)程使用了大量的共享內(nèi)存,它的內(nèi)存使用量在工具中顯示的數(shù)值可能較低。
緩存和緩沖區(qū):Linux系統(tǒng)會將一部分內(nèi)存用于緩存和緩沖區(qū),以提高文件系統(tǒng)和IO操作的性能。這些緩存和緩沖區(qū)的內(nèi)存在ps、top等工具中被視為可回收的,因此它們通常不計入進(jìn)程的內(nèi)存使用量中。但是,在free命令或/proc/meminfo中,這些緩存和緩沖區(qū)的內(nèi)存會被納入統(tǒng)計。
內(nèi)存回收機制:Linux內(nèi)核具有內(nèi)存回收機制,根據(jù)需要自動回收和分配內(nèi)存。這可能導(dǎo)致在ps、top等工具顯示的內(nèi)存使用量和free命令或/proc/meminfo中的統(tǒng)計值之間存在差異。這種差異通常是正常的,并且Linux會動態(tài)管理內(nèi)存以滿足系統(tǒng)的需求。
針對內(nèi)存計算不準(zhǔn)確的問題,關(guān)注共享內(nèi)存是合理的。共享內(nèi)存的使用可能對進(jìn)程的內(nèi)存使用量造成影響,但不會被ps、top等工具計算在內(nèi)存使用量中。如果需要更準(zhǔn)確地了解進(jìn)程的內(nèi)存使用情況,可以使用專門的工具,如pmap、smem等,這些工具可以提供更詳細(xì)和準(zhǔn)確的內(nèi)存統(tǒng)計信息。
6、Swap現(xiàn)在的應(yīng)用場景還有哪些?
@zhaoxiaoyong081 平安科技 資深工程師:
雖然現(xiàn)代計算機的內(nèi)存容量越來越大,但交換分區(qū)(swap)仍然在某些場景下具有重要的應(yīng)用。以下是一些使用交換分區(qū)的常見場景:
內(nèi)存不足:交換分區(qū)作為內(nèi)存不足時的后備機制,用于將不經(jīng)常使用或暫時不需要的內(nèi)存頁面轉(zhuǎn)移到磁盤上。當(dāng)物理內(nèi)存(RAM)不足以容納所有活動進(jìn)程和數(shù)據(jù)時,交換分區(qū)可以提供額外的虛擬內(nèi)存空間,以避免系統(tǒng)發(fā)生內(nèi)存耗盡錯誤(Out of Memory)。
休眠/睡眠模式:交換分區(qū)在某些操作系統(tǒng)中用于支持休眠(hibernation)或睡眠(suspend)模式。當(dāng)計算機進(jìn)入休眠或睡眠狀態(tài)時,系統(tǒng)的內(nèi)存狀態(tài)會被保存到交換分區(qū)中,以便在喚醒時恢復(fù)到先前的狀態(tài)。
虛擬化環(huán)境:在虛擬化環(huán)境中,交換分區(qū)可以用于虛擬機的內(nèi)存管理。當(dāng)宿主機的物理內(nèi)存不足時,虛擬機的內(nèi)存頁面可以被交換到宿主機的交換分區(qū),以提供額外的內(nèi)存空間。
內(nèi)存回收和頁面置換:交換分區(qū)可以用于內(nèi)存回收和頁面置換算法。當(dāng)操作系統(tǒng)需要釋放物理內(nèi)存以滿足更緊急的需求時,它可以將不活動的內(nèi)存頁面置換到交換分區(qū)中,以便將物理內(nèi)存分配給更重要的任務(wù)或進(jìn)程。
7、在Linux tcp方面有什么調(diào)優(yōu)經(jīng)驗或案例?
@zhanxuechao 數(shù)字研究院 咨詢專家:
centos7-os-init.sh
@zhaoxiaoyong081 平安科技 資深工程師:
TCP 優(yōu)化,分三類情況詳細(xì)說明:
第一類,在請求數(shù)比較大的場景下,你可能會看到大量處于 TIME_WAIT 狀態(tài)的連接,它們會占用大量內(nèi)存和端口資源。這時,我們可以優(yōu)化與 TIME_WAIT 狀態(tài)相關(guān)的內(nèi)核選項,比如采取下面幾種措施。
增大處于 TIME_WAIT 狀態(tài)的連接數(shù)量 net.ipv4.tcp_max_tw_buckets ,并增大連接跟蹤表的大小 net.netfilter.nf_conntrack_max。
減小 net.ipv4.tcp_fin_timeout 和 net.netfilter.nf_conntrack_tcp_timeout_time_wait ,讓系統(tǒng)盡快釋放它們所占用的資源。
開啟端口復(fù)用 net.ipv4.tcp_tw_reuse。這樣,被 TIME_WAIT 狀態(tài)占用的端口,還能用到新建的連接中。
增大本地端口的范圍 net.ipv4.ip_local_port_range 。這樣就可以支持更多連接,提高整體的并發(fā)能力。
增加最大文件描述符的數(shù)量。你可以使用 fs.nr_open 和 fs.file-max ,分別增大進(jìn)程和系統(tǒng)的最大文件描述符數(shù);或在應(yīng)用程序的 systemd 配置文件中,配置 LimitNOFILE ,設(shè)置應(yīng)用程序的最大文件描述符數(shù)。
第二類,為了緩解 SYN FLOOD 等,利用 TCP 協(xié)議特點進(jìn)行攻擊而引發(fā)的性能問題,你可以考慮優(yōu)化與 SYN 狀態(tài)相關(guān)的內(nèi)核選項,比如采取下面幾種措施。
增大 TCP 半連接的最大數(shù)量 net.ipv4.tcp_max_syn_backlog ,或者開啟 TCP SYN Cookies net.ipv4.tcp_syncookies ,來繞開半連接數(shù)量限制的問題(注意,這兩個選項不可同時使用)。
減少 SYN_RECV 狀態(tài)的連接重傳 SYN+ACK 包的次數(shù) net.ipv4.tcp_synack_retries。
第三類,在長連接的場景中,通常使用 Keepalive 來檢測 TCP 連接的狀態(tài),以便對端連接斷開后,可以自動回收。但是,系統(tǒng)默認(rèn)的 Keepalive 探測間隔和重試次數(shù),一般都無法滿足應(yīng)用程序的性能要求。所以,這時候你需要優(yōu)化與 Keepalive 相關(guān)的內(nèi)核選項,比如:
縮短最后一次數(shù)據(jù)包到 Keepalive 探測包的間隔時間 net.ipv4.tcp_keepalive_time;
縮短發(fā)送 Keepalive 探測包的間隔時間 net.ipv4.tcp_keepalive_intvl;
減少 Keepalive 探測失敗后,一直到通知應(yīng)用程序前的重試次數(shù) net.ipv4.tcp_keepalive_probes。
總結(jié)
