偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux緩存調(diào)優(yōu)實(shí)戰(zhàn),讓服務(wù)器飛起來!

系統(tǒng) Linux
在 Linux 系統(tǒng)中,緩存的重要性不言而喻。它就像是服務(wù)器性能的 “加速器”,能顯著提升服務(wù)器的響應(yīng)速度和整體性能。

在深入探討 Linux 緩存調(diào)優(yōu)之前,我們先來搞清楚緩存到底是什么。簡單來說,緩存是一種高速存儲機(jī)制,它就像是一個(gè)數(shù)據(jù)的臨時(shí) “中轉(zhuǎn)站”,把經(jīng)常訪問的數(shù)據(jù)存儲在其中 。當(dāng)程序需要讀取數(shù)據(jù)時(shí),會(huì)優(yōu)先從緩存中查找,如果找到了,就可以直接使用,大大提高了數(shù)據(jù)的訪問速度。

在 Linux 系統(tǒng)中,緩存的重要性不言而喻。它就像是服務(wù)器性能的 “加速器”,能顯著提升服務(wù)器的響應(yīng)速度和整體性能。我們知道,磁盤 I/O 操作相對較慢,而內(nèi)存的讀寫速度則快得多。緩存的存在,就像是在慢速的磁盤和快速的 CPU 之間搭建了一座橋梁,通過將頻繁訪問的數(shù)據(jù)存儲在內(nèi)存中,減少了對磁盤的 I/O 操作,從而加快了數(shù)據(jù)的訪問速度,提高了系統(tǒng)的整體性能 。例如,當(dāng)我們的服務(wù)器需要頻繁讀取某個(gè)文件時(shí),如果這個(gè)文件被緩存到內(nèi)存中,下次讀取時(shí)就可以直接從內(nèi)存中獲取,而不需要再從磁盤中讀取,大大縮短了讀取時(shí)間,提升了服務(wù)器的響應(yīng)速度。

一、認(rèn)識Linux緩存

在 Linux 系統(tǒng)中,緩存主要分為頁緩存(Page Cache)和 inode 緩存 ,它們在系統(tǒng)中起著不同但又至關(guān)重要的作用。

頁緩存是 Linux 緩存機(jī)制的核心,它主要緩存磁盤文件的內(nèi)容 。簡單來說,當(dāng)我們的程序讀取文件時(shí),內(nèi)核會(huì)先檢查頁緩存中是否有需要的數(shù)據(jù)。如果有,就直接從緩存中讀取,避免了從磁盤中讀取數(shù)據(jù)的開銷 。比如,我們有一個(gè) Web 服務(wù)器,它需要頻繁讀取一些靜態(tài)資源文件,如圖片、CSS、JavaScript 等。這些文件在第一次被讀取后,就會(huì)被緩存到頁緩存中。

當(dāng)后續(xù)有其他請求需要這些文件時(shí),就可以直接從頁緩存中獲取,大大提高了文件的讀取速度,減少了磁盤 I/O 操作 。頁緩存的工作原理基于局部性原理,即當(dāng)一個(gè)數(shù)據(jù)被訪問時(shí),它附近的數(shù)據(jù)也很可能在不久的將來被訪問。因此,頁緩存會(huì)預(yù)讀一部分?jǐn)?shù)據(jù),將其存儲在緩存中,以提高后續(xù)數(shù)據(jù)訪問的命中率 。

inode 緩存則主要用于緩存文件系統(tǒng)的元數(shù)據(jù),比如文件名、文件權(quán)限、文件大小、文件的創(chuàng)建時(shí)間和修改時(shí)間等 。當(dāng)我們要訪問一個(gè)文件時(shí),首先需要通過 inode 緩存找到文件的元數(shù)據(jù),然后才能進(jìn)一步讀取文件的內(nèi)容 。例如,當(dāng)我們在命令行中輸入ls命令查看目錄下的文件時(shí),系統(tǒng)會(huì)先在 inode 緩存中查找該目錄下所有文件的元數(shù)據(jù),然后將這些信息顯示出來。

如果沒有 inode 緩存,每次執(zhí)行l(wèi)s命令都需要從磁盤中讀取這些元數(shù)據(jù),這將大大降低系統(tǒng)的響應(yīng)速度 。inode 緩存通過將常用的元數(shù)據(jù)存儲在內(nèi)存中,減少了對磁盤的訪問次數(shù),提高了文件系統(tǒng)的性能 。

二、緩存性能指標(biāo)

在評估 Linux 緩存的性能時(shí),有幾個(gè)關(guān)鍵指標(biāo)是我們必須要關(guān)注的,它們就像是服務(wù)器性能的 “晴雨表”,能幫助我們準(zhǔn)確判斷緩存的工作狀態(tài)和性能優(yōu)劣 。

