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

評論