前言: Linux伺服器運行了很多應用,在高負載下,伺服器可能會出現性能瓶頸,例如CPU利用率過高、記憶體不足、磁碟I/O瓶頸等,從而導致系統卡頓,服務無法正常運行等問題。所以針對以上問題,可以通過調整內核參數和系統的相關組件,優化應用程式來提高伺服器的性能和穩定性,避免系統崩潰和服務中斷。 Linu ...
前言:
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等信息。
一:查看系統整體的信息:
1、vmstat工具
vmstat是系統自帶的一個工具,vmstat主要查看的是記憶體和進程的使用情況,其它例如進程、系統IO、上下文切換這些信息也可以查看。
例如:
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的使用率、上下文切換、中斷和軟中斷等信息。
例如:
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瓶頸和瓶頸進程。
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的使用情況:
# %user:用戶空間進程所占用CPU時間的百分比。
# %nice:被nice值提高的用戶空間進程所占用CPU時間的百分比。
# %system:內核空間進程所占用CPU時間的百分比。
# %iowait:CPU等待I/O操作完成所占用CPU時間的百分比。
# %steal:被虛擬化程式(如VMware)偷走的CPU時間的百分比。
# %idle:CPU空閑時間的百分比。
- 如果
%user和%system
占用率較高,可能表示系統負載較高,需要進一步檢查進程、IO等情況。 - 如果%iowait占用率較高,可能表示IO瓶頸
- 如果%idle占用率較高,可能表示系統資源未充分利用
(2)監視記憶體使用情況:
# kbmemfree:可用記憶體大小(單位:KB)
# kbmemused:已用記憶體大小(單位:KB)
# %memused:已用記憶體占總記憶體的百分比
# kbbuffers:緩存的記憶體大小(單位:KB)
# kbcached:緩存的文件系統緩存大小(單位:KB)
# kbcommit:提交記憶體大小(單位:KB)
# %commit:提交記憶體占總記憶體的百分比
# kbactive:活躍記憶體大小(單位:KB)
# kbinact:非活躍記憶體大小(單位:KB)
# kbdirty:臟頁的記憶體大小(單位:KB)
- 如果可用記憶體(
kbmemfree
)較少,已用記憶體(kbmemused
)和已用記憶體占總記憶體的百分比(%memused
)較高,可能表示記憶體不足 - 如果緩存的記憶體(
kbbuffers
)和緩存的文件系統緩存(kbcached
)較高,可能表示系統的文件系統緩存良好 - 如果提交記憶體(
kbcommit
)較高,可能表示應用程式提交的記憶體較多 - 如果活躍記憶體(
kbactive
)和非活躍記憶體(kbinact
)較高,可能表示系統當前運行的應用程式較多
(3)監視磁碟I/O使用情況:
# 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
主要查看的是接收和發送數據包的速率、接收和發送數據量的速率
# 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
可以查看網路設備的錯誤和丟包數。
# 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 快捷鍵將會顯示進程的完整命令行參數。
在top命令中按下快捷鍵盤’c‘之後。
2、ps
主要用來列出系統中所有進程的信息。
例如:運行了某個腳本,查看腳本是否啟動
# 運行一個測試腳本
ehigh@ubuntu:~$ bash test.sh &
[1] 21738
# 查看這個腳本是否正常啟動
ehigh@ubuntu:~$ ps -ef | grep test.sh
ehigh 21738 14974 0 11:04 pts/19 00:00:00 bash test.sh
3、htop
ttop 命令的一個增強版,可以實時地顯示系統中所有進程的資源占用情況。
4、pidstat
實時地顯示某個進程的 CPU 使用率、記憶體占用等。
5、strace
追蹤某個進程的系統調用信息,可以捕獲和列印出應用程式和內核之間發生的所有系統調用和信號,包括傳遞的參數和返回值,以及發生的錯誤。
例如:
# 查看執行某個命令的系統調用信息
strace `ls -l /tmp`
# 查看某個進程的系統調用:查看pid為1435這個進程的系統調用
sudo strace -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中。
一:PAM和Cgroup限制資源
PAM:PAM是一個獨立的動態共用庫,其功能是提供身份驗證、授權和帳戶管理等功能。LInux內核只提供了基本的身份驗證和訪問控制功能,PAM模塊擴展了身份驗證和訪問控制的功能,可以通過配置PAM模塊來實現用戶身份驗證和訪問控制。
在Linux PAM中,每個模塊可以設置兩個限制:軟限制和硬限制,用於控制用戶對系統資源的訪問。
- 軟限制:超過了限制的值會發送警告信息
- 硬限制:超過了限制的值會直接拒絕
Cgroup模塊:control group。是 Linux 內核中的一個機制,可以用於限制進程的資源使用(例如 CPU、記憶體、磁碟 I/O 等)和優先順序分配,以實現資源隔離和性能優化。Cgroup 模塊是 Linux 系統中的一個內核模塊,提供了對 Cgroup 機制的支持。
二:CPU的優化方法
1、設置CPU的親和性
使用場景:系統中的CPU資源較為緊張,或者應用程式的負載不均衡,可以考慮使用CPU親和性設置來優化CPU資源的利用
通過taskset
命令進行設置CPU的親和性,該命令可以將進程或線程綁定到指定的CPU核心上,以提高程式的性能和可靠性。
例如,以下命令將進程ID為1234的進程綁定到CPU核心0和1上:
taskset -c 0,1 -p 1234
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、清理緩存
當系統記憶體不足時,需要清理緩存來釋放記憶體,以確保系統的正常運行,例如當系統記憶體使用率達到80%以上時,可以考慮清理緩存。
註意:清空緩存可能會導致系統性能下降,因為需要重新從磁碟讀取數據。因此,在清空緩存之前,需要仔細考慮清空緩存的必要性,並確保系統有足夠的記憶體來重新緩存數據。
例如:顯示緩存占用了8.4G的空間,可用空間只有223M,並且都開始使用swap分區了。這種情況可以考慮清緩存。
清空文件系統緩存:
ehigh@ubuntu:~$ sudo sync && echo 3 > /proc/sys/vm/drop_caches
清空記憶體緩存:
ehigh@ubuntu:~$ sudo echo 1 > /proc/sys/vm/drop_caches
三:磁碟的優化方法:
1、掛載參數優化
在掛載硬碟時,使用noatime選項可以避免在每次讀取文件時更新文件的訪問時間,減少磁碟IO操作,提高硬碟性能。在/etc/fstab文件中添加noatime選項即可。
2、選擇合適的文件系統
對於大量小文件的讀寫,使用 ext4 文件系統可能比使用 XFS 文件系統更適合。
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的消耗,但是在磁碟較忙的情況下可能會導致響應時間較長。
使用場景:適合低負載的系統,例如桌面系統或者輕負載的伺服器系統。或者SSD磁碟
修改磁碟調度演算法:/sys/block/<device>/queue/scheduler文件
例如:
# 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