緩存命中率是其中最為重要的指標(biāo)之一,它是指直接通過緩存獲取數(shù)據(jù)的請求次數(shù),占所有數(shù)據(jù)請求次數(shù)的百分比 。簡單來說,如果緩存命中率高,就意味著大部分的數(shù)據(jù)請求都可以直接從緩存中獲取數(shù)據(jù),而不需要去訪問速度較慢的磁盤,這大大提高了數(shù)據(jù)的訪問效率,也就意味著緩存的利用效率高,系統(tǒng)性能好 。例如,一個(gè) Web 服務(wù)器的緩存命中率如果能達(dá)到 90% 以上,那就說明它的緩存配置非常合理,大部分用戶請求的數(shù)據(jù)都能快速從緩存中獲取,用戶體驗(yàn)自然就會(huì)很好 。

相反,如果緩存命中率很低,比如只有 30%,那就說明緩存沒有充分發(fā)揮作用,大部分?jǐn)?shù)據(jù)請求都需要去磁盤中讀取,這會(huì)導(dǎo)致系統(tǒng)響應(yīng)速度變慢,性能下降 。我們可以通過cachestat和cachetop等工具來查看緩存命中率 。其中,cachestat提供了整個(gè)操作系統(tǒng)緩存的讀寫命中情況,而cachetop則提供了每個(gè)進(jìn)程的緩存命中情況 。

緩存大小也不容忽視,它主要由文件系統(tǒng)緩存和頁面緩存兩部分組成 。緩存大小的設(shè)置直接影響著系統(tǒng)的性能 。當(dāng)緩存大小較小時(shí),系統(tǒng)往往會(huì)頻繁地從磁盤中讀取數(shù)據(jù),這會(huì)導(dǎo)致響應(yīng)延遲增加 。而當(dāng)緩存大小增加時(shí),系統(tǒng)可以將更多的數(shù)據(jù)存儲在內(nèi)存中,從而減少對磁盤的訪問次數(shù),提高響應(yīng)速度 。比如,對于一個(gè)需要頻繁讀取大量數(shù)據(jù)的數(shù)據(jù)庫管理系統(tǒng),如果緩存大小設(shè)置得足夠大,就能將更多的數(shù)據(jù)庫數(shù)據(jù)緩存到內(nèi)存中,大大提高數(shù)據(jù)的讀取速度 。

然而,緩存大小也不是越大越好,因?yàn)榫彺嬲加昧讼到y(tǒng)的內(nèi)存資源,如果緩存大小設(shè)置過大,可能會(huì)導(dǎo)致系統(tǒng)內(nèi)存不足,影響到其他任務(wù)的正常運(yùn)行 。同時(shí),緩存大小過大還可能會(huì)導(dǎo)致緩存命中率下降,因?yàn)橄到y(tǒng)可能會(huì)將更多的不常訪問的數(shù)據(jù)存儲在緩存中,導(dǎo)致熱門數(shù)據(jù)的緩存命中率下降 。我們可以使用free、vmstat等命令查看系統(tǒng)內(nèi)存和緩存的使用情況 ,也可以通過/proc/meminfo文件查看系統(tǒng)內(nèi)存信息,其中Cached字段表示頁緩存,Buffers字段表示緩沖區(qū) 。

緩存更新頻率同樣關(guān)鍵,它決定了緩存中的數(shù)據(jù)與磁盤中數(shù)據(jù)的一致性程度 。如果緩存更新頻率過低,可能會(huì)導(dǎo)致緩存中的數(shù)據(jù)過時(shí),應(yīng)用程序讀取到的數(shù)據(jù)不是最新的 。例如,對于一個(gè)實(shí)時(shí)更新的新聞網(wǎng)站,如果緩存更新頻率過低,用戶可能會(huì)看到舊的新聞內(nèi)容 。而如果緩存更新頻率過高,雖然能保證數(shù)據(jù)的實(shí)時(shí)性,但會(huì)增加系統(tǒng)的開銷,因?yàn)槊看胃戮彺娑夹枰M(jìn)行數(shù)據(jù)的讀取和寫入操作 。

對于更新頻率較低的資源,如一些靜態(tài)的 CSS、JavaScript 和圖片文件,我們可以設(shè)置較長的緩存時(shí)間,以減少對服務(wù)器的請求;而對于更新頻繁的資源,如新聞內(nèi)容、股票數(shù)據(jù)等,則需要設(shè)置較短的緩存時(shí)間,確??蛻舳四軌颢@取到最新的內(nèi)容 。在 Linux 系統(tǒng)中,緩存更新頻率與具體的應(yīng)用場景和配置有關(guān) ,可以通過調(diào)整相關(guān)的配置參數(shù)來控制 。

三、緩存調(diào)優(yōu)工具

“工欲善其事,必先利其器” ,在進(jìn)行 Linux 緩存調(diào)優(yōu)時(shí),我們需要借助一些強(qiáng)大的工具,它們就像是我們的 “得力助手”,能幫助我們更好地了解系統(tǒng)的緩存狀態(tài),從而進(jìn)行有針對性的調(diào)優(yōu) 。

