緩存是現(xiàn)在所有高并發(fā)系統(tǒng)必需的核心模塊,主要作用就是把經(jīng)常訪問(wèn)的數(shù)據(jù)(也就是熱點(diǎn)數(shù)據(jù)),提前讀入到內(nèi)存中。這樣,下次訪問(wèn)時(shí)就可以直接從內(nèi)存讀取數(shù)據(jù),而不需要經(jīng)過(guò)硬盤(pán),從而加快應(yīng)用程序的響應(yīng)速度。
這些獨(dú)立的緩存模塊通常會(huì)提供查詢(xún)接口,方便我們隨時(shí)查看緩存的命中情況。不過(guò) Linux 系統(tǒng)中并沒(méi)有直接提供這些接口,所以這里我要介紹一下,cachestat 和 cachetop ,它們正是查看系統(tǒng)緩存命中情況的工具。
cachestat 提供了整個(gè)操作系統(tǒng)緩存的讀寫(xiě)命中情況。
cachetop 提供了每個(gè)進(jìn)程的緩存命中情況。
這兩個(gè)工具都是 bcc 軟件包的一部分,它們基于 Linux 內(nèi)核的 eBPF(extended Berkeley Packet Filters)機(jī)制,來(lái)跟蹤內(nèi)核中管理的緩存,并輸出緩存的使用和命中情況。
使用 cachestat 和 cachetop 前,我們首先要安裝 bcc 軟件包。比如,在 Ubuntu 系統(tǒng)中,你可以運(yùn)行下面的命令來(lái)安裝:
sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 4052245BD4284CDDecho "deb https://repo.iovisor.org/apt/xenial xenial main" | sudo tee /etc/apt/sources.list.d/iovisor.listsudo apt-get updatesudo apt-get install -y bcc-tools libbcc-examples linux-headers-$(uname -r)
注意:bcc-tools需要內(nèi)核版本為4.1或者更新的版本,如果你用的是CentOS,那就需要手動(dòng)升級(jí)內(nèi)核版本后再安裝。
Centos7安裝bcc-tools第一步,升級(jí)內(nèi)核。你可以運(yùn)行下面的命令來(lái)操作:
升級(jí)系統(tǒng)
yum update -y
安裝ELRepo
rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgrpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
安裝新內(nèi)核
yum remove -y kernel-headers kernel-tools kernel-tools-libsyum –enablerepo="elrepo-kernel" install -y kernel-ml kernel-ml-devel kernel-ml-headers kernel-ml-tools kernel-ml-tools-libs kernel-ml-tools-libs-devel
更新Grub后重啟
grub2-mkconfig -o /boot/grub2/grub.cfggrub2-set-default 0reboot
重啟后確認(rèn)內(nèi)核版本已升級(jí)為4.20.0-1.el7.elrepo.x86_64
uname -r
第二步,安裝 bcc-tools:
安裝bcc-tools
yum install -y bcc-tools
配置PATH路徑
export PATH=$PATH:/usr/share/bcc/tools
驗(yàn)證安裝成功
cachestat 操作完這些步驟,bcc 提供的所有工具就都安裝到 /usr/share/bcc/tools 這個(gè)目錄中了。不過(guò)這里提醒你,bcc 軟件包默認(rèn)不會(huì)把這些工具配置到系統(tǒng)的 PATH 路徑中,所以你得自己手動(dòng)配置:$ export PATH=$PATH:/usr/share/bcc/tools
配置完,你就可以運(yùn)行 cachestat 和 cachetop 命令了。比如,下面就是一個(gè) cachestat 的運(yùn)行界面,它以1秒的時(shí)間間隔,輸出了3組緩存統(tǒng)計(jì)數(shù)據(jù):
$ cachestat 1 3TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB2 0 2 1 17 2792 0 2 1 17 2792 0 2 1 17 279
你可以看到,cachestat 的輸出其實(shí)是一個(gè)表格。每行代表一組數(shù)據(jù),而每一列代表不同的緩存統(tǒng)計(jì)指標(biāo)。這些指標(biāo)從左到右依次表示:
TOTAL ,表示總的 I/O 次數(shù);
MISSES ,表示緩存未命中的次數(shù);
HITS ,表示緩存命中的次數(shù);
DIRTIES, 表示新增到緩存中的臟頁(yè)數(shù);
BUFFERS_MB 表示 Buffers 的大小,以 MB 為單位;
CACHED_MB 表示 Cache 的大小,以 MB 為單位。
接下來(lái)我們?cè)賮?lái)看一個(gè) cachetop 的運(yùn)行界面:
$ cachetop11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascendingPID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%13029 root python 1 0 0 100.0% 0.0%
它的輸出跟 top 類(lèi)似,默認(rèn)按照緩存的命中次數(shù)(HITS)排序,展示了每個(gè)進(jìn)程的緩存命中情況。具體到每一個(gè)指標(biāo),這里的 HITS、MISSES和DIRTIES ,跟 cachestat 里的含義一樣,分別代表間隔時(shí)間內(nèi)的緩存命中次數(shù)、未命中次數(shù)以及新增到緩存中的臟頁(yè)數(shù)。
而 READ_HIT 和 WRITE_HIT ,分別表示讀和寫(xiě)的緩存命中率。
指定文件的緩存大小除了緩存的命中率外,還有一個(gè)指標(biāo)你可能也會(huì)很感興趣,那就是指定文件在內(nèi)存中的緩存大小。你可以使用 pcstat 這個(gè)工具,來(lái)查看文件在內(nèi)存中的緩存大小以及緩存比例。
pcstat 是一個(gè)基于 Go 語(yǔ)言開(kāi)發(fā)的工具,所以安裝它之前,你首先應(yīng)該安裝 Go 語(yǔ)言;
安裝完 Go 語(yǔ)言,再運(yùn)行下面的命令安裝 pcstat:
$ export GOPATH=~/go$ export PATH=~/go/bin:$PATH$ go get golang.org/x/sys/unix$ go get github.com/tobert/pcstat/pcstat
全部安裝完成后,你就可以運(yùn)行 pcstat 來(lái)查看文件的緩存情況了。比如,下面就是一個(gè) pcstat 運(yùn)行的示例,它展示了 /bin/ls 這個(gè)文件的緩存情況:
$ pcstat /bin/ls+———+—————-+————+———–+———+| Name | Size (bytes) | Pages | Cached | Percent ||———+—————-+————+———–+———|| /bin/ls | 133792 | 33 | 0 | 000.000 |+———+—————-+————+———–+———+這個(gè)輸出中,Cached 就是 /bin/ls 在緩存中的大小,而 Percent 則是緩存的百分比。你看到它們都是 0,這說(shuō)明 /bin/ls 并不在緩存中。
接著,如果你執(zhí)行一下 ls 命令,再運(yùn)行相同的命令來(lái)查看的話(huà),就會(huì)發(fā)現(xiàn) /bin/ls 都在緩存中了:
$ ls$ pcstat /bin/ls+———+—————-+————+———–+———+| Name | Size (bytes) | Pages | Cached | Percent ||———+—————-+————+———–+———|| /bin/ls | 133792 | 33 | 33 | 100.000 |+———+—————-+————+———–+———+