前言:
Linux服務(wù)器運行了很多應(yīng)用,在高負載下,服務(wù)器可能會出現(xiàn)性能瓶頸,例如CPU利用率過高、內(nèi)存不足、磁盤I/O瓶頸等,從而導(dǎo)致系統(tǒng)卡頓,服務(wù)無法正常運行等問題。所以針對以上問題,可以通過調(diào)整內(nèi)核參數(shù)和系統(tǒng)的相關(guān)組件,優(yōu)化應(yīng)用程序來提高服務(wù)器的性能和穩(wěn)定性,避免系統(tǒng)崩潰和服務(wù)中斷。
Linux系統(tǒng)優(yōu)化考慮的兩個方面:
? 硬件層面:例如加內(nèi)存、換用企業(yè)級SSD、提高帶寬等操作。
? 軟件層面:系統(tǒng)內(nèi)核參數(shù)、硬盤IO以及資源分配方面的配置。
在軟件層面如何進行系統(tǒng)優(yōu)化:
主要從系統(tǒng)內(nèi)核參數(shù)、CPU、IO、網(wǎng)絡(luò)、內(nèi)存這幾個方面來進行優(yōu)化。
? 內(nèi)存調(diào)優(yōu):優(yōu)化系統(tǒng)的內(nèi)存使用效率,減少內(nèi)存泄漏和內(nèi)存碎片等問題。
? 磁盤調(diào)優(yōu):提高磁盤的讀寫速度和可靠性,減少數(shù)據(jù)丟失和損壞的風險。
? CPU調(diào)優(yōu):優(yōu)化CPU的利用率,提高系統(tǒng)的性能和穩(wěn)定性。
? 網(wǎng)絡(luò)調(diào)優(yōu):提高網(wǎng)絡(luò)的性能和穩(wěn)定性,減少數(shù)據(jù)傳輸?shù)难舆t和丟失。
? 進程和線程調(diào)優(yōu):優(yōu)化系統(tǒng)的進程調(diào)度算法、減少進程和線程的競爭等,提高系統(tǒng)的并發(fā)性能和穩(wěn)定性。
系統(tǒng)優(yōu)化的步驟:
1、使用系統(tǒng)監(jiān)控工具、性能測試工具等,收集系統(tǒng)的性能數(shù)據(jù)和指標,了解系統(tǒng)當前的運行狀態(tài),從而識別系統(tǒng)的瓶頸和優(yōu)化空間。
2、使用追蹤工具進行追蹤,定位到具體的應(yīng)用程序和進程。
3、根據(jù)定位到的應(yīng)用程序和進程進行分析,分析導(dǎo)致出問題的原因,從而對內(nèi)存、磁盤、CPU等方面進行優(yōu)化。
系統(tǒng)性能的相關(guān)概念:
IOPS:Input/Output Per Second。是指每秒鐘可以進行的輸入/輸出操作次數(shù),是衡量存儲設(shè)備性能的重要指標之一
吞吐量:Throughput。系統(tǒng)在單位時間內(nèi)能夠處理的事務(wù)數(shù)量。
響應(yīng)時間:Response Time。系統(tǒng)從接收請求到返回結(jié)果所需的時間。
帶寬:Bandwidth。數(shù)據(jù)傳輸?shù)乃俣?,通常以每秒傳輸?shù)谋忍財?shù)(bps)或字節(jié)(Bps)來衡量。
延時:Latency。指從請求發(fā)出到收到響應(yīng)所需的時間。
瓶頸:Bottleneck。操作系統(tǒng)中限制系統(tǒng)性能的關(guān)鍵因素或資源。當系統(tǒng)中某個組件的處理能力達到極限,無法滿足其他組件的需求時,就會出現(xiàn)瓶頸。
工作負載:Workload。是指計算機系統(tǒng)中正在運行的應(yīng)用程序或任務(wù)的集合。
緩存:cache。緩存的作用就是用來提高系統(tǒng)性能的一種技術(shù)。
CPU緩存::CPU緩存是一種硬件設(shè)備,通常是集成在CPU芯片中。CPU緩存分為三個級別,包括L1、L2和L3緩存,這些級別按照緩存大小和訪問速度逐漸遞減。用于存儲CPU需要頻繁訪問的數(shù)據(jù)和指令,以便更快地執(zhí)行計算任務(wù)。CPU緩存速度非常快,通常比內(nèi)存緩存快幾個數(shù)量級,因此能夠大大提高計算機的運行速度。
內(nèi)存緩存:內(nèi)存緩存通常是通過在系統(tǒng)內(nèi)存中劃分出一部分空間來實現(xiàn)的,這部分空間被稱為緩存區(qū)。緩存區(qū)是由操作系統(tǒng)內(nèi)核管理的,它在系統(tǒng)啟動時就被分配出來,并在系統(tǒng)運行期間一直存在。
當應(yīng)用程序需要訪問內(nèi)存中的數(shù)據(jù)時,內(nèi)存緩存會首先檢查緩存區(qū)中是否已經(jīng)緩存了該數(shù)據(jù)。如果已經(jīng)緩存,則可以直接從緩存區(qū)中讀取數(shù)據(jù),從而避免了從內(nèi)存中讀取數(shù)據(jù)的時間和能耗。如果緩存區(qū)中沒有該數(shù)據(jù),則需要從內(nèi)存中讀取,并將數(shù)據(jù)存儲到緩存區(qū)中以供下一次訪問使用。
緩沖:Buffer。緩沖通常是在內(nèi)存中分配一塊空間來實現(xiàn)的,這些空間被稱為緩沖區(qū)。緩沖區(qū)是用于臨時存儲數(shù)據(jù)的區(qū)域,數(shù)據(jù)在這里被暫時保存并等待被進一步處理。
如將數(shù)據(jù)從一個設(shè)備傳輸?shù)搅硪粋€設(shè)備時,緩沖可以暫存數(shù)據(jù),以防止數(shù)據(jù)在傳輸過程中丟失或損壞。因為如果發(fā)送方速度太快,接受方不能及時接收就會導(dǎo)致數(shù)據(jù)丟失。
輸入緩沖區(qū)(Input Buffer):用于存儲輸入設(shè)備(例如鍵盤、鼠標等)發(fā)送過來的數(shù)據(jù),等待系統(tǒng)進一步處理。
輸出緩沖區(qū)(Output Buffer):用于存儲輸出設(shè)備(例如打印機、屏幕等)接受數(shù)據(jù),等待設(shè)備進行處理。
文件緩沖區(qū)(File Buffer):用于存儲文件數(shù)據(jù)的內(nèi)存區(qū)域,通過將文件數(shù)據(jù)緩存到內(nèi)存中,可以減少訪問磁盤的次數(shù),提高文件讀寫的效率。
磁盤緩存(Disk Cache):用于存儲磁盤上的數(shù)據(jù),通過將常用的數(shù)據(jù)緩存到內(nèi)存中,可以加速磁盤訪問,提高系統(tǒng)的性能。
Linux資源信息的監(jiān)控
通過對系統(tǒng)性能參數(shù)的監(jiān)控和收集,了解當前系統(tǒng)的負載、CPU使用情況,內(nèi)存使用、IO等信息。
image
一:查看系統(tǒng)整體的信息:
1、vmstat工具
vmstat是系統(tǒng)自帶的一個工具,vmstat主要查看的是內(nèi)存和進程的使用情況,其它例如進程、系統(tǒng)IO、上下文切換這些信息也可以查看。
例如:
image
procs:顯示進程的活動情況。
r:正在運行的以及處于排隊狀態(tài)的線程數(shù),這個值和進程有關(guān)系,如果值長期大于cpu的核數(shù)(lscpu查看cpu個數(shù)),說明cpu不夠,任務(wù)運行的進程太多。
b:進程阻塞的數(shù)量,阻塞狀態(tài)就是一只處于排隊狀態(tài)。這個值長期大于0就表明cpu資源嚴重不夠了。一直輪不到給你分配cpu
memory:顯示系統(tǒng)的內(nèi)存使用情況。
swap:交換分區(qū)使用了多少。0表示還沒有任何使用,如果已經(jīng)開始使用交換分區(qū)了,說明內(nèi)存已經(jīng)不夠用了
buff:緩沖區(qū)還剩多少 單位為k,一般是往硬盤里面寫的時候會占用這個值。
cache:緩存還剩多少 單位也是k
swap:顯示系統(tǒng)的交換空間使用情況。
說明:si和so只要大于0,說明內(nèi)存有問題了。例如內(nèi)存泄露、內(nèi)存不夠等情況。
si:swap input:硬盤到交換分區(qū)的一個大小。
so:swap output:從交換分區(qū)到硬盤的一個大小。
io:顯示系統(tǒng)的磁盤I/O活動情況。
bi:往硬盤里面寫的一個值
bo:往硬盤里面讀的一個值。單位是k
??說明:如果系統(tǒng)的bi和bo值很大,說明io有問題。
system:顯示系統(tǒng)的CPU使用情況。
in:中斷的數(shù)目,
cs:上下文切換的數(shù)目
??說明:如果系統(tǒng)中存在大量的上下文切換和終端,說明系統(tǒng)可能存在某些問題
cpu:顯示系統(tǒng)的CPU使用率。
us:用戶進程所消耗的時間
sy:系統(tǒng)進程消耗的一個時間
id:系統(tǒng)的空閑時間
wa:硬盤io出現(xiàn)了阻塞,數(shù)據(jù)太多入口被堵死了。但是寫不進去,所以就開始等待。 如果wa這個值比較大說明cpu的資源夠,但是io有問題導(dǎo)致浪費了cpu。
st:在虛擬化的時候會用到。
2、mpstat工具
mpstat工具和vmstat不同點在于mpstat主要監(jiān)視CPU使用情況,包括每個CPU的使用率、上下文切換、中斷和軟中斷等信息。
例如:
image
**CPU:**顯示每個CPU的編號,all表示所有的cpu
%usr:顯示用戶空間進程使用CPU的百分比。
說明:如果%usr較高,表示用戶空間進程占用了大量CPU資源,可能是某個進程出現(xiàn)了問題或者某個進程需要更多的CPU資源。
%nice:顯示優(yōu)先級較低的用戶空間進程使用CPU的百分比。
%sys:顯示內(nèi)核空間進程使用CPU的百分比。
說明:如果%sys較高,表示內(nèi)核空間進程占用了大量CPU資源,可能是某個內(nèi)核模塊出現(xiàn)了問題或者某個進程在等待內(nèi)核資源。
%iowait:顯示CPU等待I/O完成的百分比。
說明:如果%iowait較高,表示CPU正在等待I/O操作完成,可能是磁盤、網(wǎng)絡(luò)或其他I/O設(shè)備出現(xiàn)了瓶頸。
%irq:顯示CPU處理硬件中斷的百分比。
說明:如果%irq較高,表示CPU正在處理大量硬件中斷,可能是某個硬件設(shè)備出現(xiàn)了問題。
%soft:顯示CPU處理軟件中斷的百分比。
說明:如果%soft較高,表示CPU正在處理大量軟件中斷,可能是某個進程出現(xiàn)了問題或者某個內(nèi)核模塊在處理大量請求。
%steal:顯示被虛擬機偷走的CPU時間的百分比。
%guest:顯示虛擬機使用CPU的百分比。
%idle:顯示CPU空閑的百分比。
說明:如果%idle較低,表示CPU正在忙碌,可能是系統(tǒng)負載過高或者某個進程占用了大量CPU資源。
3、iostat工具
iostat主要監(jiān)視磁盤I/O使用情況,包括每個磁盤的讀寫速度、I/O等待時間、I/O請求隊列長度等,主要使用iostat工具來了解系統(tǒng)磁盤I/O使用情況,識別磁盤I/O瓶頸和瓶頸進程。
image
Device:sda1 r/s:458.09 # 表示每秒從設(shè)備中讀取的次數(shù)。 rkB/s:56330.40 # 每秒讀取的數(shù)據(jù)量,單位為KB。 rrqm/s:0.63 # 每秒從磁盤發(fā)出的讀取請求隊列的長度,單位為請求。 %rrqm:0.14 # 表示從磁盤發(fā)出的讀取請求占總讀取請求的百分比。 r_await:4.17 # 表示讀操作的平均等待時間,單位為毫秒。 rareq-sz:122.97 # 平均每個讀取請求的數(shù)據(jù)量,單位為扇區(qū) w/s:67.28 # 表示每秒向設(shè)備中寫入的次數(shù)。 wkB/s:788.53 # 每秒鐘寫的數(shù)量,單位是kb wrqm/s:54.32 # 每秒從磁盤發(fā)出的寫入請求隊列的長度,單位為請求 %wrqm:44.67 # 表示從磁盤發(fā)出的寫入請求占總寫入請求的百分比。 w_await:6.75 # 表示寫操作的平均等待時間,單位為毫秒。 wareq-sz:11.72 # 平均每個寫入請求的數(shù)據(jù)量,單位為扇區(qū) d/s:0.00 dkB/s:0.00 drqm/s :0.00 %drqm:0.00 d_await:0.00 dareq-sz :0.00 aqu-sz :2.37 # 請求隊列的平均長度。 %util:96.96 # 表示磁盤花費在處理請求的時間百分比 經(jīng)常超過80%或90%,則說明磁盤正在高負載下運行
總結(jié):
當r/s和w/s、rkB/s和wkB/s、r_await和w_await等指標的值都很大,并且%util的值也很高時,可以初步判斷磁盤可能存在性能問題。
4、sar工具:
相比于vmstat和pmstat,star工具提供了更全面的系統(tǒng)性能監(jiān)控和歷史數(shù)據(jù)分析功能。可以將輸出的信息重定向到一個文件里面,便于后續(xù)的分析。
(1)查看CPU的使用情況:
image
#%user:用戶空間進程所占用CPU時間的百分比。 #%nice:被nice值提高的用戶空間進程所占用CPU時間的百分比。 #%system:內(nèi)核空間進程所占用CPU時間的百分比。 #%iowait:CPU等待I/O操作完成所占用CPU時間的百分比。 #%steal:被虛擬化程序(如VMware)偷走的CPU時間的百分比。 #%idle:CPU空閑時間的百分比。
? 如果%user和%system占用率較高,可能表示系統(tǒng)負載較高,需要進一步檢查進程、IO等情況。
? 如果%iowait占用率較高,可能表示IO瓶頸
? 如果%idle占用率較高,可能表示系統(tǒng)資源未充分利用
(2)監(jiān)視內(nèi)存使用情況:
image
#kbmemfree:可用內(nèi)存大?。▎挝唬篕B) #kbmemused:已用內(nèi)存大?。▎挝唬篕B) #%memused:已用內(nèi)存占總內(nèi)存的百分比 #kbbuffers:緩存的內(nèi)存大?。▎挝唬篕B) #kbcached:緩存的文件系統(tǒng)緩存大小(單位:KB) #kbcommit:提交內(nèi)存大小(單位:KB) #%commit:提交內(nèi)存占總內(nèi)存的百分比 #kbactive:活躍內(nèi)存大?。▎挝唬篕B) #kbinact:非活躍內(nèi)存大?。▎挝唬篕B) #kbdirty:臟頁的內(nèi)存大小(單位:KB)
? 如果可用內(nèi)存(kbmemfree)較少,已用內(nèi)存(kbmemused)和已用內(nèi)存占總內(nèi)存的百分比(%memused)較高,可能表示內(nèi)存不足
? 如果緩存的內(nèi)存(kbbuffers)和緩存的文件系統(tǒng)緩存(kbcached)較高,可能表示系統(tǒng)的文件系統(tǒng)緩存良好
? 如果提交內(nèi)存(kbcommit)較高,可能表示應(yīng)用程序提交的內(nèi)存較多
? 如果活躍內(nèi)存(kbactive)和非活躍內(nèi)存(kbinact)較高,可能表示系統(tǒng)當前運行的應(yīng)用程序較多
(3)監(jiān)視磁盤I/O使用情況:
image
#tps:每秒傳輸?shù)腎/O請求數(shù)(包括讀寫請求) #rtps:每秒讀請求傳輸?shù)腎/O請求數(shù) #wtps:每秒寫請求傳輸?shù)腎/O請求數(shù) #bread/s:每秒讀取的數(shù)據(jù)塊數(shù)量(單位:512字節(jié)) #bwrtn/s:每秒寫入的數(shù)據(jù)塊數(shù)量(單位:512字節(jié))
? 如果tps較高,可能表示磁盤I/O瓶頸
? 如果rtps或wtps較高,可以進一步確認是讀操作或?qū)懖僮鞯膯栴}
? 如果bread/s或bwrtn/s較高,可能表示磁盤I/O吞吐量不足
(4)查看網(wǎng)絡(luò)的基本信息:DEV
主要查看的是接收和發(fā)送數(shù)據(jù)包的速率、接收和發(fā)送數(shù)據(jù)量的速率
image
#IFACE:網(wǎng)絡(luò)接口名稱。 #rxpck/s:每秒接收的數(shù)據(jù)包數(shù)量。 #txpck/s:每秒發(fā)送的數(shù)據(jù)包數(shù)量。 #rxkB/s:每秒接收的數(shù)據(jù)量(KB)。 #txkB/s:每秒發(fā)送的數(shù)據(jù)量(KB)。 #rxcmp/s:每秒接收的壓縮數(shù)據(jù)包數(shù)量。 #txcmp/s:每秒發(fā)送的壓縮數(shù)據(jù)包數(shù)量。 #rxmcst/s:每秒接收的多播數(shù)據(jù)包數(shù)量。
? 如果rxkB/s和txkB/s非常高,但%ifutil非常低,則可能存在網(wǎng)絡(luò)擁塞的問題
? 如果rxcmp/s和txcmp/s非常高,可能存在數(shù)據(jù)壓縮的問題。
? 如果rxmcst/s非常高,可能存在多播網(wǎng)絡(luò)流量的問題。
數(shù)據(jù)壓縮:為了減少數(shù)據(jù)的傳輸量,可以對數(shù)據(jù)進行壓縮。壓縮的過程是將原始數(shù)據(jù)使用某種壓縮算法進行編碼,使其占用更少的帶寬。
(5)查看網(wǎng)絡(luò)的錯誤信息EDEV
可以查看網(wǎng)絡(luò)設(shè)備的錯誤和丟包數(shù)。
image
#rxerr/s:每秒接收的錯誤數(shù)。 #txerr/s:每秒發(fā)送的錯誤數(shù) #coll/s:每秒發(fā)生的沖突數(shù)。 #rxdrop/s:每秒接收的丟包數(shù) #txdrop/s:每秒發(fā)送的丟包數(shù)。 #txcarr/s:每秒發(fā)生的載波錯誤數(shù)。 #rxfram/s:每秒接收的幀錯誤數(shù)。 #rxfifo/s:每秒鐘由于接收FIFO隊列溢出而丟失的數(shù)據(jù)包數(shù)。 #txfifo/s:每秒鐘由于發(fā)送FIFO隊列溢出而丟失的數(shù)據(jù)包數(shù)。
?rxerr/s或rxdrop/s的值很高,可能存在網(wǎng)絡(luò)中的接收問題,例如硬件故障或網(wǎng)絡(luò)擁塞等。
?txerr/s或txdrop/s的值很高,可能存在網(wǎng)絡(luò)中的發(fā)送問題,例如硬件故障或網(wǎng)絡(luò)擁塞等
?coll/s的值很高,可能存在網(wǎng)絡(luò)中的沖突問題,例如網(wǎng)絡(luò)中存在多個設(shè)備嘗試同時發(fā)送數(shù)據(jù)包/
使用場景總結(jié):
? 需要實時監(jiān)控系統(tǒng)資源,可以使用 vmstat 和 iostat
? 需要對系統(tǒng)歷史性能進行分析,可以使用 sar
? 分布式系統(tǒng)中進行性能分析和監(jiān)控,則可以選擇 pmstat,因為分布式系統(tǒng)的性能監(jiān)控比較復(fù)雜,pmstat的實時監(jiān)控功能更靈活。
? 如果只是想看看系統(tǒng)的狀態(tài),以上工具都可以。
二:查看某個進程的資源占用信息:
1、top
用來實時顯示實時地顯示系統(tǒng)中所有進程的資源占用情況。
在沒有htop工具的情況下查看系統(tǒng)資源的信息。
按下 c 快捷鍵將會顯示進程的完整命令行參數(shù)。
image
在top命令中按下快捷鍵盤’c‘之后。
image
2、ps
主要用來列出系統(tǒng)中所有進程的信息。
例如:運行了某個腳本,查看腳本是否啟動
#運行一個測試腳本 ehigh@ubuntu:~$ bash test.sh & [1] 21738 #查看這個腳本是否正常啟動 ehigh@ubuntu:~$ ps -ef | grep test.sh ehigh 21738 14974 0 11:04 pts/19 0000 bash test.sh
3、htop
ttop 命令的一個增強版,可以實時地顯示系統(tǒng)中所有進程的資源占用情況。
image
4、pidstat
實時地顯示某個進程的 CPU 使用率、內(nèi)存占用等。
5、strace
追蹤某個進程的系統(tǒng)調(diào)用信息,可以捕獲和打印出應(yīng)用程序和內(nèi)核之間發(fā)生的所有系統(tǒng)調(diào)用和信號,包括傳遞的參數(shù)和返回值,以及發(fā)生的錯誤。
例如:
# 查看執(zhí)行某個命令的系統(tǒng)調(diào)用信息 strace `ls-l /tmp` # 查看某個進程的系統(tǒng)調(diào)用:查看pid為1435這個進程的系統(tǒng)調(diào)用 sudostrace -p 1435
一般可以使用strace工具來查看某個進程讀取了哪些文件,進程運行慢,時間都花費在了哪些地方以及系統(tǒng)的調(diào)用函數(shù)等。
使用場景總結(jié):
? 如果想要查看系統(tǒng)進程和資源的占用情況,就使用top或htop。
? 如果想要追蹤某個進程的系統(tǒng)調(diào)用,調(diào)用耗時等信息就是用strace工具
? 如果只是查看某個進程特定的詳細信息,就使用ps工具,想要進行深入分析就是用pidstat工具。
系統(tǒng)調(diào)優(yōu)方法
操作系統(tǒng):操作系統(tǒng)是一個系統(tǒng)軟件,操作系統(tǒng)的作用是管理和控制計算機硬件
**內(nèi)核:**內(nèi)核是操作系統(tǒng)的核心部分,是操作系統(tǒng)管理計算機硬件和軟件資源的核心代碼。操作系統(tǒng)則由內(nèi)核和其他系統(tǒng)工具程序共同組成的。例如文件管理器、用戶界面、設(shè)備驅(qū)動程序等。
**程序:**指的是一組計算機指令和數(shù)據(jù),可以被計算機執(zhí)行。程序是靜態(tài)的,通常存儲在硬盤或其他存儲設(shè)備中,需要通過操作系統(tǒng)加載到內(nèi)存中才能運行。
**進程:**是計算機中正在運行的程序的實例。進程是操作系統(tǒng)中進行資源分配的基本單位。
**線程:**是進程中的一個執(zhí)行單元,是操作系統(tǒng)調(diào)度的最小單位。
內(nèi)核空間:內(nèi)核空間是操作系統(tǒng)的核心部分,是操作系統(tǒng)內(nèi)核運行的地址空間。內(nèi)核空間是操作系統(tǒng)獨占的,只有內(nèi)核才能訪問這個地址空間。
用戶空間:是程序運行的地址空間。用戶空間是操作系統(tǒng)分配給應(yīng)用程序的地址空間,應(yīng)用程序可以在這個空間中運行和使用系統(tǒng)資源。
**進程和程序的關(guān)系:**首先程序被加載到內(nèi)存中,沒有開始運行的時候,只是一組靜態(tài)的代碼和數(shù)據(jù)。當程序被操作系統(tǒng)調(diào)用并開始執(zhí)行時,就成為了一個進程。一個進程里面包含了程序代碼、數(shù)據(jù)、寄存器等系統(tǒng)資源,所以每個進程都是一個程序的實體,進程是操作系統(tǒng)中進行資源分配和調(diào)度的基本單位。
兩個虛擬文件系統(tǒng):
在Linux中,/sys和/proc是兩個不同的虛擬文件系統(tǒng),里面的信息都是動態(tài)生成的,因為這兩個目錄中的數(shù)據(jù)信息隨著系統(tǒng)狀態(tài)的變化而變化。這兩個文件提供了操作內(nèi)核數(shù)據(jù)的接口。
/proc文件系統(tǒng):主要用于展示進程相關(guān)的信息,例如可以查詢內(nèi)核狀態(tài)和進程信息,例如CPU、內(nèi)存、網(wǎng)絡(luò)、硬件等系統(tǒng)信息。
/sys文件系統(tǒng):則用于展示設(shè)備和內(nèi)核參數(shù)的信息。/sys中不包含進程的信息,只有系統(tǒng)的狀態(tài)和設(shè)備信息。
說明:
? 修改了/proc/sys中的參數(shù)后可以通過sysctl工具來實現(xiàn)持久化配置。
? 修改了/sys 中的信息不能使用sysctl工具來持久化配置,需要寫入到/etc/rc.locl這個文件中實現(xiàn)持久化配置。
例如:echo deadline > /sys/block/sda/queue/scheduler就需要放到/etc/rc.locl中。
一:限制和控制進程的資源使用
1、ulimit工具
進程資源限制和控制的內(nèi)容:
? 進程的最大 CPU 時間
? 進程可以使用的最大虛擬內(nèi)存
? 進程可以使用的最大物理內(nèi)存
? 進程可以打開的最大文件數(shù)
? 進程可以創(chuàng)建的最大子進程數(shù)等等
使用ulimit工具進行資源限制的時候有兩種方式:
方式一:通過在/etc/security/limits.conf中修改資源限制,這樣設(shè)置重啟也會生效,可以針對系統(tǒng)中的所有用戶或特定用戶進行設(shè)置。
例如:顯示當前用戶進程的所有限制信息
ehigh@ubuntu:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited # unlimited表示不限制 scheduling priority (-e) 0 file size (blocks, -f) unlimited #文件的最大大小,一個block=4kb pending signals (-i) 47424 max locked memory (kbytes, -l) 65536 max memory size (kbytes, -m) unlimited open files (-n) 65535 # 一個進程可以同時打開的最大文件數(shù) pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 4096 # 一個用戶可以創(chuàng)建的最大進程數(shù)。 virtual memory (kbytes, -v) unlimited # 虛擬內(nèi)存的最大大小 file locks (-x) unlimited #如果要查看指定進程的限制信息需要使用-p參數(shù)指定進程的pid #例如:ehigh@ubuntu:~$ulimit-a -p 1 表示查看進程為1的進程及其子進程的限制信息
例如:調(diào)整當前shell中某個進程的資源限制信息
#限制當前shell 進程及其子進程的資源信息 -c:設(shè)置進程的核心轉(zhuǎn)儲文件大小限制,單位為字節(jié)。 #核心轉(zhuǎn)儲文件(core dump file)是指在程序崩潰或異常終止時,系統(tǒng)保存的程序內(nèi)存映像文件,通常用于分析和調(diào)試程序崩潰的原因。 #例如,要將當前進程的核心轉(zhuǎn)儲文件大小限制設(shè)置為 10MB,可以使用命令:ulimit-c 10000000 -m:設(shè)置進程的最大內(nèi)存限制,單位為 KB。 #例如,要將當前進程的最大內(nèi)存限制設(shè)置為 1GB,可以使用命令:ulimit-m 1048576 -n:設(shè)置進程可以打開的最大文件數(shù)。 #例如,要將當前進程可以打開的最大文件數(shù)設(shè)置為 2000,可以使用命令:ulimit-n 2000 -u:設(shè)置進程可以創(chuàng)建的最大用戶進程數(shù)。 #例如,要將當前進程可以創(chuàng)建的最大用戶進程數(shù)設(shè)置為 100,可以使用命令:ulimit-u 100 #限制指定的進程需要使用 -p 參數(shù) 例如:將進程 ID 為 12345 的進程的最大打開文件數(shù)限制設(shè)置為 1000,命令為:ulimit -n 1000 -p 12345
**說明:**使用ulimit -a命令查看資源限制信息時,顯示的是當前用戶(也就是執(zhí)行該命令的用戶)的資源限制信息,
例如:如果使用 root 用戶登錄 Linux 系統(tǒng),并在一個 shell 終端下執(zhí)行ulimit -a命令,則顯示的是 root 用戶的資源限制信息。
假設(shè)在這個shell終端下限制只能開啟10個進程,超過了10個就會受到限制。
但是如果 root 用戶在另外一個 shell 終端下執(zhí)行相同的命令,不會受到在另一個終端中設(shè)置的資源限制信息影響。
如果在~/.bashrc或/etc/profile中進行設(shè)置了,另外終端在該用戶登錄的時候會加載里面的配置,配置就會生效。
方式二:直接在命令行進行修改資源限制,只能針對當前 shell 會話的用戶生效。當會話結(jié)束時,修改會自動恢復(fù)到默認值。持久化生效需要在在環(huán)境變量中進行添加。(例如~/.bashrc或/etc/profile)中設(shè)置,每次用戶登錄時都會加載這些環(huán)境文件并應(yīng)用資源限制。
#格式 各列之間用 空格 或 Tab鍵 分隔。#說明 :需要對哪些用戶或者組進行限制 tom:表示對tom這個用戶生效 @tom:表示對tom這個用戶組都生效 :指定資源限制的類型,一般使用兩種,soft和hard #soft:軟限制,超過限制值就警告 #hard:硬限制,效果限制值就拒絕 #unlimited,表示無限制。 - :指定要限制那種資源 #nofile:最多可以打開多少個文件 #nproc:可以創(chuàng)建的最大進程數(shù) #fsize:單個文件的最大大小限制(單位:KB)
:指定限制的值 #unlimited,表示無限制 #例如: tom hard nproc 300 #將用戶tom的進程數(shù)量硬性限制為300個,也就是說,一旦用戶tom創(chuàng)建的進程數(shù)超過了300個,系統(tǒng)就會拒絕創(chuàng)建新的進程并返回錯誤信息。
2、PAM
PAM模塊是一種Linux系統(tǒng)的身份驗證框架。它允許管理員在登錄過程中通過使用各種模塊來實現(xiàn)不同的身份驗證方式。PAM還可用于對訪問系統(tǒng)的用戶進行授權(quán),以及在用戶登錄或注銷時執(zhí)行各種操作。
PAM的使用場景:
? 限制用戶訪問、控制遠程訪問、限制資源使用、實現(xiàn)單點登錄等。
3、cgroup
是一種Linux內(nèi)核特性,用于限制、隔離和管理進程組的資源使用。以使用cgroup來限制進程的CPU、內(nèi)存、IO等資源使用,以及隔離進程組并防止它們對系統(tǒng)的其他部分造成干擾。
使用場景:
? 限制某個用戶或進程的資源使用、限制 Docker 容器的資源使用、限制服務(wù)器上運行的某個應(yīng)用程序的資源使用等。
使用場景說明:
PAM、cgroup和ulimit不會相互排斥,可以結(jié)合使用。
? 如果需要對用戶進行身份驗證,限制用戶對系統(tǒng)資源的訪問,或者實現(xiàn)單點登錄等功能,可以使用 PAM。
? 如果需要限制某個用戶的進程可以打開的文件數(shù)量、可以使用的 CPU 時間等,可以使用 ulimit。
? 如果需要限制某個進程或容器的 CPU 使用率、內(nèi)存使用量、網(wǎng)絡(luò)帶寬等,可以使用 cgroups。
二:CPU的優(yōu)化方法
1、設(shè)置CPU的親和性
使用場景:系統(tǒng)中的CPU資源較為緊張,或者應(yīng)用程序的負載不均衡,可以考慮使用CPU親和性設(shè)置來優(yōu)化CPU資源的利用
通過taskset命令進行設(shè)置CPU的親和性,該命令可以將進程或線程綁定到指定的CPU核心上,以提高程序的性能和可靠性。
例如,以下命令將進程ID為1234的進程綁定到CPU核心0和1上:
taskset -c0,1-p1234
2、調(diào)整CPU的調(diào)度策略
默認的CFS策略已經(jīng)能夠滿足日常需求,如果在某些特定的情況下可以改變調(diào)度策略來進行優(yōu)化,例如高負載、需要實時響應(yīng)等場景。
實現(xiàn)方法:需要編譯內(nèi)核加上對應(yīng)的驅(qū)動程序,風險極大。
3、調(diào)整時間片大小
場景:如果應(yīng)用程序需要更快的響應(yīng)時間,可以考慮減小時間片大小。
實現(xiàn)方法:需要編譯內(nèi)核啟用對cpu時間片大小修改的支持,風險極大。
缺點:會增加系統(tǒng)的開銷,可能會降低系統(tǒng)的整體性能,因為需要增加系統(tǒng)上下文的切換次數(shù)。
4、調(diào)整CPU的遷移開銷
場景:通過CPU遷移開銷的調(diào)整,可以提高系統(tǒng)的負載均衡和響應(yīng)速度
實現(xiàn)方法:也是需要編譯內(nèi)核加上對應(yīng)的驅(qū)動程序才可以,通過修改對應(yīng)的值來調(diào)整CPU的遷移開銷。修改內(nèi)核風險極大。
缺點:減小CPU遷移開銷可能會導(dǎo)致更頻繁的CPU遷移,從而增加系統(tǒng)的開銷和延遲,導(dǎo)致進程的局部性和緩存效率下降,從而降低系統(tǒng)的整體性能。
二:內(nèi)存的優(yōu)化方法:
1、優(yōu)化對swap分區(qū)的使用
swap分區(qū)是一塊硬盤空間,用于存放內(nèi)存中不常用的數(shù)據(jù)。在Linux系統(tǒng)中,合理設(shè)置swap分區(qū)的大小可以有效地提高系統(tǒng)的穩(wěn)定性和性能。因為swap分區(qū)的速度太慢,一般都是直接關(guān)閉swap分區(qū)的使用。
關(guān)閉swap分區(qū)的方法:
swapoff -a # 臨時關(guān)閉
2、調(diào)整虛擬內(nèi)存參數(shù)
如果一定要使用swap分區(qū),可以通過調(diào)整/proc/sys/vm/swappiness的值為0來確保盡量使用物理內(nèi)存。
#1. 修改內(nèi)核參數(shù) ehigh@ubuntu:~$ sudo vim /etc/sysctl.conf vm.swappiness = 60 #2. 生效 ehgh@ubuntu:~$ sysctl -p
3、調(diào)整臟頁的最大內(nèi)存量
臟頁是指已被修改但尚未寫入磁盤的內(nèi)存頁。內(nèi)核使用 dirty_bytes 值來確定何時開始刷新臟頁到磁盤。
調(diào)整頁面緩存的大小(/proc/sys/vm/dirty_bytes),提高系統(tǒng)的性能。
優(yōu)化建議:
? 系統(tǒng)有足夠的內(nèi)存和IO資源,可以增加dirty_bytes的值,以減少頻繁寫回磁盤的次數(shù),從而提高性能
? 統(tǒng)資源不足,可以降低dirty_bytes的值,以避免過多的臟頁面積累,從而避免系統(tǒng)性能下降或內(nèi)存耗盡。
優(yōu)點:增大臟頁數(shù)據(jù)的值可以減少磁盤 I/O和提高提高內(nèi)存利用率,因為當系統(tǒng)中存在大量可用內(nèi)存時,增加 dirty_bytes 值可以讓內(nèi)核將更多的臟頁存儲在內(nèi)存中,提高內(nèi)存利用率。
缺點:如果內(nèi)存不足會導(dǎo)致系統(tǒng)性能下降,可能會造成磁盤IO洪水,如果斷電未寫入磁盤的臟頁數(shù)據(jù)可能會丟失。
例如:將頁面緩存得大小改為1G
# 1. 修改內(nèi)核參數(shù) ehigh@ubuntu:~$sudo vim /etc/sysctl.conf vm.dirty_bytes=1073741824# 將臟頁的內(nèi)存量調(diào)整為1G # 2. 生效 ehigh@ubuntu:~$sysctl -p
4、使用內(nèi)存緩存
**tmpfs:**tmpfs是一種基于內(nèi)存的文件系統(tǒng),tmpfs中的數(shù)據(jù)不需要將數(shù)據(jù)寫入硬盤,因此可以獲得更快的文件讀寫速度。
例如:
#1. 創(chuàng)建掛載點 mkdir /mnt/cache #2. 掛載tmpfs文件系統(tǒng) mount -t tmpfs -o size=2G tmpfs /mnt/cache #3. 將需要進行緩存的文件或目錄復(fù)制到掛載點目錄下 cp -r /path/to/files /mnt/cache #4. 應(yīng)用程序或腳本中的文件路徑修改為掛載點目錄下的路徑 #5. 當文件讀取或?qū)懭胪瓿珊螅梢酝ㄟ^rsync等工具將緩存中的文件同步到硬盤上,從而避免數(shù)據(jù)的丟失。 rsync -a /mnt/cache/ /path/to/files/
內(nèi)存緩存適用的場景:
(1)Web服務(wù)器:在Web服務(wù)器中,通常會緩存靜態(tài)文件(如CSS、JavaScript、圖片等),以提高網(wǎng)站的性能和響應(yīng)速度。使用tmpfs作為內(nèi)存緩存,可以將這些靜態(tài)文件緩存到內(nèi)存中,提高數(shù)據(jù)讀取速度,減輕磁盤負載。
(2)數(shù)據(jù)庫服務(wù)器:在數(shù)據(jù)庫服務(wù)器中,經(jīng)常需要將一些數(shù)據(jù)放在內(nèi)存中進行緩存,以提高查詢性能。使用tmpfs作為內(nèi)存緩存,可以將這些數(shù)據(jù)緩存到內(nèi)存中,避免頻繁的磁盤IO操作,提高查詢性能。
(3)虛擬機:在虛擬機環(huán)境中,可以使用tmpfs作為內(nèi)存緩存,以提高虛擬機的磁盤IO性能。例如,可以將虛擬機的磁盤鏡像文件(如vmdk、qcow2等)緩存到tmpfs中,避免頻繁的磁盤IO操作。
5、配置大頁
大頁是一種特殊的內(nèi)存頁,它的大小通常是默認頁大小的幾倍,比如 2MB 或者 1GB。
在內(nèi)存充足的情況下,可以提高 Linux 系統(tǒng)的性能。使用大頁可以減少內(nèi)存頁表的大小,從而提高內(nèi)存訪問的效率。對于一些需要頻繁訪問內(nèi)存的應(yīng)用程序(比如數(shù)據(jù)庫),啟用大頁可以顯著提高性能。
例如:運行虛擬機的時候配置大頁能顯著提升性能。
如果內(nèi)存小配置大頁會降低系統(tǒng)的性能。
配置實現(xiàn)流程:
#1. 查看是否開啟大頁功 默認情況下,已經(jīng)開啟了透明大頁功能: root@ubuntu:~# cat /sys/kernel/mm/transparent_hugepage/enabled always [madvise] never #2. 查看大頁的數(shù)目 默認為0 root@ubuntu:~# cat /proc/sys/vm/nr_hugepages 0 #也可以通過下面的方法查看 root@ubuntu:~# cat /proc/meminfo | grep -i Hugep AnonHugePages: 0 kB ShmemHugePages: 0 kB FileHugePages: 0 kB HugePages_Total: 0 # 大頁的總數(shù)為0 HugePages_Free: 0 # 前可用的大頁數(shù) HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB #3. 設(shè)置大頁的數(shù)量 表示使用2000個2M大小的大頁 echo 2000 > /proc/sys/vm/nr_hugepages #掛載大頁 mount -t hugetlbfs nodev /PATH #查看是否正常掛載 cat /proc/mounts | grep hugetlbfs
6、臟數(shù)據(jù)的回收
臟數(shù)據(jù)就是對內(nèi)存中已被修改但尚未寫入磁盤的數(shù)據(jù)進行回收。
臟數(shù)據(jù)自動回收:
通過修改vm.dirty_expire_centisecs和vm.dirty_writeback_centisecs的值來調(diào)整臟數(shù)據(jù)回收的時間間隔。
#臟數(shù)據(jù)在內(nèi)存中存留的時間,單位為1/100秒 ehigh@master-1:~$ cat /proc/sys/vm/dirty_expire_centisecs 3000 #臟數(shù)據(jù)的寫入間隔時間,單位為1/100秒 ehigh@master-1:~$ cat /proc/sys/vm/dirty_writeback_centisecs 500
臟數(shù)據(jù)手動回收:
使用sync命令將內(nèi)存中的所有臟數(shù)據(jù)寫回磁盤,以減少數(shù)據(jù)丟失或損壞的風險。
sync命令會強制將文件系統(tǒng)中所有修改過的數(shù)據(jù)緩存寫回磁盤,包括臟數(shù)據(jù)和元數(shù)據(jù)。
如何調(diào)整臟數(shù)據(jù)回收的時間:
? 如果追求系統(tǒng)的性能,可以把vm.dirty_expire_centisecs和vm.dirty_writeback_centisecs的值改大,減少磁盤IO的操做。
? 如果追求數(shù)據(jù)的安全性,可以把vm.dirty_expire_centisecs和vm.dirty_writeback_centisecs的值改小,防止數(shù)據(jù)丟失。
7、清理緩存
只有在應(yīng)用程序出現(xiàn)崩潰或無響應(yīng)的情況,系統(tǒng)出現(xiàn)“內(nèi)存不足”或“無法為應(yīng)用程序分配足夠的內(nèi)存”中各種情況可以考慮清理緩存,以確保系統(tǒng)的正常運行。
注意:清空緩存可能會導(dǎo)致系統(tǒng)性能下降,因為需要重新從磁盤讀取數(shù)據(jù)。因此,在清空緩存之前,需要仔細考慮清空緩存的必要性,并確保系統(tǒng)有足夠的內(nèi)存來重新緩存數(shù)據(jù)。
例如:free非常小,而available比較大,說明系統(tǒng)正在使用大量的緩存來提高性能,并且這些緩存可以被重新分配給新的進程或應(yīng)用程序,這種情況清理緩存會影響性能。
image
清空文件系統(tǒng)緩存:
ehigh@ubuntu:~$sudo sync && echo3>/proc/sys/vm/drop_caches
清空內(nèi)存緩存:
ehigh@ubuntu:~$sudo echo1>/proc/sys/vm/drop_caches
三:磁盤的優(yōu)化方法:
1、掛載參數(shù)優(yōu)化
在掛載硬盤時,使用noatime選項可以避免在每次讀取文件時更新文件的訪問時間,減少磁盤IO操作,提高硬盤性能。在/etc/fstab文件中添加noatime選項即可。
2、文件系統(tǒng)優(yōu)化
對于大量小文件的讀寫,使用 ext4 文件系統(tǒng)可能比使用 XFS 文件系統(tǒng)更適合。
Linux中一個文件的組成:
Linux上的一個文件 ≈ 一個Inode + 若干Block
image
Inode:存放文件的屬性信息,每個Inode有一個唯一的Inode號,Inode的節(jié)點號是一個32位無符號的整型數(shù),因此每個文件系統(tǒng)上的inode節(jié)點總數(shù)最多為2^32個(約42億個)。
Block:存放文件真正的數(shù)據(jù)部分,一個Block的大小默認是4KB。
image
#nodes per group:表示每個塊組中 inode 的數(shù)量 #Blocks per group:表示每個塊組block的數(shù)量
Inode的默認分配策略:
一般系統(tǒng)會將1%的磁盤空間分配為inode區(qū)域,如果默認每個block的大小是4KB,Inode的默認大小是256Byte,那么一個block可以存放16個Inode。
Inode數(shù)量對硬盤的影響:
硬盤在格式化的時候,操作系統(tǒng)自動將硬盤分成兩個區(qū)域。一個是數(shù)據(jù)區(qū),存放文件數(shù)據(jù);另一個是inode區(qū)(inode table),存放inode所包含的信息。
Inode數(shù)量多:能存儲更多的文件,可能會造成增加磁盤碎片的概率,影響文件系統(tǒng)的性能,還會使得文件系統(tǒng)的檢查變慢,導(dǎo)致開機變慢。
Inode數(shù)量少:存儲的文件數(shù)量變少,但是最大可存儲文件數(shù)量也大大減少
調(diào)整Inode的數(shù)量:
如果硬盤上存放有很多小文件,會導(dǎo)致Inode的數(shù)量快速被用完,造成inode 節(jié)點不足的問題。
例如:創(chuàng)建文件系統(tǒng)時手動設(shè)置 inode 數(shù)量:
#將 inode 數(shù)量設(shè)置為 2000000 mkfs.ext4 -N 2000000 /dev/sdb1
3、根據(jù)不同的場景選擇磁盤調(diào)度算法
在Linux系統(tǒng)中,磁盤的三種調(diào)度算法分別為 CFQ、Deadline 和 NOOP
CFQ調(diào)度算法
Linux系統(tǒng)默認的磁盤調(diào)度算法,會根據(jù)每個進程的優(yōu)先級和歷史I/O請求時間來計算每個隊列的權(quán)重,然后按照權(quán)重順序調(diào)度I/O請求。
使用場景:適合多任務(wù)環(huán)境下的桌面系統(tǒng)和服務(wù)器系統(tǒng)。例如Web服務(wù)器、數(shù)據(jù)庫服務(wù)器
Deadline調(diào)度算法
將I/O請求分為兩類:實時I/O請求和普通I/O請求。實時I/O請求是指需要立即響應(yīng)的請求,例如鼠標、鍵盤輸入等。普通I/O請求是指需要等待一定時間才能得到響應(yīng)的請求,例如文件讀寫操作等。
將實時I/O請求插入到隊列頭部,優(yōu)先處理;對于普通I/O請求,則會設(shè)置一個截止時間(deadline),在此之前盡可能地處理請求。
使用場景:適合需要響應(yīng)速度較快的應(yīng)用程序,例如實時音視頻應(yīng)用、游戲等。
NOOP調(diào)度算法
一種簡單的調(diào)度算法,它不會對I/O請求進行排序或調(diào)度,而是按照請求的先后順序依次處理。在高負載的情況下,NOOP調(diào)度算法可以減少CPU的消耗,但是在磁盤較忙的情況下可能會導(dǎo)致響應(yīng)時間較長。
使用場景:適合低負載的系統(tǒng),例如桌面系統(tǒng)或者輕負載的服務(wù)器系統(tǒng)?;蛘逽SD磁盤
修改磁盤調(diào)度算法:/sys/block/
例如:
#1. 編輯內(nèi)核參數(shù)的配置文件 sudo vim /etc/default/grub #2. 找到GRUB_CMDLINE_LINUX_DEFAULT行,并在雙引號中添加要修改的內(nèi)核參數(shù), elevator=cfq表示調(diào)度算法設(shè)置為cfq GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=cfq" #3. 更新GRUB配置 sudo update-grub $4. 重啟系統(tǒng) sudo reboot #注意:內(nèi)核參數(shù)是區(qū)分大小寫,寫調(diào)度算法名稱的時候需要全部小寫 #例如: elevator=deadline elevator=cfq elevator=noop #查看當前磁盤使用的調(diào)度算法 root@ecs-1746-0001:/sys/block# cat /sys/block/vda/queue/scheduler [mq-deadline] none # 方括號中的算法名稱表示當前生效的調(diào)度算法。
4、設(shè)置預(yù)讀取數(shù)據(jù)的大小
默認情況下,Linux 內(nèi)核會自動根據(jù)設(shè)備類型和性能來選擇合適的預(yù)讀取大小。
通過設(shè)置塊設(shè)備的預(yù)讀取數(shù)據(jù)大小/sys/block/vda/queue/read_ahead_kb,以加快讀取速度。
#磁盤緩存的默認大小是128kb root@ecs-1746-0001:~# cat /sys/block/vda/queue/read_ahead_kb 128
預(yù)讀取大小的設(shè)置規(guī)則:
一般預(yù)讀取大小在64KB 到 256KB 之間是比較合適,如果太小浪費磁盤IO,太大浪費內(nèi)存資源。高速 SSD 設(shè)備,預(yù)讀取的大小頁不要超過 1MB。
5、優(yōu)化磁盤碎片
磁盤碎片是指硬盤上存儲的文件在寫入和刪除過程中被分割成不連續(xù)的片段,使得文件在硬盤上的物理位置不再是連續(xù)的。所以導(dǎo)致磁盤的讀寫速度變慢。
查看和清理磁盤碎片:
ext4文件系統(tǒng):
#查看是否存在磁盤碎片 ehigh@ubuntu:~$ sudo dumpe2fs /dev/sda1 #清理磁盤碎片 清理sda1的磁盤碎片 ehigh@ubuntu:~$ sudo e4defrag /dev/sda1
xfs文件系統(tǒng):
#查看是否存在磁盤碎片 ehigh@ubuntu:~$ sudo xfs_db -c frag /dev/sda1 #清理磁盤碎片 ehigh@ubuntu:~$ sudo xfs_fsr /dev/sda1
四:對網(wǎng)絡(luò)進行優(yōu)化:
1、調(diào)整TCP/IP參數(shù)來優(yōu)化網(wǎng)絡(luò)
Linux系統(tǒng)默認的TCP/IP參數(shù)適用于多數(shù)情況,但是對于高負載或者高流量的應(yīng)用需要調(diào)整TCP窗口大小、最大并發(fā)連接數(shù)、最大傳輸單元(MTU)等參數(shù)。
例如:如果需要處理10000個并發(fā)連接,可以將這兩個參數(shù)設(shè)置為10000:
echo "10000" > /proc/sys/net/ipv4/tcp_max_syn_backlog # TCP最大連接數(shù),默認是1024 echo "10000" > /proc/sys/net/core/somaxconn # 最大同步連接數(shù),默認是1024
2、開啟TCP的快速連接機制
在Linux內(nèi)核版本3.7及以上,TCP快速打開已經(jīng)默認啟用。CP快速打開可以減少TCP三次握手的時間,從而提高連接速度和性能。
例如:
root@ecs-1746-0001:~# echo "2" > /proc/sys/net/ipv4/tcp_fastopen #0:禁用TCP Fast Open功能。 #1:啟用TCP Fast Open客戶端功能,但不啟用服務(wù)器端功能。這是默認值。 #2:啟用TCP Fast Open客戶端和服務(wù)器端功能。
3、啟用TCP擁塞控制算法
例如,Cubic、Reno、BIC等。選擇適合自己應(yīng)用的擁塞控制算法可以提高網(wǎng)絡(luò)性能和穩(wěn)定性。
Cubic算法:更為適用于高延遲、高帶寬的網(wǎng)絡(luò)環(huán)境
Reno算法:適合傳輸速度相對較快,延遲較低,丟包率也較低的網(wǎng)絡(luò)環(huán)境
#當前系統(tǒng)中可用的TCP擁塞控制算法 root@ecs-1746-0001:~# cat /proc/sys/net/ipv4/tcp_available_congestion_control reno cubic #設(shè)置TCP擁塞控制算法 root@ecs-1746-0001:~# echo 'cubic' > /proc/sys/net/ipv4/tcp_congestion_control #持久化設(shè)置 root@ecs-1746-0001:~# vim /etc/sysctl.conf net.ipv4.tcp_congestion_control=cubic
4、調(diào)整網(wǎng)絡(luò)緩沖區(qū)大小
Linux系統(tǒng)默認的網(wǎng)絡(luò)緩沖區(qū)大小適用于大多數(shù)情況,但是對于高負載或者高流量的應(yīng)用,需要調(diào)整增大套接字緩沖區(qū)大小、讀寫緩沖區(qū)大小等。
例如:如果需要處理大量的網(wǎng)絡(luò)流量,可以將這些參數(shù)設(shè)置為較大的值
echo "16777216" > /proc/sys/net/core/wmem_max echo "16777216" > /proc/sys/net/core/rmem_max echo "16777216" > /proc/sys/net/core/optmem_max
5、禁用IPv6
如果沒有使用IPv6,禁用IPv6協(xié)議,從而減少網(wǎng)絡(luò)連接的負載。
禁用IPV6:
root@ecs-1746-0001:~# vim /etc/sysctl.conf net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 root@ecs-1746-0001:~# sysctl -p
6、TCP窗口大小
通過修改窗口的大小,提升網(wǎng)絡(luò)的傳輸速度和網(wǎng)絡(luò)性能。
例如:
sudo vim /etc/sysctl.conf net.ipv4.tcp_window_scaling = 1 # 啟用TCP窗口擴展功能 net.ipv4.tcp_rmem = 4096 131072 6291456 # 最小值、默認值和最大值 net.ipv4.tcp_wmem = 4096 16384 4194304
7、調(diào)整連接隊列和最大連接數(shù)
如果TCP的連接隊列太小,就會導(dǎo)致客戶端連接請求被拒絕,如果連接隊列太大,就會占用過多的內(nèi)存資源
如果TCP的最大連接數(shù)設(shè)置得太低,會導(dǎo)致系統(tǒng)無法支持足夠的并發(fā)連接,從而導(dǎo)致系統(tǒng)響應(yīng)變慢或者連接超時。
調(diào)整TCP的連接隊列和最大連接數(shù):
#查看當前系統(tǒng)的最大連接數(shù): #查看當前的TCP最大連接數(shù)是否接近系統(tǒng)的最大連接數(shù),如果接近就修改為一個更大的值。 ss -n | grep tcp | grep ESTABLISHED | wc -l #查看TCP的最大連接數(shù) 默認TCP的最大連接數(shù)是256 ehigh@ubuntu:~$ cat /proc/sys/net/core/somaxconn 256 #設(shè)置TCP的最大連接數(shù) ehigh@ubuntu:~$ sudo sysctl -w net.core.somaxconn=2048 #設(shè)置TCP的連接隊列 一般設(shè)置為最大連接數(shù)的兩倍 sysctl -w net.core.somaxconn=1024
鏈接:https://www.cnblogs.com/heyongshen/p/17195795.html
-
cpu
+關(guān)注
關(guān)注
68文章
11057瀏覽量
216337 -
Linux
+關(guān)注
關(guān)注
87文章
11481瀏覽量
213100 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9735瀏覽量
87475
原文標題:企業(yè)級Linux調(diào)優(yōu)手冊:從系統(tǒng)優(yōu)化到網(wǎng)絡(luò)延遲降低?
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux性能測試之性能測試指標詳解
系統(tǒng)時間響應(yīng)的性能指標
鏡像對系統(tǒng)性能的影響有哪些?
如何提高FPGA的系統(tǒng)性能
優(yōu)化BIOS設(shè)置提高系統(tǒng)性能
Linux系統(tǒng)命令指南
Linux文件系統(tǒng)性能優(yōu)化
Vitis統(tǒng)一軟件平臺用戶指南:系統(tǒng)性能分析(v2020.1)

評論