sysctl 是一個(gè)非常重要的工具,它主要用于運(yùn)行時(shí)配置內(nèi)核參數(shù),這些參數(shù)位于/proc/sys目錄下 。通過 sysctl,我們可以動(dòng)態(tài)地調(diào)整內(nèi)核參數(shù),而不需要重啟系統(tǒng),這為我們的緩存調(diào)優(yōu)提供了極大的便利 。比如,我們可以使用sudo sysctl -w vm.swappiness=10命令來降低系統(tǒng)的交換傾向,減少不必要的磁盤 I/O 操作,提高緩存的使用效率 。

這里的vm.swappiness參數(shù)表示系統(tǒng)將內(nèi)存數(shù)據(jù)交換到磁盤的傾向程度,取值范圍是 0 - 100,默認(rèn)值一般是 60 。將其設(shè)置為 10,意味著系統(tǒng)會(huì)盡量避免將內(nèi)存數(shù)據(jù)交換到磁盤,更多地利用內(nèi)存緩存,從而提高系統(tǒng)性能 。如果我們想要永久保留這個(gè)配置,可以修改/etc/sysctl.conf文件,在文件中添加或修改vm.swappiness = 10這一行,然后執(zhí)行sudo sysctl -p命令使配置生效 。

free 命令則是用于查看系統(tǒng)內(nèi)存使用情況的常用工具 。它可以顯示系統(tǒng)的總內(nèi)存、已使用內(nèi)存、剩余內(nèi)存、共享內(nèi)存、緩存和緩沖區(qū)的使用情況等 。通過free -h命令,我們可以以人類可讀的方式查看內(nèi)存信息,非常直觀 。例如,執(zhí)行free -h后,可能會(huì)得到類似這樣的輸出:

total        used        free      shared  buff/cache   available
Mem:           15Gi       4.0Gi       8.6Gi       100Mi       2.8Gi       11Gi
Swap:          2.0Gi          0B       2.0Gi

在這個(gè)輸出中,total表示系統(tǒng)總物理內(nèi)存的大小,這里是 15Gi;used表示當(dāng)前被使用的內(nèi)存大小,為 4.0Gi;free表示當(dāng)前完全未被使用的內(nèi)存大小,是 8.6Gi;shared表示與多個(gè)進(jìn)程共享的內(nèi)存大小,為 100Mi;buff/cache表示由內(nèi)核用于緩存的內(nèi)存,包括文件系統(tǒng)緩沖區(qū)和文件緩存,這里是 2.8Gi;available表示可以立即分配給新進(jìn)程的內(nèi)存量,為 11Gi 。從這些信息中,我們可以快速了解系統(tǒng)內(nèi)存的使用狀況,判斷是否存在內(nèi)存不足的情況,以及緩存和緩沖區(qū)的使用情況 。

vmstat 也是一個(gè)強(qiáng)大的系統(tǒng)性能監(jiān)控工具,它可以展示給定時(shí)間間隔的服務(wù)器的狀態(tài)值,包括進(jìn)程、內(nèi)存、虛擬內(nèi)存交換情況、IO 讀寫情況等 。通過vmstat 1命令,我們可以每秒輸出一次系統(tǒng)性能數(shù)據(jù) 。例如,執(zhí)行vmstat 1后,可能會(huì)得到如下輸出:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 103388 145412 511056    0    0    18    60    1    1  2  1 96  0  0

在這個(gè)輸出中,r表示運(yùn)行隊(duì)列中等待被運(yùn)行的進(jìn)程數(shù)量,b表示等待 IO 的進(jìn)程數(shù)量;swpd表示虛擬內(nèi)存已使用的大小,如果大于 0,表示機(jī)器物理內(nèi)存不足;free表示空閑的物理內(nèi)存的大??;buff表示用作緩沖的內(nèi)存大小;cache表示用作緩存的內(nèi)存大??;si表示每秒從磁盤讀入虛擬內(nèi)存的大??;so表示每秒虛擬內(nèi)存寫入磁盤的大??;bi表示塊設(shè)備每秒接收的塊數(shù)量;bo表示塊設(shè)備每秒發(fā)送的塊數(shù)量;in表示每秒 CPU 的中斷次數(shù),包括時(shí)間中斷;cs表示每秒上下文切換次數(shù);us表示用戶 CPU 時(shí)間;sy表示系統(tǒng) CPU 時(shí)間;id表示空閑 CPU 時(shí)間;wa表示等待 IO CPU 時(shí)間 。通過分析這些數(shù)據(jù),我們可以深入了解系統(tǒng)的性能瓶頸,判斷是否存在內(nèi)存瓶頸、IO 瓶頸等問題,從而為緩存調(diào)優(yōu)提供依據(jù) 。

