Linux性能優(yōu)化底層邏輯,讓你的系統(tǒng)運行如飛
作為一名深耕 Linux 領域多年的博主,我見過太多人在 Linux 系統(tǒng)性能問題上栽跟頭。你是不是也遇到過這樣的場景:滿心歡喜地搭建好 Linux 服務器,準備大展身手,結果網(wǎng)站響應慢得讓人懷疑人生;又或者在使用 Linux 桌面系統(tǒng)時,打開個文件管理器都要卡半天,操作起來別提多糟心了。這些問題,其實就是 Linux 在向你 “抱怨”,它需要你的優(yōu)化和調(diào)教 。
性能優(yōu)化對于 Linux 系統(tǒng)而言,那可是相當重要。就好比一輛汽車,出廠時雖然性能不錯,但如果不定期保養(yǎng)、調(diào)整,隨著時間推移,也會變得動力不足、油耗增加。Linux 系統(tǒng)也是如此,在長期運行過程中,受到硬件老化、軟件漏洞、配置錯誤、負載變化等多種因素影響,性能會逐漸下降。
一、Linux 性能問題
1.1性能指標那些事兒
在深入探討優(yōu)化策略之前,我們得先搞清楚衡量 Linux 系統(tǒng)性能的關鍵指標,這就好比看病得先知道各項生理指標是否正常一樣。
吞吐量(Throughput):簡單來說,就是系統(tǒng)在單位時間內(nèi)處理的工作量。比如你的服務器每秒能處理多少個 HTTP 請求,或者磁盤每秒能讀寫多少數(shù)據(jù)量。吞吐量越高,說明系統(tǒng)處理能力越強。想象一下高速公路,吞吐量就像是單位時間內(nèi)通過的車輛數(shù),吞吐量越大,道路就越繁忙且高效。在 Web 服務器場景中,如果吞吐量低,就意味著在高并發(fā)訪問時,服務器無法及時處理大量請求,導致頁面加載緩慢甚至超時。
延時(Latency):指的是從請求發(fā)出到收到響應所經(jīng)歷的時間。它反映了系統(tǒng)的響應速度,延時越低,用戶體驗就越好。就像你網(wǎng)購下單后,肯定希望快遞能盡快送達,這個等待的時間就類似于系統(tǒng)延時。在數(shù)據(jù)庫查詢中,如果延時過高,可能是因為索引不合理、磁盤 I/O 慢等原因,導致查詢結果不能及時返回。
CPU 使用率(CPU Utilization):表示 CPU 在一段時間內(nèi)忙于處理任務的時間比例。比如,CPU 使用率為 80%,就意味著在這段時間里,CPU 有 80% 的時間都在工作。過高的 CPU 使用率可能導致系統(tǒng)響應變慢,因為 CPU 資源被大量占用,無法及時處理新的任務。當你同時運行多個大型程序時,CPU 使用率可能會飆升,電腦就會變得卡頓。
內(nèi)存使用率(Memory Utilization):是已使用內(nèi)存占總內(nèi)存的比例。內(nèi)存就像電腦的臨時倉庫,程序運行時需要把數(shù)據(jù)加載到內(nèi)存中。如果內(nèi)存使用率過高,系統(tǒng)可能會頻繁進行內(nèi)存交換(swap),把內(nèi)存中暫時不用的數(shù)據(jù)轉移到磁盤上,這會大大降低系統(tǒng)性能,因為磁盤讀寫速度遠低于內(nèi)存。當你打開太多應用程序,內(nèi)存被占滿,系統(tǒng)就會開始使用虛擬內(nèi)存(磁盤空間模擬內(nèi)存),這時電腦運行就會變得遲緩。
1.2性能問題何處尋
了解了性能指標,接下來就是要學會如何發(fā)現(xiàn)系統(tǒng)中存在的性能問題。下面這些常見的性能問題場景及表現(xiàn),你可一定要牢記。
(1)CPU 瓶頸
高負載:當系統(tǒng)的平均負載(Load Average)持續(xù)高于 CPU 核心數(shù)時,就說明系統(tǒng)負載過高,CPU 可能已經(jīng)不堪重負。平均負載是指單位時間內(nèi),系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù)。比如,一個 4 核心的 CPU,如果平均負載長期高于 4,那就有問題了。在進行大規(guī)模數(shù)據(jù)計算時,如大數(shù)據(jù)分析任務,可能會使 CPU 長時間處于高負載狀態(tài)。
進程爭用:多個進程競爭 CPU 資源,導致上下文切換頻繁。上下文切換是指 CPU 從一個進程切換到另一個進程時,需要保存和恢復進程的狀態(tài)信息。過多的上下文切換會消耗 CPU 時間,降低系統(tǒng)性能。可以通過vmstat命令查看cs(上下文切換次數(shù))的值,如果這個值很高,就可能存在進程爭用問題。當多個進程同時需要 CPU 計算資源時,就會出現(xiàn)爭用情況,比如多個視頻轉碼任務同時運行。
(2)內(nèi)存瓶頸
內(nèi)存泄漏(Memory Leak):程序在申請內(nèi)存后,沒有及時釋放,導致內(nèi)存被不斷占用,最終耗盡系統(tǒng)內(nèi)存。內(nèi)存泄漏通常是由程序編寫錯誤引起的,在 C/C++ 等語言中比較常見。比如在 C 語言中,如果使用malloc分配了內(nèi)存,但沒有使用free釋放,就會造成內(nèi)存泄漏。隨著內(nèi)存泄漏的加劇,系統(tǒng)會變得越來越慢,甚至死機。
頻繁交換(Frequent Swapping):當物理內(nèi)存不足時,系統(tǒng)會將內(nèi)存中的數(shù)據(jù)交換到磁盤的交換空間(swap)中。頻繁的內(nèi)存交換會導致系統(tǒng)性能急劇下降,因為磁盤 I/O 速度比內(nèi)存慢得多??梢酝ㄟ^free命令查看swap的使用情況,如果swap空間被大量使用,就說明存在頻繁交換問題。當你運行一個大型游戲,同時又打開很多其他應用程序,導致物理內(nèi)存不足,系統(tǒng)就會頻繁使用 swap 空間。
(3)磁盤 I/O 瓶頸
讀寫緩慢:磁盤讀寫速度過慢,導致應用程序等待數(shù)據(jù)讀寫的時間過長。這可能是由于磁盤老化、文件系統(tǒng)碎片化、I/O 調(diào)度策略不合理等原因引起的。比如機械硬盤使用時間久了,磁頭老化,讀寫速度就會下降。在進行大文件拷貝時,如果速度很慢,就可能存在磁盤 I/O 問題。
磁盤繁忙:磁盤長時間處于忙碌狀態(tài),無法及時響應新的 I/O 請求。可以通過iostat命令查看磁盤的使用率,如果磁盤使用率長期高于 80%,就說明磁盤比較繁忙。當大量進程同時對磁盤進行讀寫操作時,如數(shù)據(jù)庫的頻繁讀寫,就會導致磁盤繁忙。
(4)網(wǎng)絡瓶頸
帶寬不足:網(wǎng)絡帶寬無法滿足數(shù)據(jù)傳輸?shù)男枨?,導致?shù)據(jù)傳輸速度慢。比如你的服務器帶寬是 10Mbps,但業(yè)務高峰期需要傳輸?shù)臄?shù)據(jù)量很大,就會出現(xiàn)帶寬不足的情況。在進行視頻直播時,如果觀眾數(shù)量過多,而服務器帶寬有限,就會導致直播卡頓。
高延遲:數(shù)據(jù)在網(wǎng)絡中傳輸?shù)臅r間過長,這可能是由于網(wǎng)絡擁塞、路由問題、網(wǎng)絡設備故障等原因引起的。可以使用ping命令測試網(wǎng)絡延遲,如果延遲過高,比如超過 100ms,就可能影響業(yè)務正常運行。當你訪問國外網(wǎng)站時,由于網(wǎng)絡距離遠、經(jīng)過的路由節(jié)點多,可能會出現(xiàn)高延遲問題。
二、硬件優(yōu)化:給 Linux 換上 “強力引擎”
硬件是 Linux 系統(tǒng)運行的基礎,就像汽車的發(fā)動機、底盤等關鍵部件一樣,硬件性能的優(yōu)劣直接影響著系統(tǒng)的整體表現(xiàn)。接下來,我就從 CPU、內(nèi)存、存儲和網(wǎng)絡這幾個關鍵硬件方面,為大家詳細介紹如何進行優(yōu)化 。
2.1CPU:性能的核心驅(qū)動力
CPU 作為計算機的核心部件,猶如人的大腦,承擔著系統(tǒng)中各種計算任務的重任,其性能對 Linux 系統(tǒng)的運行速度起著決定性作用。
在選擇 CPU 時,不能盲目追求高端配置,而要根據(jù)業(yè)務類型來精準選型。對于需要處理大量并行任務的場景,比如大數(shù)據(jù)分析、分布式計算等,多核心的 CPU 是不二之選。因為多核心可以同時處理多個任務,大大提高了并行處理能力,就像多個工人同時工作,能加快工程進度一樣。像英特爾至強系列的多核 CPU,在數(shù)據(jù)中心的服務器中廣泛應用,能夠高效處理海量數(shù)據(jù)。
而對于那些對計算速度要求極高的場景,如金融交易中的高頻算法交易、科學計算中的復雜模擬等,高主頻的 CPU 更能發(fā)揮優(yōu)勢。高主頻意味著 CPU 在單位時間內(nèi)能夠執(zhí)行更多的指令,就像短跑運動員速度更快,能在更短時間內(nèi)完成沖刺。例如,AMD 的銳龍系列在單核性能上表現(xiàn)出色,對于一些對單核性能要求高的游戲、設計軟件等應用,能提供更流暢的體驗。
CPU 緩存是提高 CPU 處理速度的關鍵,它就像一個靠近 CPU 的小型高速倉庫,存放著 CPU 近期可能會用到的數(shù)據(jù)和指令。要優(yōu)化程序代碼,使數(shù)據(jù)和指令的訪問更符合 CPU 緩存的工作機制,從而提高緩存命中率。以訪問數(shù)組為例,按順序訪問數(shù)組元素能充分利用緩存的預取機制,提高緩存命中率。比如有一個二維數(shù)組array[N][N],如果按照array[i][j](其中i是外層循環(huán),j是內(nèi)層循環(huán))的方式訪問,由于內(nèi)存中數(shù)組元素是按行連續(xù)存儲的,這種訪問順序與內(nèi)存布局一致,當訪問array[0][0]時,緩存會將后續(xù)相鄰的元素也一并載入,后續(xù)訪問array[0][1]等元素時就能直接從緩存中讀取,大大提高了訪問速度。而如果按照array[j][i]的方式訪問,內(nèi)存訪問是跳躍的,緩存無法有效地預取數(shù)據(jù),就會導致緩存命中率降低,訪問速度變慢 。
使用cpufreq工具可以動態(tài)調(diào)整CPU頻率,根據(jù)系統(tǒng)負載合理設置頻率,實現(xiàn)性能與能耗的平衡。cpufreq工具提供了多種頻率調(diào)節(jié)策略,比如ondemand策略,當系統(tǒng)負載增加時,它會立即提高CPU頻率以應對計算需求;當負載減少時,又會降低頻率以節(jié)省能源。這就好比汽車在行駛過程中,根據(jù)路況自動調(diào)整車速,在高速公路上加速行駛,在市區(qū)擁堵路段減速慢行,既保證了行駛效率,又節(jié)省了油耗。在Linux系統(tǒng)中,可以通過修改 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor文件來設置頻率調(diào)節(jié)策略,例如將策略設置為 ondemand,可以使用命令echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 。
2.2內(nèi)存:數(shù)據(jù)的高速通道
內(nèi)存是數(shù)據(jù)和程序運行的臨時存儲區(qū)域,就像一個中轉站,其性能直接影響著系統(tǒng)的響應速度。根據(jù)系統(tǒng)負載和業(yè)務需求增加物理內(nèi)存至關重要。以大型數(shù)據(jù)庫服務器為例,當數(shù)據(jù)庫中存儲著海量的數(shù)據(jù),并且需要頻繁進行數(shù)據(jù)查詢、更新等操作時,如果內(nèi)存不足,數(shù)據(jù)庫就不得不頻繁地從磁盤中讀取數(shù)據(jù),而磁盤 I/O 速度遠遠低于內(nèi)存,這會導致系統(tǒng)響應速度極慢。充足的內(nèi)存可以將常用的數(shù)據(jù)和索引加載到內(nèi)存中,減少磁盤 I/O 操作,大大提升系統(tǒng)的響應速度。比如,一個原本內(nèi)存為 8GB 的數(shù)據(jù)庫服務器,在業(yè)務高峰期經(jīng)常出現(xiàn)響應遲緩的問題,當將內(nèi)存擴充到 16GB 后,系統(tǒng)性能得到了顯著提升,查詢響應時間大幅縮短 。
KSM(Kernel Samepage Merging)和 zRAM 等內(nèi)存壓縮技術可以有效提高內(nèi)存利用率。KSM 通過合并內(nèi)存中相同的頁面,減少內(nèi)存占用。例如,在運行多個虛擬機的云服務器中,多個虛擬機可能會加載相同的操作系統(tǒng)內(nèi)核和基礎庫文件,KSM 可以識別并合并這些相同的頁面,釋放出更多的內(nèi)存空間。zRAM 則是將內(nèi)存中的數(shù)據(jù)進行壓縮后存儲,進一步減少內(nèi)存占用。它就像一個壓縮倉庫,把物品壓縮后存放,能在有限的空間里存放更多的東西。對于內(nèi)存資源有限的云服務器,通過啟用 zRAM,在內(nèi)存緊張時對數(shù)據(jù)進行壓縮存儲,可以避免因內(nèi)存不足而導致的系統(tǒng)性能下降 。
定期清理內(nèi)存頁面、整理內(nèi)存碎片能確保內(nèi)存分配高效。內(nèi)存碎片就像房間里雜亂擺放的物品,會導致空間浪費,影響內(nèi)存分配效率。可以使用sysctl命令來調(diào)整內(nèi)存參數(shù),例如設置vm.drop_caches參數(shù)來清理緩存,釋放內(nèi)存。執(zhí)行echo 3 > /proc/sys/vm/drop_caches命令,可以清理系統(tǒng)緩存,包括頁面緩存、dentries 緩存和 inode 緩存等,使內(nèi)存得到更有效的利用,避免因內(nèi)存碎片導致的性能下降 。
2.3存儲:數(shù)據(jù)的穩(wěn)固基石
存儲設備是數(shù)據(jù)的存儲載體,其性能對系統(tǒng)的穩(wěn)定性和數(shù)據(jù)讀寫速度有著重要影響。將系統(tǒng)盤和數(shù)據(jù)盤更換為 SSD 能顯著提升 I/O 性能。SSD 采用閃存芯片作為存儲介質(zhì),相比傳統(tǒng)的機械硬盤,它沒有機械轉動部件,數(shù)據(jù)讀寫速度更快。以視頻網(wǎng)站為例,每天都有大量的用戶請求視頻資源,如果使用傳統(tǒng)機械硬盤存儲視頻文件,在高并發(fā)訪問時,機械硬盤的讀寫速度很難滿足需求,會導致視頻加載緩慢、卡頓等問題。而使用 SSD 后,由于其快速的數(shù)據(jù)讀寫能力,能夠快速響應大量的用戶請求,保證視頻流暢播放,大大提升了用戶體驗 。
常見的 RAID 技術如 RAID 5、RAID 10 等,在不同業(yè)務場景下能提升數(shù)據(jù)可靠性和讀寫性能。RAID 5 通過奇偶校驗的方式,將數(shù)據(jù)和校驗信息分布存儲在多個磁盤上,允許一塊磁盤出現(xiàn)故障而不丟失數(shù)據(jù),同時讀寫性能也有一定提升。它適用于對數(shù)據(jù)可靠性有一定要求,同時對讀寫性能也有一定需求的場景,比如一般的企業(yè)文件服務器。而 RAID 10 結合了 RAID 1 的鏡像和 RAID 0 的條帶化技術,既提供了 100% 的數(shù)據(jù)冗余,又有較高的讀寫速度,適用于對數(shù)據(jù)安全和性能要求都極高的場景,如金融交易系統(tǒng),在保證數(shù)據(jù)絕對安全的同時,能快速處理大量的交易數(shù)據(jù) 。
2.4網(wǎng)絡:連接世界的紐帶
網(wǎng)絡是 Linux 系統(tǒng)與外界通信的橋梁,其性能影響著數(shù)據(jù)傳輸?shù)乃俣群头€(wěn)定性。選擇千兆或萬兆網(wǎng)卡對提高網(wǎng)絡帶寬和吞吐量至關重要。對于云計算服務提供商來說,需要處理大量用戶的云存儲、云計算請求,數(shù)據(jù)傳輸量巨大,如果使用百兆網(wǎng)卡,網(wǎng)絡帶寬很容易成為瓶頸,導致用戶數(shù)據(jù)上傳下載速度緩慢。而升級到千兆或萬兆網(wǎng)卡后,能夠大大提高網(wǎng)絡帶寬和吞吐量,滿足大量數(shù)據(jù)傳輸?shù)男枨?,提升服務質(zhì)量。同樣,對于大型游戲公司的服務器,在游戲高并發(fā)時段,大量玩家同時在線進行游戲數(shù)據(jù)交互,高性能的網(wǎng)卡可以確保游戲數(shù)據(jù)的快速傳輸,減少游戲延遲,為玩家提供更流暢的游戲體驗 。
配置網(wǎng)絡 QoS(Quality of Service)策略可以為不同應用分配不同帶寬優(yōu)先級。在企業(yè)網(wǎng)絡中,視頻會議、關鍵業(yè)務系統(tǒng)等應用對網(wǎng)絡質(zhì)量要求較高,需要保證穩(wěn)定的帶寬和低延遲。通過配置 QoS 策略,可以為這些關鍵應用設置高優(yōu)先級,確保在網(wǎng)絡繁忙時,關鍵應用仍然能夠獲得足夠的帶寬,正常穩(wěn)定運行。比如,將視頻會議的流量優(yōu)先級設置為最高,當網(wǎng)絡帶寬不足時,優(yōu)先保障視頻會議的流暢進行,避免出現(xiàn)卡頓、掉線等問題,而對于一些非關鍵的應用,如員工的網(wǎng)頁瀏覽、文件下載等,可以設置較低的優(yōu)先級,在網(wǎng)絡空閑時再進行數(shù)據(jù)傳輸 。
三、軟件優(yōu)化:為 Linux 注入 “智慧靈魂”
軟件是 Linux 系統(tǒng)的靈魂,合理的軟件配置和優(yōu)化能夠充分發(fā)揮硬件的性能,讓系統(tǒng)運行更加高效、穩(wěn)定。接下來,我將從內(nèi)核參數(shù)調(diào)優(yōu)、進程與資源管理、內(nèi)存管理優(yōu)化以及網(wǎng)絡優(yōu)化這幾個關鍵方面,為大家詳細介紹 Linux 軟件優(yōu)化的策略和方法 。
3.1內(nèi)核參數(shù)調(diào)優(yōu):系統(tǒng)的深度定制
內(nèi)核是 Linux 系統(tǒng)的核心,它就像一個幕后指揮官,負責管理系統(tǒng)的各種資源和功能。通過調(diào)整內(nèi)核參數(shù),我們可以對系統(tǒng)進行深度定制,使其更好地適應不同的應用場景和業(yè)務需求 。
(1)關鍵參數(shù)解讀
文件系統(tǒng)緩沖區(qū)大?。阂詖m.dirty_background_ratio和vm.dirty_ratio這兩個參數(shù)為例,vm.dirty_background_ratio表示系統(tǒng)開始將臟頁(已修改但未寫回磁盤的數(shù)據(jù))刷寫到磁盤的觸發(fā)閾值,默認值通常為 10%。當系統(tǒng)中臟頁的比例達到這個閾值時,內(nèi)核會啟動一個后臺線程,將臟頁逐漸寫回磁盤,就像倉庫管理員看到倉庫里的臨時貨物(臟頁)達到一定比例時,開始安排工人將貨物搬運回正式倉庫(磁盤)。vm.dirty_ratio則是寫操作的上限,默認值一般為 20% - 40%,當臟頁比例達到這個值時,所有的寫操作都會被阻塞,直到臟頁被寫回磁盤,這就像是倉庫的臨時存儲區(qū)滿了,新的貨物(寫操作)就進不來了,必須等部分貨物被搬運走(臟頁寫回磁盤)才行。這兩個參數(shù)對系統(tǒng) I/O 性能有著重要影響,如果設置不當,可能會導致磁盤 I/O 頻繁,影響系統(tǒng)性能 。
內(nèi)核共享內(nèi)存:kernel.shmmax和kernel.shmall這兩個參數(shù)分別控制系統(tǒng)允許的最大共享內(nèi)存段大小和系統(tǒng)總的共享內(nèi)存頁數(shù)。在處理數(shù)據(jù)庫和大規(guī)模數(shù)據(jù)處理時,這兩個參數(shù)的調(diào)優(yōu)尤為重要。例如,在一個大型數(shù)據(jù)庫服務器中,需要大量的共享內(nèi)存來存儲數(shù)據(jù)庫的索引和數(shù)據(jù)緩存,以提高查詢和寫入的速度。如果kernel.shmmax設置過小,可能會導致數(shù)據(jù)庫無法分配足夠的共享內(nèi)存,從而影響性能。kernel.shmmax通常設置為物理內(nèi)存的 50% - 75%,具體數(shù)值需要根據(jù)應用需求和服務器內(nèi)存大小來調(diào)整 。
(2)參數(shù)調(diào)整實踐
以日志服務器、文件存儲服務器等經(jīng)常讀寫文件的應用為例,我們可以根據(jù)系統(tǒng)負載和應用特點,在/sys、/proc目錄下調(diào)整內(nèi)核參數(shù),實現(xiàn)性能提升。假設我們有一個日志服務器,每天會產(chǎn)生大量的日志文件,為了提高日志寫入的效率,我們可以適當增大vm.dirty_background_ratio和vm.dirty_ratio的值,比如將vm.dirty_background_ratio設置為 15,vm.dirty_ratio設置為 30。在/etc/sysctl.conf文件中添加或修改以下兩行:
vm.dirty_background_ratio = 15
vm.dirty_ratio = 30然后執(zhí)行sudo sysctl -p使修改生效。這樣,系統(tǒng)在處理日志寫入時,會在臟頁比例達到 15% 時開始將臟頁刷寫到磁盤,并且允許臟頁比例達到 30% 時才阻塞寫操作,從而減少了磁盤 I/O 的次數(shù),提高了日志寫入的效率 。
(3)禁用無用模塊
在 Linux 系統(tǒng)中,默認會加載一些內(nèi)核模塊,但有些模塊在實際使用中可能并不需要,比如服務器作為 Web 服務器時,藍牙、紅外等設備相關模塊就屬于無用模塊。這些無用模塊不僅會占用系統(tǒng)資源,還可能影響系統(tǒng)的啟動速度和穩(wěn)定性。我們可以使用lsmod命令查看當前系統(tǒng)加載的所有內(nèi)核模塊,然后使用rmmod命令卸載不需要的模塊。例如,要卸載藍牙模塊bluetooth,可以執(zhí)行sudo rmmod bluetooth。為了防止系統(tǒng)下次啟動時自動加載這些模塊,我們可以在/etc/modprobe.d/目錄下創(chuàng)建一個自定義的配置文件,比如disable_unused_modules.conf,在文件中添加blacklist bluetooth和blacklist infrared等內(nèi)容,這樣系統(tǒng)在啟動時就不會加載藍牙和紅外模塊了,從而減小了內(nèi)核體積,加快了啟動速度,降低了內(nèi)存占用 。
3.2進程與資源管理:合理分配系統(tǒng)資源
進程是 Linux 系統(tǒng)中正在運行的程序?qū)嵗?,它們就像一個個忙碌的工人,需要消耗系統(tǒng)的各種資源。合理管理進程和分配資源,能夠確保系統(tǒng)的高效運行,避免資源浪費和沖突 。
(1)優(yōu)先級調(diào)整
在 Linux 系統(tǒng)中,每個進程都有一個優(yōu)先級,優(yōu)先級決定了進程獲取 CPU 資源的先后順序。我們可以使用nice和renice命令來調(diào)整進程優(yōu)先級。nice命令用于在進程啟動時設置其優(yōu)先級,而renice命令用于改變已運行進程的優(yōu)先級。進程優(yōu)先級通常使用 nice 值來表示,nice 值范圍從 -20 到 19,其中 -20 表示最高優(yōu)先級,19 表示最低優(yōu)先級,默認情況下,進程的 nice 值是 0。
比如,我們有一個視頻轉碼任務,它對 CPU 資源需求較大,而且任務時間較長,如果讓它以默認優(yōu)先級運行,可能會影響其他關鍵進程的運行,比如 Web 服務器的響應速度。這時,我們可以在啟動視頻轉碼任務時,使用nice命令降低其優(yōu)先級。假設視頻轉碼任務的命令是ffmpeg -i input.mp4 output.mp4,我們可以使用以下命令啟動它,并將 nice 值設置為 10,降低其優(yōu)先級:
nice -n 10 ffmpeg -i input.mp4 output.mp4如果視頻轉碼任務已經(jīng)在運行,我們可以使用renice命令來調(diào)整其優(yōu)先級。首先,我們需要使用ps -ef | grep ffmpeg命令找到視頻轉碼任務的進程 ID,假設進程 ID 為 1234,然后使用以下命令將其 nice 值設置為 15,進一步降低優(yōu)先級:
sudo renice -n 15 1234需要注意的是,普通用戶只能提高 nice 值(即降低優(yōu)先級),而只有超級用戶(root)才能降低 nice 值(即提高優(yōu)先級) 。
(2)資源限制
cgroups(control groups)是 Linux 內(nèi)核提供的一種資源管理機制,它可以對 CPU、內(nèi)存、磁盤 I/O 等資源進行精細化管理,就像一個資源分配器,能夠根據(jù)我們的需求,為不同的進程組分配合理的資源,防止某個進程組過度占用資源導致系統(tǒng)卡頓。
以限制某個進程組的內(nèi)存使用為例,我們可以使用 cgroups 來實現(xiàn)。首先,創(chuàng)建一個 cgroups 目錄,假設我們要限制的進程組是video_process,可以在/sys/fs/cgroup/memory/目錄下創(chuàng)建一個名為video_process的子目錄:
sudo mkdir /sys/fs/cgroup/memory/video_process然后,在這個目錄下設置內(nèi)存限制參數(shù)。比如,我們要將該進程組的內(nèi)存使用限制在 1GB 以內(nèi),可以編輯memory.limit_in_bytes文件,寫入 1073741824(1GB = 1024 * 1024 * 1024 = 1073741824 字節(jié)):
sudo sh -c 'echo 1073741824 > /sys/fs/cgroup/memory/video_process/memory.limit_in_bytes'接下來,將需要限制內(nèi)存的進程添加到這個 cgroups 組中。假設視頻轉碼進程的 ID 為 1234,可以將其寫入tasks文件:
sudo sh -c 'echo 1234 > /sys/fs/cgroup/memory/video_process/tasks'這樣,視頻轉碼進程的內(nèi)存使用就被限制在了 1GB 以內(nèi)。如果該進程試圖使用超過 1GB 的內(nèi)存,系統(tǒng)會根據(jù) cgroups 的配置進行處理,比如發(fā)出警告或者終止進程,從而保證系統(tǒng)的穩(wěn)定性和其他進程的正常運行 。
3.3內(nèi)存管理優(yōu)化:高效利用內(nèi)存資源
內(nèi)存是 Linux 系統(tǒng)中非常重要的資源,它就像一個臨時倉庫,程序運行時需要的數(shù)據(jù)和代碼都存儲在內(nèi)存中。合理管理內(nèi)存,能夠提高系統(tǒng)的運行效率,避免內(nèi)存泄漏和過度使用導致的系統(tǒng)性能下降 。
swappiness 參數(shù)調(diào)整:
swappiness是 Linux 內(nèi)核的一個重要參數(shù),用于控制系統(tǒng)在內(nèi)存壓力下使用 Swap 空間的傾向程度,取值范圍是 0 到 100,單位是百分比(%)。當系統(tǒng)物理內(nèi)存不足時,會將內(nèi)存中暫時不用的數(shù)據(jù)轉移到磁盤的 Swap 空間中,這個過程稱為內(nèi)存交換(swap)。swappiness值越高(如 60 - 100),內(nèi)核會更早、更積極地使用 Swap 空間;值越低(如 0 - 30),內(nèi)核會盡量避免使用 Swap 空間,盡量使用物理內(nèi)存;值為 0 時,除非內(nèi)存耗盡(OOM,Out of Memory),否則完全不使用 Swap 空間 。
對于不同的應用場景,我們需要合理設置swappiness的值。在桌面環(huán)境中,由于用戶通常會同時運行多個應用程序,而且對系統(tǒng)響應速度要求較高,為了避免因頻繁內(nèi)存交換導致的系統(tǒng)卡頓,可以將swappiness值設置得較低,比如 10。在高性能計算場景中,對內(nèi)存的讀寫速度要求極高,而磁盤 I/O 速度相對較慢,頻繁的內(nèi)存交換會嚴重影響計算效率,因此也應將swappiness值設置得很低,甚至可以設置為 0。對于數(shù)據(jù)庫服務器,由于數(shù)據(jù)庫有自己優(yōu)化的內(nèi)存管理機制,并且對數(shù)據(jù)的讀寫性能要求很高,通常建議將swappiness值設置為 1 - 10 。
我們可以使用以下命令查看當前swappiness的值:
cat /proc/sys/vm/swappiness或者使用sysctl命令:
sysctl vm.swappiness如果要臨時修改swappiness的值,比如將其設置為 10,可以使用以下命令:
sudo sysctl vm.swappiness=10如果要永久修改swappiness的值,需要編輯/etc/sysctl.conf文件,添加或修改以下行:
vm.swappiness = 10然后執(zhí)行sudo sysctl -p使修改生效 。
內(nèi)存監(jiān)控與分析:
為了及時發(fā)現(xiàn)內(nèi)存問題,我們需要使用一些內(nèi)存監(jiān)控和分析工具。top和htop是實時顯示系統(tǒng)資源使用情況的工具,它們可以顯示 CPU、內(nèi)存、磁盤 I/O 等資源的使用情況,其中關于內(nèi)存的信息包括已使用內(nèi)存、空閑內(nèi)存、共享內(nèi)存、緩沖區(qū)內(nèi)存以及 Swap 空間的使用情況等。在top命令的輸出中,Mem行顯示的是物理內(nèi)存的使用情況,Swap行顯示的是 Swap 空間的使用情況;在htop命令的輸出中,也有類似的內(nèi)存使用信息展示,并且以更直觀的方式呈現(xiàn),比如用不同顏色的進度條表示內(nèi)存和 Swap 的使用比例 。
free命令用于查看系統(tǒng)內(nèi)存的使用情況,它會顯示系統(tǒng)的總內(nèi)存、已使用內(nèi)存、空閑內(nèi)存、共享內(nèi)存、緩沖區(qū)內(nèi)存以及 Swap 空間的大小。例如,執(zhí)行free -h命令,會以人類可讀的格式輸出內(nèi)存使用信息,其中-h參數(shù)表示以易讀的方式顯示內(nèi)存大小,如1.5G、200M等 。
vmstat 命令可以報告關于進程、內(nèi)存、分頁、塊 I/O 、陷阱和 CPU 活動的信息,通過它我們可以了解內(nèi)存的分頁情況,比如每秒的換入(si)和換出(so)頁數(shù)。如果si和so的值較大,說明系統(tǒng)正在頻繁進行內(nèi)存交換,可能存在內(nèi)存不足的問題 。
pmap命令用于查看進程的內(nèi)存映射情況,它可以顯示每個進程占用的內(nèi)存地址范圍、內(nèi)存類型(如代碼段、數(shù)據(jù)段、堆、棧等)以及對應的文件映射等信息。通過pmap,我們可以分析某個進程的內(nèi)存使用是否合理,是否存在內(nèi)存泄漏的跡象 。
除了使用這些工具監(jiān)控內(nèi)存指標,我們還可以結合日志分析工具(如dmesg或journalctl)來快速定位內(nèi)存泄漏或過度使用的問題根源。dmesg命令用于查看內(nèi)核環(huán)形緩沖區(qū)的消息,其中包含了系統(tǒng)啟動過程中的各種信息以及內(nèi)核運行時的一些重要事件,當系統(tǒng)出現(xiàn)內(nèi)存問題時,可能會在dmesg的輸出中找到相關的錯誤信息或警告。journalctl是一個用于查詢和顯示 systemd 日志的工具,它可以查看系統(tǒng)日志、服務日志等,通過分析這些日志,我們可以了解系統(tǒng)在內(nèi)存方面的運行情況,找出內(nèi)存問題的線索 。
透明大頁啟用與配置:
透明大頁(THP,Transparent Huge Pages是Linux內(nèi)核的一種內(nèi)存管理機制,它允許操作系統(tǒng)使用更大的內(nèi)存頁,從而減少頁表項的數(shù)量,降低TLB(Translation Lookaside Buffer失效率,提高內(nèi)存訪問效率。在傳統(tǒng)的內(nèi)存管理中,內(nèi)存頁大小通常為4KB,而使用透明大頁后,內(nèi)存頁大小可以達到2MB甚至更大。這對于數(shù)據(jù)庫和大型應用程序尤其有用,因為它們通常需要大量的連續(xù)內(nèi)存空間,使用大頁可以減少內(nèi)存碎片,提高內(nèi)存利用率 。
我們可以使用以下命令檢查 THP 的當前狀態(tài):
cat /sys/kernel/mm/transparent_hugepage/enabled如果輸出結果為[always] madvise never,表示 THP 已啟用并且始終使用大頁;如果輸出結果為madvise [never],表示 THP 已禁用 。
在不同的應用場景下,我們需要合理配置 THP。在數(shù)據(jù)庫服務器中,由于數(shù)據(jù)庫對內(nèi)存訪問性能要求很高,通常建議啟用 THP。可以通過編輯/etc/default/grub文件,在GRUB_CMDLINE_LINUX 參數(shù)中添加transparent_hugepage=always,然后執(zhí)行sudo update-grub更新 GRUB 配置,重啟系統(tǒng)后,THP 就會始終啟用 。
在虛擬化環(huán)境中,THP 的配置需要更加謹慎。雖然啟用 THP 可以提高內(nèi)存訪問效率,但在某些情況下,過度啟用 THP 可能會導致性能問題。比如,在多個虛擬機共享物理內(nèi)存的情況下,如果每個虛擬機都啟用 THP,可能會導致內(nèi)存競爭加劇,反而降低系統(tǒng)性能。因此,在虛擬化環(huán)境中,需要根據(jù)實際情況進行測試和調(diào)整,確定是否啟用 THP 以及如何配置 。
3.4網(wǎng)絡優(yōu)化:保障數(shù)據(jù)的高速傳輸
網(wǎng)絡是 Linux 系統(tǒng)與外界通信的橋梁,它就像一條信息高速公路,網(wǎng)絡性能的優(yōu)劣直接影響著數(shù)據(jù)傳輸?shù)乃俣群头€(wěn)定性。接下來,我將從應用程序優(yōu)化、套接字優(yōu)化、傳輸層優(yōu)化以及網(wǎng)絡層優(yōu)化這幾個方面,為大家介紹如何提升 Linux 系統(tǒng)的網(wǎng)絡性能 。
應用程序優(yōu)化:
在應用程序?qū)用?,我們可以采用一些?yōu)化措施來提升網(wǎng)絡性能。I/O 多路復用技術是一種高效的 I/O 處理方式,epoll是 Linux 內(nèi)核提供的 I/O 多路復用機制,它相比傳統(tǒng)的select和poll有更高的性能和可擴展性。select和poll需要遍歷所有的文件描述符來檢查是否有事件發(fā)生,而epoll使用事件驅(qū)動的方式,當有事件發(fā)生時,內(nèi)核會主動通知應用程序,大大減少了系統(tǒng)開銷。在一個高并發(fā)的 Web 服務器中,使用epoll可以同時處理大量的客戶端連接,提高服務器的并發(fā)處理能力 。
異步 I/O(AIO,Asynchronous I/O)也是一種提升 I/O 性能的技術,它允許應用程序在進行 I/O 操作時,不需要等待操作完成就可以繼續(xù)執(zhí)行其他任務,從而提高了系統(tǒng)的并發(fā)性能。AIO 適用于那些對 I/O 響應時間要求較高的應用場景,如實時數(shù)據(jù)處理、多媒體應用等 。
除了這些技術,我們還可以通過一些其他優(yōu)化措施來提升網(wǎng)絡性能。使用長連接取代短連接可以減少連接建立和斷開的開銷,提高數(shù)據(jù)傳輸效率。在一個在線游戲服務器中,如果每個玩家與服務器之間都采用短連接,每次發(fā)送和接收數(shù)據(jù)都要建立和斷開連接,會消耗大量的系統(tǒng)資源和網(wǎng)絡帶寬。而采用長連接后,玩家與服務器之間保持持續(xù)的連接,數(shù)據(jù)可以隨時傳輸,大大提高了游戲的流暢性 。
緩存不常變化的數(shù)據(jù)可以減少網(wǎng)絡傳輸?shù)拇螖?shù),提高響應速度。比如,在一個新聞網(wǎng)站中,對于一些不經(jīng)常更新的新聞內(nèi)容,可以將其緩存到本地,當用戶再次請求時,直接從本地緩存中讀取,而不需要再次從服務器獲取,這樣既減輕了服務器的壓力,又提高了用戶的訪問速度 。
壓縮網(wǎng)絡 I/O 數(shù)據(jù)量可以減少數(shù)據(jù)傳輸?shù)拇笮?,提高傳輸速度。?Web 服務器中,啟用 Gzip 壓縮功能可以將網(wǎng)頁內(nèi)容進行壓縮后再傳輸給客戶端,這樣可以大大減少數(shù)據(jù)傳輸量,尤其是對于一些文本內(nèi)容較多的網(wǎng)頁,壓縮效果更為明顯。客戶端接收到壓縮數(shù)據(jù)后,會自動解壓縮并顯示 。
減少 DNS 解析延遲可以加快網(wǎng)絡請求的速度。DNS 解析是將域名轉換為 IP 地址的過程,如果 DNS 解析延遲過高,會導致網(wǎng)絡請求變慢。我們可以通過配置本地 DNS 緩存服務器,如dnsmasq,來減少 DNS 解析的次數(shù),提高解析速度。dnsmasq會緩存最近解析過的域名和 IP 地址對應關系,當再次請求相同的域名時,直接從緩存中獲取 IP 地址,而不需要向外部 DNS 服務器查詢 。
套接字優(yōu)化:
套接字是網(wǎng)絡通信的端點,通過調(diào)整套接字緩沖區(qū)大小可以提高網(wǎng)絡性能。在 Linux 系統(tǒng)中,有幾個關鍵的套接字緩沖區(qū)大小參數(shù)需要我們關注,包括net.core.optmem_max、net.core.rmem_max、`net.core。
四、實戰(zhàn)演練:讓理論落地生根
前面我們已經(jīng)學習了 Linux 性能優(yōu)化的理論知識,接下來就通過實戰(zhàn)演練,讓這些理論真正落地生根,幫助我們解決實際的性能問題 。
4.1模擬性能問題場景
在正式進行性能優(yōu)化之前,我們需要先在測試環(huán)境中模擬出常見的性能問題場景,這樣才能有針對性地進行優(yōu)化操作 。
(1)高并發(fā)訪問模擬:使用 Apache JMeter 工具來模擬 Web 服務器的高并發(fā)訪問場景。JMeter 是一款功能強大的開源性能測試工具,它可以模擬多個用戶同時向服務器發(fā)送 HTTP 請求,以此來測試服務器在高并發(fā)情況下的性能表現(xiàn) 。
具體操作如下:
- 下載并安裝 JMeter,你可以從 JMeter 官方網(wǎng)站(https://jmeter.apache.org/download_jmeter.cgi)下載最新版本的 JMeter 壓縮包,解壓后即可使用 。
 - 打開 JMeter,創(chuàng)建一個新的測試計劃。在測試計劃中,添加一個線程組,設置線程數(shù)為 100(即模擬 100 個并發(fā)用戶),循環(huán)次數(shù)為 1000(即每個用戶發(fā)送 1000 次請求) 。
 - 在線程組下添加 HTTP 請求,設置請求的 URL 為你要測試的 Web 服務器地址和端口,例如http://192.168.1.100:8080/index.html 。
 - 運行測試計劃,觀察 JMeter 的結果樹和聚合報告,查看服務器的響應時間、吞吐量、錯誤率等性能指標 。
 
(2)內(nèi)存泄漏模擬:在 C 語言中,我們可以通過編寫一個簡單的程序來模擬內(nèi)存泄漏。以下是一個示例代碼:
#include <stdio.h>
#include <stdlib.h>
int main() {
    while (1) {
        char *ptr = (char *)malloc(1024 * 1024);  // 每次分配1MB內(nèi)存
        if (ptr == NULL) {
            perror("malloc failed");
            return 1;
        }
        // 這里沒有釋放內(nèi)存,導致內(nèi)存泄漏
    }
    return 0;
}編譯并運行這個程序,隨著時間的推移,你會發(fā)現(xiàn)系統(tǒng)的內(nèi)存使用率不斷上升,這就是內(nèi)存泄漏的表現(xiàn) 。
(3)磁盤 I/O 繁忙模擬:使用dd命令來模擬磁盤 I/O 繁忙場景。dd命令可以用來復制文件,并且可以指定讀寫的塊大小和數(shù)量,通過不斷地進行大文件的讀寫操作,就能使磁盤處于繁忙狀態(tài) 。
例如,以下命令可以在/tmp目錄下創(chuàng)建一個大小為 1GB 的文件,并持續(xù)對其進行讀寫操作:
# 創(chuàng)建一個1GB的文件
dd if=/dev/zero of=/tmp/bigfile bs=1M count=1024
# 持續(xù)讀取文件
while true; do dd if=/tmp/bigfile of=/dev/null bs=1M; done
# 持續(xù)寫入文件
while true; do dd if=/dev/urandom of=/tmp/bigfile bs=1M; done運行這些命令后,使用iostat命令查看磁盤的 I/O 情況,你會發(fā)現(xiàn)磁盤的使用率很高,處于繁忙狀態(tài) 。
4.2性能分析與定位
模擬出性能問題場景后,接下來就要使用各種性能分析工具,對系統(tǒng)進行性能分析,找出性能瓶頸所在 。
top 工具:top是 Linux 系統(tǒng)中最常用的性能監(jiān)控工具之一,它可以實時顯示系統(tǒng)中各個進程的資源使用情況,包括 CPU 使用率、內(nèi)存使用率、交換空間使用情況等 。
在模擬高并發(fā)訪問場景時,運行top命令,你會看到 CPU 使用率可能會飆升,并且某些進程的 CPU 使用率會很高,這可能就是性能瓶頸所在。例如,如果 Web 服務器進程(如httpd或nginx)的 CPU 使用率持續(xù)高于 80%,就說明該進程可能存在性能問題,需要進一步分析 。
htop 工具:htop是top的增強版,它提供了更友好的界面和更多的功能,支持鼠標操作,能夠更直觀地查看系統(tǒng)資源使用情況 。
在模擬內(nèi)存泄漏場景時,使用htop命令,你可以看到內(nèi)存使用率不斷上升,并且進程占用的內(nèi)存也在持續(xù)增加。通過htop的界面,你可以輕松地找到占用內(nèi)存最多的進程,判斷是否是該進程導致了內(nèi)存泄漏 。
vmstat 工具:vmstat 命令用于報告虛擬內(nèi)存、進程、CPU 活動等的統(tǒng)計信息,它可以顯示系統(tǒng)整體的性能指標 。
在模擬磁盤 I/O 繁忙場景時,運行 vmstat 1(每 1 秒報告一次系統(tǒng)狀態(tài)),觀察io 部分的 bi(從塊設備讀的數(shù)據(jù)量)和 bo(寫到塊設備的數(shù)據(jù)量)指標,如果這兩個值持續(xù)很高,就說明磁盤 I/O 繁忙,可能是磁盤性能瓶頸 。同時,還可以觀察wa(I/O 等待時間百分比)指標,如果wa值較高,也表明系統(tǒng)存在 I/O 性能問題 。
sar 工具:sar(System Activity Reporter)是一個系統(tǒng)活動報告工具,它可以收集、報告和保存系統(tǒng)活動信息,包括 CPU 使用率、內(nèi)存使用情況、磁盤 I/O 等 。
例如,使用sar -u 1 10命令可以每 1 秒收集一次 CPU 使用情況,共收集 10 次。通過分析sar的輸出結果,可以了解 CPU 在不同時間段的使用情況,找出 CPU 使用率高的時間段和原因 。使用sar -b 1命令可以實時查看磁盤 I/O 的讀寫情況,包括每秒的讀塊數(shù)、寫塊數(shù)等,幫助我們定位磁盤 I/O 性能問題 。
4.3優(yōu)化實施與效果驗證
通過性能分析定位到性能瓶頸后,就可以按照前文介紹的優(yōu)化策略進行優(yōu)化操作,并驗證優(yōu)化效果 。
(1)優(yōu)化實施
針對 CPU 使用率過高:如果是因為某個進程占用過多 CPU 資源,可以使用nice或renice命令調(diào)整該進程的優(yōu)先級,降低其對 CPU 的占用。例如,假設某個進程的 PID 為 1234,使用renice -n 10 1234命令可以將其 nice 值設置為 10,降低其優(yōu)先級 。如果是系統(tǒng)負載過高,可以考慮增加 CPU 核心數(shù),或者優(yōu)化程序代碼,減少不必要的計算操作 。
針對內(nèi)存泄漏:對于前面模擬的 C 語言內(nèi)存泄漏程序,需要在代碼中添加內(nèi)存釋放語句。修改后的代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
    while (1) {
        char *ptr = (char *)malloc(1024 * 1024);  // 每次分配1MB內(nèi)存
        if (ptr == NULL) {
            perror("malloc failed");
            return 1;
        }
        // 釋放內(nèi)存
        free(ptr);
        ptr = NULL;
    }
    return 0;
}重新編譯并運行修改后的程序,內(nèi)存使用率將不再持續(xù)上升,內(nèi)存泄漏問題得到解決 。
針對磁盤 I/O 性能低下:如果是磁盤老化導致的性能問題,可以考慮更換為 SSD 硬盤。如果是文件系統(tǒng)碎片化問題,可以使用e4defrag等工具對文件系統(tǒng)進行碎片整理 。在模擬磁盤 I/O 繁忙場景中,我們可以通過調(diào)整dd命令的參數(shù),如減小塊大?。╞s),來降低磁盤 I/O 的壓力 。同時,還可以優(yōu)化應用程序的 I/O 操作,采用異步 I/O 等技術,提高 I/O 效率 。
(2)效果驗證
在優(yōu)化操作完成后,再次運行性能測試,觀察系統(tǒng)性能指標的變化。
- 響應時間縮短:在模擬高并發(fā)訪問場景中,優(yōu)化前Web服務器的平均響應時間可能為 500ms,優(yōu)化后可能縮短到100ms,這表明系統(tǒng)的響應速度得到了顯著提升。
吞吐量增加:優(yōu)化前服務器的吞吐量可能為 1000 請求 / 秒,優(yōu)化后可能增加到 5000 請求 / 秒,說明系統(tǒng)處理請求的能力增強了。 - 資源利用率降低:在模擬內(nèi)存泄漏和磁盤 I/O 繁忙場景中,優(yōu)化后內(nèi)存使用率和磁盤使用率都明顯降低,系統(tǒng)資源得到了更合理的利用。
 
通過對比優(yōu)化前后的性能指標,我們可以直觀地看到優(yōu)化策略的有效性,證明我們的優(yōu)化操作是成功的 。在實際應用中,可能需要反復進行性能分析和優(yōu)化,直到系統(tǒng)性能達到預期目標 。















 
 
 








 
 
 
 