cachestat 和 cachetop 是用于查看系統(tǒng)緩存命中情況的工具 。cachestat 提供了整個(gè)操作系統(tǒng)緩存的讀寫命中情況,而 cachetop 則提供了每個(gè)進(jìn)程的緩存命中情況 。這兩個(gè)工具都是 bcc 軟件包的一部分,它們基于 Linux 內(nèi)核的 eBPF(extended Berkeley Packet Filters)機(jī)制,來跟蹤內(nèi)核中管理的緩存,并輸出緩存的使用情況 。在 Ubuntu 系統(tǒng)中,我們可以通過以下命令安裝 bcc 軟件包:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD
echo "deb https://repo.iovisor.org/apt/xenial xenial main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install -y bcc-tools libbcc-examples linux-headers-$(uname -r)

安裝完成后,我們可以使用cachestat命令查看系統(tǒng)緩存的讀寫命中情況 。例如,執(zhí)行cachestat后,可能會(huì)得到如下輸出:

TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
2 0 2 1 17 279

在這個(gè)輸出中,TOTAL表示總訪問次數(shù),MISSES表示緩存未命中次數(shù),HITS表示緩存命中次數(shù),DIRTIES表示新增到緩存中的臟頁數(shù),BUFFERS_MB表示緩沖區(qū)大小,CACHED_MB表示緩存大小 。通過這些數(shù)據(jù),我們可以計(jì)算出緩存命中率,評估系統(tǒng)對緩存的利用效率 。緩存命中率的計(jì)算公式為:緩存命中率 = HITS / TOTAL * 100% 。在這個(gè)例子中,緩存命中率為2 / (2 + 0) * 100% = 100% ,說明系統(tǒng)的緩存利用效率非常高 。

我們可以使用cachetop命令實(shí)時(shí)監(jiān)控進(jìn)程的緩存讀寫命中情況 。例如,執(zhí)行cachetop后,可能會(huì)得到如下輸出:

11:58:50 Buffers MB:258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
13029 root python 1 0 0 100.0% 0.0%

在這個(gè)輸出中,PID表示進(jìn)程 ID,UID表示用戶 ID,CMD表示進(jìn)程命令,HITS表示緩存命中次數(shù),MISSES表示緩存未命中次數(shù),DIRTIES表示新增到緩存中的臟頁數(shù),READ_HIT%表示讀緩存命中率,WRITE_HIT%表示寫緩存命中率 。通過這個(gè)輸出,我們可以看到每個(gè)進(jìn)程的緩存命中情況,找出占用緩存較多的進(jìn)程,從而有針對性地進(jìn)行優(yōu)化 。在這個(gè)例子中,python進(jìn)程的讀緩存命中率為 100.0%,寫緩存命中率為 0.0%,說明該進(jìn)程的讀操作較多,且緩存利用效率較高,但寫操作可能存在一些問題,需要進(jìn)一步分析 。

四、實(shí)戰(zhàn)調(diào)優(yōu)步驟

4.1查看當(dāng)前緩存狀態(tài)

在進(jìn)行緩存調(diào)優(yōu)之前,我們首先要了解系統(tǒng)當(dāng)前的緩存狀態(tài),就像是醫(yī)生在給病人治病之前,需要先進(jìn)行全面的檢查一樣 。通過查看緩存狀態(tài),我們可以判斷系統(tǒng)是否需要進(jìn)行調(diào)優(yōu),以及確定調(diào)優(yōu)的方向和重點(diǎn) 。

我們可以使用free命令來查看系統(tǒng)內(nèi)存的使用情況,包括緩存的使用情況 。例如,執(zhí)行free -h命令,輸出結(jié)果如下:

total        used        free      shared  buff/cache   available
Mem:           15Gi       4.0Gi       8.6Gi       100Mi       2.8Gi       11Gi
Swap:          2.0Gi          0B       2.0Gi

從這個(gè)輸出中,我們可以看到buff/cache這一列的值,它表示系統(tǒng)中用于緩存和緩沖區(qū)的內(nèi)存大小 。通過觀察這個(gè)值的變化,我們可以了解緩存的使用情況 。如果buff/cache的值較大,說明系統(tǒng)緩存了較多的數(shù)據(jù),這可能會(huì)提高系統(tǒng)的性能 。但如果buff/cache的值過大,導(dǎo)致系統(tǒng)內(nèi)存不足,影響到其他任務(wù)的正常運(yùn)行,就需要考慮進(jìn)行緩存調(diào)優(yōu)了 。

vmstat命令也是一個(gè)非常有用的工具,它可以提供系統(tǒng)的詳細(xì)性能信息,包括緩存的讀寫情況 。執(zhí)行vmstat 1命令,每秒輸出一次系統(tǒng)性能數(shù)據(jù),輸出結(jié)果如下:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 103388 145412 511056    0    0    18    60    1    1  2  1 96  0  0

在這個(gè)輸出中,cache列表示用作緩存的內(nèi)存大小,bi列表示塊設(shè)備每秒接收的塊數(shù)量,bo列表示塊設(shè)備每秒發(fā)送的塊數(shù)量 。通過分析這些數(shù)據(jù),我們可以了解緩存的讀寫性能 。如果bi和bo的值較大,說明系統(tǒng)對磁盤的 I/O 操作頻繁,可能是緩存命中率較低,需要進(jìn)一步優(yōu)化緩存 。

我們還可以使用cachestat和cachetop工具來查看緩存命中率 。cachestat提供了整個(gè)操作系統(tǒng)緩存的讀寫命中情況,cachetop則提供了每個(gè)進(jìn)程的緩存命中情況 。例如,執(zhí)行cachestat命令,輸出結(jié)果如下:

TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
2 0 2 1 17 279

從這個(gè)輸出中,我們可以看到TOTAL表示總訪問次數(shù),MISSES表示緩存未命中次數(shù),HITS表示緩存命中次數(shù) 。通過計(jì)算HITS / TOTAL * 100%,我們可以得到緩存命中率 。在這個(gè)例子中,緩存命中率為2 / (2 + 0) * 100% = 100% ,說明系統(tǒng)的緩存利用效率非常高 。如果緩存命中率較低,比如低于 80%,就需要考慮優(yōu)化緩存,提高命中率 。

4.2調(diào)整內(nèi)核參數(shù)

在了解了系統(tǒng)當(dāng)前的緩存狀態(tài)后,我們就可以根據(jù)實(shí)際情況調(diào)整內(nèi)核參數(shù),對緩存進(jìn)行優(yōu)化 。內(nèi)核參數(shù)就像是系統(tǒng)的 “幕后指揮官”,它們控制著系統(tǒng)的各種行為,包括緩存的管理和使用 。通過調(diào)整這些參數(shù),我們可以讓系統(tǒng)更好地適應(yīng)不同的應(yīng)用場景,提高緩存的性能 。

vm.swappiness是一個(gè)非常重要的內(nèi)核參數(shù),它表示系統(tǒng)將內(nèi)存數(shù)據(jù)交換到磁盤的傾向程度,取值范圍是 0 - 100,默認(rèn)值一般是 60 。當(dāng)系統(tǒng)內(nèi)存不足時(shí),內(nèi)核會(huì)根據(jù)vm.swappiness的值來決定是否將內(nèi)存中的數(shù)據(jù)交換到磁盤的交換空間(Swap)中 。如果vm.swappiness的值設(shè)置得較高,比如 80,那么系統(tǒng)在內(nèi)存不足時(shí)會(huì)更傾向于將內(nèi)存數(shù)據(jù)交換到磁盤,這雖然可以暫時(shí)解決內(nèi)存不足的問題,但會(huì)增加磁盤 I/O 操作,降低系統(tǒng)性能 。因?yàn)榇疟P的讀寫速度遠(yuǎn)遠(yuǎn)低于內(nèi)存,頻繁的磁盤 I/O 操作會(huì)導(dǎo)致系統(tǒng)響應(yīng)變慢 。

相反,如果 vm.swappiness 的值設(shè)置得較低,比如 10,系統(tǒng)會(huì)盡量避免將內(nèi)存數(shù)據(jù)交換到磁盤,更多地利用內(nèi)存緩存,從而提高系統(tǒng)性能 。對于大多數(shù)服務(wù)器應(yīng)用來說,建議將vm.swappiness的值設(shè)置在 10 - 30 之間 。我們可以使用sudo sysctl -w vm.swappiness=10命令來臨時(shí)調(diào)整vm.swappiness的值,也可以通過修改/etc/sysctl.conf文件,添加或修改vm.swappiness = 10這一行,然后執(zhí)行 sudo sysctl -p 命令使配置永久生效 。

vm.dirty_ratio和vm.dirty_background_ratio這兩個(gè)參數(shù)則與臟頁的處理有關(guān) 。臟頁是指已經(jīng)被修改但還沒有被寫入磁盤的內(nèi)存頁 。vm.dirty_ratio表示當(dāng)臟頁占內(nèi)存的比例達(dá)到這個(gè)值時(shí),系統(tǒng)會(huì)開始同步臟頁到磁盤 ,默認(rèn)值一般是 20 。vm.dirty_background_ratio表示當(dāng)臟頁占內(nèi)存的比例達(dá)到這個(gè)值時(shí),系統(tǒng)會(huì)在后臺開始同步臟頁到磁盤 ,默認(rèn)值一般是 10 。如果vm.dirty_ratio設(shè)置得過高,臟頁在內(nèi)存中積累的時(shí)間會(huì)變長,這可能會(huì)導(dǎo)致系統(tǒng)在同步臟頁時(shí)出現(xiàn)長時(shí)間的 I/O 阻塞,影響系統(tǒng)性能 。

而如果vm.dirty_background_ratio設(shè)置得過低,系統(tǒng)會(huì)頻繁地在后臺同步臟頁,增加磁盤 I/O 負(fù)載 。為了平衡系統(tǒng)性能和 I/O 負(fù)載,建議將vm.dirty_ratio設(shè)置在 5 - 10 之間,將vm.dirty_background_ratio設(shè)置在 1 - 5 之間 。同樣,我們可以使用sudo sysctl -w vm.dirty_ratio=5和sudo sysctl -w vm.dirty_background_ratio=1命令來臨時(shí)調(diào)整這兩個(gè)參數(shù)的值,也可以通過修改/etc/sysctl.conf文件使配置永久生效 。

4.3清理緩存

在某些情況下,我們可能需要手動(dòng)清理緩存,以釋放內(nèi)存資源,提高系統(tǒng)性能 。比如,當(dāng)系統(tǒng)內(nèi)存不足,而緩存中又占用了大量內(nèi)存時(shí),清理緩存可以讓系統(tǒng)有更多的內(nèi)存用于其他任務(wù) 。

在 Linux 系統(tǒng)中,我們可以通過/proc/sys/vm/drop_caches這個(gè)接口來清理緩存 。具體來說,有以下三種清理方式:

  • 僅釋放頁緩存(PageCache):執(zhí)行echo 1 > /proc/sys/vm/drop_caches命令,或者sudo sysctl -w vm.drop_caches=1命令 。頁緩存主要用于緩存磁盤數(shù)據(jù),清理頁緩存可以釋放用于緩存磁盤數(shù)據(jù)的內(nèi)存 。
  • 釋放目錄項(xiàng)(Dentries)和索引節(jié)點(diǎn)(Inodes)緩存:執(zhí)行echo 2 > /proc/sys/vm/drop_caches命令,或者sudo sysctl -w vm.drop_caches=2命令 。目錄項(xiàng)緩存用于緩存目錄結(jié)構(gòu),索引節(jié)點(diǎn)緩存用于緩存文件元數(shù)據(jù),清理這兩個(gè)緩存可以釋放用于緩存文件系統(tǒng)元數(shù)據(jù)的內(nèi)存 。
  • 釋放所有緩存(PageCache + Dentries + Inodes):執(zhí)行echo 3 > /proc/sys/vm/drop_caches命令,或者sudo sysctl -w vm.drop_caches=3命令 。這將釋放所有類型的緩存,最大限度地釋放內(nèi)存 。

需要注意的是,在清理緩存之前,建議先執(zhí)行sync命令 。sync命令的作用是將所有緩存數(shù)據(jù)同步到磁盤,避免因清理緩存導(dǎo)致的數(shù)據(jù)丟失 。因?yàn)樵谇謇砭彺鏁r(shí),如果有未同步的臟頁,這些數(shù)據(jù)可能會(huì)丟失 。例如,我們可以執(zhí)行sync && echo 3 > /proc/sys/vm/drop_caches命令,先同步數(shù)據(jù),再清理所有緩存 。

清理緩存雖然可以釋放內(nèi)存資源,但也可能會(huì)對系統(tǒng)性能產(chǎn)生一定的影響 。因?yàn)榍謇砭彺婧?,系統(tǒng)在后續(xù)訪問數(shù)據(jù)時(shí),可能需要重新從磁盤讀取數(shù)據(jù),這會(huì)增加磁盤 I/O 操作,導(dǎo)致系統(tǒng)響應(yīng)速度變慢 。所以,在清理緩存時(shí),我們需要謹(jǐn)慎操作,根據(jù)實(shí)際情況選擇合適的清理方式和時(shí)機(jī) 。一般來說,只有在系統(tǒng)內(nèi)存嚴(yán)重不足,或者需要強(qiáng)制刷新緩存時(shí),才建議清理緩存 。

4.4優(yōu)化應(yīng)用程序

除了調(diào)整內(nèi)核參數(shù)和清理緩存外,從應(yīng)用程序?qū)用孢M(jìn)行優(yōu)化也是提高系統(tǒng)性能的關(guān)鍵 。應(yīng)用程序就像是系統(tǒng)的 “前臺演員”,它的性能直接影響著用戶的體驗(yàn) 。通過優(yōu)化應(yīng)用程序,我們可以減少對緩存的不必要依賴,提高緩存的利用效率,從而提升系統(tǒng)的整體性能 。

從代碼層面來看,我們可以優(yōu)化數(shù)據(jù)訪問模式,減少不必要的 I/O 操作 。比如,在讀取文件時(shí),可以采用批量讀取的方式,而不是逐行讀取 。假設(shè)我們有一個(gè)程序需要讀取一個(gè)包含大量數(shù)據(jù)的文件,如果逐行讀取,每次讀取都會(huì)產(chǎn)生一次 I/O 操作,這會(huì)大大增加 I/O 開銷 。而采用批量讀取的方式,我們可以一次性讀取多個(gè)數(shù)據(jù)塊,減少 I/O 操作的次數(shù) 。例如,在 Python 中,我們可以使用readlines()方法一次性讀取文件的所有行,而不是使用readline()方法逐行讀取 。示例代碼如下:

# 逐行讀取
with open('large_file.txt', 'r') as f:
    while True:
        line = f.readline()
        if not line:
            break
        # 處理每一行數(shù)據(jù)

# 批量讀取
with open('large_file.txt', 'r') as f:
    lines = f.readlines()
    for line in lines:
        # 處理每一行數(shù)據(jù)

我們還可以緩存計(jì)算結(jié)果,避免重復(fù)計(jì)算 。比如,在計(jì)算斐波那契數(shù)列時(shí),如果不進(jìn)行緩存,每次計(jì)算都會(huì)重復(fù)計(jì)算很多中間結(jié)果,效率非常低 。而通過緩存已經(jīng)計(jì)算過的結(jié)果,我們可以避免重復(fù)計(jì)算,提高計(jì)算效率 。以下是使用緩存優(yōu)化后的計(jì)算斐波那契數(shù)列的代碼:

# 緩存字典
fib_cache = {}
def fib(n):
    if n in fib_cache:
        return fib_cache[n]
    if n <= 1:
        result = n
    else:
        result = fib(n - 1) + fib(n - 2)
    fib_cache[n] = result
    return result

從配置層面來看,我們可以為應(yīng)用程序設(shè)置合理的緩存策略 。比如,對于一個(gè) Web 應(yīng)用程序,我們可以根據(jù)不同類型的資源設(shè)置不同的緩存時(shí)間 。對于更新頻率較低的靜態(tài)資源,如 CSS、JavaScript 和圖片文件,我們可以設(shè)置較長的緩存時(shí)間,以減少對服務(wù)器的請求 。而對于更新頻繁的資源,如新聞內(nèi)容、股票數(shù)據(jù)等,則需要設(shè)置較短的緩存時(shí)間,確保客戶端能夠獲取到最新的內(nèi)容 。在 Nginx 服務(wù)器中,我們可以通過配置expires指令來設(shè)置緩存時(shí)間 。例如,對于 CSS 和 JavaScript 文件,我們可以設(shè)置緩存時(shí)間為 1 周:

location ~ \.(css|js)$ {
    expires 1w;
    # 其他配置
}

對于圖片文件,我們可以設(shè)置緩存時(shí)間為 1 個(gè)月:

location ~ \.(jpg|jpeg|png|gif)$ {
    expires 1M;
    # 其他配置
}

通過以上從代碼層面和配置層面的優(yōu)化,應(yīng)用程序可以更好地利用緩存,減少對系統(tǒng)資源的消耗,提高系統(tǒng)的性能 。例如,一個(gè)經(jīng)過優(yōu)化的 Web 應(yīng)用程序,在處理大量用戶請求時(shí),響應(yīng)速度可能會(huì)提高數(shù)倍,緩存命中率也會(huì)大幅提升,從而為用戶提供更加流暢的體驗(yàn) 。

五、Linux緩存案例分析

5.1問題描述

那天剛到公司,就接到運(yùn)營同事的緊急反饋:網(wǎng)站打開速度變得奇慢無比,原本秒開的頁面,現(xiàn)在加載要好幾秒,用戶投訴量直線上升。我心里 “咯噔” 一下,立刻登錄服務(wù)器查看。

通過top命令發(fā)現(xiàn),CPU 和內(nèi)存使用率看起來都還算正常,并沒有出現(xiàn)資源被占滿的情況。但使用vmstat命令觀察系統(tǒng)狀態(tài)時(shí),發(fā)現(xiàn)bi(從塊設(shè)備讀入數(shù)據(jù)到系統(tǒng)的塊數(shù))和bo(從系統(tǒng)寫入數(shù)據(jù)到塊設(shè)備的塊數(shù))數(shù)值異常高,磁盤 I/O 負(fù)載明顯增大,這和平時(shí)穩(wěn)定的狀態(tài)大相徑庭。

再用free -h查看內(nèi)存使用情況,發(fā)現(xiàn)緩存(buff/cache)占用了大量內(nèi)存,而且可用內(nèi)存(free)所剩不多。這讓我初步懷疑,問題可能出在緩存上。難道是緩存沒有發(fā)揮作用,導(dǎo)致頻繁讀取磁盤數(shù)據(jù),從而拖慢了整個(gè)系統(tǒng)?

5.2定位緩存 “罪魁禍?zhǔn)住?/span>

為了進(jìn)一步確認(rèn)問題,我使用cachestat工具來分析緩存的使用情況。這一查,果然發(fā)現(xiàn)了異常:緩存命中率低得可憐,大量的文件讀取操作都沒有命中緩存,直接從磁盤讀取,這無疑是導(dǎo)致磁盤 I/O 飆升、系統(tǒng)性能下降的關(guān)鍵原因。

那為什么緩存命中率會(huì)突然變得這么低呢?我決定從應(yīng)用程序入手排查。檢查項(xiàng)目代碼和配置文件后發(fā)現(xiàn),最近上線的一個(gè)新功能模塊,在數(shù)據(jù)處理過程中頻繁地創(chuàng)建和刪除臨時(shí)文件。這些臨時(shí)文件的生命周期很短,導(dǎo)致系統(tǒng)頻繁地將它們加載到緩存中,又很快因?yàn)槲募粍h除而釋放緩存空間,使得緩存無法有效利用,一直處于 “無效更新” 的狀態(tài)。

此外,我還注意到服務(wù)器的內(nèi)核參數(shù)vm.swappiness的值為 60(默認(rèn)值)。這個(gè)參數(shù)控制著系統(tǒng)將內(nèi)存數(shù)據(jù)交換到 swap 空間的傾向程度,數(shù)值越高,越容易將內(nèi)存數(shù)據(jù)交換到 swap。由于服務(wù)器可用內(nèi)存已經(jīng)不多,較高的swappiness值使得系統(tǒng)開始頻繁進(jìn)行內(nèi)存交換操作,進(jìn)一步加劇了系統(tǒng)性能的惡化。

5.3多管齊下解決問題

⑴優(yōu)化應(yīng)用程序

針對應(yīng)用程序頻繁創(chuàng)建和刪除臨時(shí)文件的問題,我們對代碼進(jìn)行了重構(gòu)。將一些不必要的臨時(shí)文件操作進(jìn)行合并和優(yōu)化,減少臨時(shí)文件的創(chuàng)建頻率。同時(shí),在文件使用完畢后,及時(shí)關(guān)閉文件句柄,并使用unlink函數(shù)刪除臨時(shí)文件,避免文件被刪除后,相關(guān)緩存數(shù)據(jù)仍占用內(nèi)存空間。

⑵調(diào)整內(nèi)核參數(shù)

為了減少內(nèi)存交換操作,我將vm.swappiness的值調(diào)低至 10。通過修改/etc/sysctl.conf文件,添加或修改vm.swappiness = 10,然后執(zhí)行sysctl -p使配置生效。這樣,系統(tǒng)在內(nèi)存緊張時(shí),不會(huì)輕易將內(nèi)存數(shù)據(jù)交換到 swap,而是盡量利用已有的內(nèi)存資源,提高系統(tǒng)整體性能。

⑶清理緩存

在完成上述優(yōu)化和配置調(diào)整后,為了讓系統(tǒng)緩存快速恢復(fù)到正常狀態(tài),我決定清理部分緩存。但需要注意的是,清理緩存操作可能會(huì)對正在運(yùn)行的業(yè)務(wù)產(chǎn)生一定影響,所以我選擇在業(yè)務(wù)低峰期進(jìn)行。

執(zhí)行echo 3 > /proc/sys/vm/drop_caches命令,該命令會(huì)清除系統(tǒng)的頁緩存、dentries 和 inodes 緩存。執(zhí)行完命令后,再次查看緩存命中率和磁盤 I/O 情況,發(fā)現(xiàn)緩存命中率明顯提升,磁盤 I/O 負(fù)載也逐漸恢復(fù)正常。

責(zé)任編輯:武曉燕 來源: 深度Linux
相關(guān)推薦

2025-01-17 09:23:31

2019-11-05 10:35:57

SpringBoot調(diào)優(yōu)Java

2021-01-04 15:11:57

開發(fā) IDEA代碼

2019-03-25 08:05:35

Elasticsear優(yōu)化集群

2020-09-29 07:54:05

Express 飛起

2011-04-13 10:51:58

MATLAB

2025-03-28 03:20:00

MySQL數(shù)據(jù)庫搜索

2025-06-04 01:35:00

RocketMQ異步消息

2025-04-15 00:00:00

2020-10-16 16:40:26

Linux高并發(fā)命令

2021-07-13 07:52:03

SQL面試COUNT(*)

2013-01-07 09:34:43

CodeLoveBAT

2011-02-25 08:39:11

QFabric數(shù)據(jù)中心Juniper

2022-10-09 18:14:31

訂單系統(tǒng)分庫分表

2016-01-19 17:03:59

數(shù)據(jù)中心網(wǎng)絡(luò)華為

2024-11-27 09:46:34

2023-03-01 23:59:23

Java開發(fā)

2011-09-27 13:25:05

Web

2024-06-12 12:28:23

2009-03-20 14:18:38

機(jī)房數(shù)據(jù)傳輸安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號