เป็นไปได้หรือไม่ที่จะแสดงรายการไฟล์ที่แคชไว้?


29

นี่คือผลลัพธ์ของfree -m:

             total       used       free     shared    buffers     cached
Mem:          7188       6894        294          0        249       5945
-/+ buffers/cache:        698       6489
Swap:            0          0          0

ฉันเห็น6GBหน่วยความจำเกือบหมด(5945MB) 7GBถูกใช้ในการแคชไฟล์ ฉันรู้วิธีล้างแคช คำถามของฉันคือ: เป็นไปได้ดูไฟล์ (หรือ inodes) ที่ถูกแคช?


ฉันไม่รู้คำตอบ แต่มี 2 สิ่งที่น่าสนใจ: คุณจะล้างแคชได้อย่างไร เหตุใดที่เป็นที่สนใจฉันไม่ได้หมายถึงอะไรที่นี่ - แค่สนใจในกรณีการใช้งาน
serverhorror

2
นี้วูบวาบทั้งสองbuffersและ:cached sysctl -w vm.drop_caches=3คุณอาจต้องการอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ก่อนที่จะใช้ บางครั้งมันก็ต้องการ มีให้ใช้ - นี่เป็นอีกเหตุผลหนึ่ง :)
ssapkota

ผู้คนจำนวนมากจะขอให้มัน ควรมีเหตุผลบางอย่าง
ssapkota

การวางแคชจะมีประโยชน์ถ้าคุณต้องการทำการวัดประสิทธิภาพที่เกี่ยวข้องกับ I / O และไม่ต้องการให้ "เสีย" โดยการแคช O / S
the-wabbit

คำตอบ:


25

ดีมีเป็นวิธีที่ง่ายที่จะดูที่หน้าแคชเคอร์เนลหากเกิดขึ้นจะมีftools - "fincore" ช่วยให้คุณมีข้อมูลสรุปบางอย่างเกี่ยวกับสิ่งที่หน้าไฟล์มีเนื้อหาของแคช

คุณจะต้องระบุรายชื่อไฟล์เพื่อตรวจสอบว่ามีอยู่ในแคชของหน้าหรือไม่ นี่เป็นเพราะข้อมูลที่เก็บไว้ในตารางแคชของหน้าเคอร์เนลจะมีการอ้างอิงบล็อกข้อมูลเท่านั้นและไม่ใช่ชื่อไฟล์ fincoreจะแก้ไขบล็อกข้อมูลของไฟล์ที่ระบุผ่านข้อมูล inode และค้นหารายการที่เกี่ยวข้องในตารางแคชหน้า

ไม่มีกลไกการค้นหาที่มีประสิทธิภาพสำหรับการทำ reverse - การได้รับชื่อไฟล์ที่อยู่ใน data block นั้นจำเป็นต้องมีการอ่าน inodes และ block ทางอ้อมทั้งหมดในระบบไฟล์ หากคุณจำเป็นต้องรู้เกี่ยวกับบล็อกทุกไฟล์เดียวเก็บไว้ในแคชหน้าคุณจะต้องจัดหารายชื่อของไฟล์ทั้งหมดบนระบบไฟล์ของคุณ fincore(s) แต่นั่นมีแนวโน้มที่จะทำให้การวัดเสียอีกเพราะข้อมูลจำนวนมากจะถูกอ่านผ่านไดเรคทอรี่และรับ inodes และบล็อกทางอ้อมทั้งหมด - วางลงในแคชของหน้า


fincore แจ้งว่าไฟล์นั้นมีอยู่ในแคชหรือไม่ อย่างไรก็ตามจะมีเครื่องมือใด ๆ ซึ่งจะแสดงรายการไฟล์ทั้งหมดที่ถูกเก็บไว้ (fincore ใช้ชื่อไฟล์เป็น input และการค้นหาที่ฉันต้องการที่จะมองเข้าไปในรายการทั้งหมดที่จะถูกเก็บไว้ในปัจจุบัน.)
โจ

@ โจฉันคิดว่าข้อมูลที่เก็บไว้ในตารางแคชของหน้าเคอร์เนลจะมีการอ้างอิงบล็อกข้อมูลเท่านั้นไม่ใช่ชื่อไฟล์ fincoreจะแก้ไขบล็อกข้อมูลของไฟล์ที่ระบุผ่านข้อมูล inode และค้นหารายการที่เกี่ยวข้องในตารางแคชหน้า ไม่มีกลไกการค้นหาที่มีประสิทธิภาพในการย้อนกลับ - การรับชื่อไฟล์ที่อยู่ในบล็อคข้อมูลจะต้องอ่าน inodes และบล็อกทางอ้อมทั้งหมดในระบบไฟล์ ดังนั้นอัลกอริธึมคุณจะดีกว่าการจัดหารายชื่อไฟล์ทั้งหมดในระบบไฟล์ของคุณfincoreหากคุณต้องการข้อมูลระดับนี้
the-wabbit

@ the-wabbit ขอบคุณ อื่น ๆ กว่าไฟล์จะมีสิ่งอื่น ๆ ที่เป็นส่วนหนึ่งของแคชเช่นอธิบายหน่วยความจำที่ใช้ร่วมกัน ฯลฯ
โจ

@ โจ แต่น่าเสียดายที่ฉันไม่ได้ลึกเข้าไปในเคอร์เนลภายในเพื่อให้คำตอบที่มีสิทธิ์ในหัวข้อนี้ ดูเหมือนว่าแคชของหน้าเว็บนั้นจะมีขนาดใหญ่พอที่จะแคชข้อมูลประเภทอื่น ๆ มากกว่าแค่บล็อกข้อมูลระบบไฟล์ แต่ฉันไม่รู้ถึงตัวอย่างใด ๆ
the-wabbit

1
StackExchange ท่าทางว่าจะทำอย่างไรกับคำตอบที่ล้าสมัยค่อนข้างคลุมเครือ การลบคำตอบที่ยอมรับหรือเปลี่ยนไปจะทำให้เกิดการขมวดคิ้ว การเปลี่ยนคำตอบนี้เพื่อแนะนำ vmtouch จะเป็นการทำซ้ำคำตอบที่มีอยู่ของ @ ewwhite ซึ่งมีจำนวนอัปโหลดที่ใกล้เคียงกัน ดังนั้นการถอนคำตอบของ ewwhite ต่อไปควรจะทำอย่างนั้นจริงไหม?
the-wabbit

19

คุณสามารถใช้ยูทิลิตี vmtouchเพื่อดูว่าไฟล์หรือไดเรกทอรีที่ระบุชื่ออยู่ในแคชหรือไม่ นอกจากนี้คุณยังสามารถใช้เครื่องมือเพื่อบังคับให้รายการต่าง ๆ เข้าสู่แคชหรือล็อกไว้ในแคชได้

[root@xt ~]# vmtouch -v /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[     ] 0/5

           Files: 1
     Directories: 0
  Resident Pages: 0/5  0/20K  0%
         Elapsed: 0.000215 seconds

ตอนนี้ฉันสามารถ "แตะ" มันลงในแคช

[root@xt ~]# vmtouch -vt /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[OOOOO] 5/5

           Files: 1
     Directories: 0
   Touched Pages: 5 (20K)
         Elapsed: 0.005313 seconds

ตอนนี้เพื่อดูจำนวนแคช ...

[root@xt ~]# vmtouch -v /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[OOOOO] 5/5

           Files: 1
     Directories: 0
  Resident Pages: 5/5  20K/20K  100%
         Elapsed: 0.000241 seconds

3

ฉันเขียนเชลล์สคริปต์ง่าย ๆ เพื่อแสดงไฟล์ที่แคชโดยใช้ linux-fincore เนื่องจากแคชเป็นส่วนหนึ่งของหน่วยความจำรหัสของฉันค้นหาการใช้งาน RSZ 10 อันดับแรกของกระบวนการและการใช้ lsof เพื่อค้นหาไฟล์ที่กระบวนการเปิดใช้ในที่สุดก็ใช้ linux-fincore เพื่อค้นหาว่าไฟล์เหล่านี้ถูกแคชหรือไม่

โปรดแก้ไขฉันหากฉันคิดผิด

#!/bin/bash
#Author: Shanker
#Time: 2016/06/08

#set -e
#set -u
#you have to install linux-fincore
if [ ! -f /usr/local/bin/linux-fincore ]
then
    echo "You haven't installed linux-fincore yet"
    exit
fi

#find the top 10 processs' cache file
ps -e -o pid,rss|sort -nk2 -r|head -10 |awk '{print $1}'>/tmp/cache.pids
#find all the processs' cache file
#ps -e -o pid>/tmp/cache.pids

if [ -f /tmp/cache.files ]
then
    echo "the cache.files is exist, removing now "
    rm -f /tmp/cache.files
fi

while read line
do
    lsof -p $line 2>/dev/null|awk '{print $9}' >>/tmp/cache.files 
done</tmp/cache.pids


if [ -f /tmp/cache.fincore ]
then
    echo "the cache.fincore is exist, removing now"

    rm -f /tmp/cache.fincore
fi

for i in `cat /tmp/cache.files`
do

    if [ -f $i ]
    then

        echo $i >>/tmp/cache.fincore
    fi
done

linux-fincore -s  `cat /tmp/cache.fincore`

rm -f /tmp/cache.{pids,files,fincore}

1
โดยทั่วไปชุดของไฟล์ในแคชจะมีขนาดใหญ่กว่าเซตย่อยเล็ก ๆ ของไฟล์ที่เปิดอยู่ในปัจจุบัน (ยกเว้นว่าพื้นที่แคชมีขนาดเล็ก) ไฟล์ที่เปิดอยู่ในปัจจุบันมีแนวโน้มที่จะปรากฏอยู่ในแคช (ยกเว้นไฟล์ที่ไม่ได้ใช้งานเป็นเวลานานหรือเพิ่งถูกล้างแคช) หมายเหตุ: lsofยังรายงานไฟล์ที่แม็พเข้ากับกระบวนการ-address-space (และไม่จำเป็นต้องแคช) นอกจากนี้ยังมีแนวโน้มว่าหุ้นขนาดใหญ่ของไฟล์ที่เป็นไปได้เพียงบางส่วนเท่านั้น / ที่แคชเบาบาง ...
Vlad


2

ฉันเขียนสคริปต์ต่อไปนี้ซึ่งพิมพ์ไฟล์ทั้งหมดและสถานะแคชโดยใช้คำสั่ง pcstat มันเป็นสคริปต์ในตัวเองสำหรับระบบ x86_64 linux มันดาวน์โหลด pcstat หากจำเป็น

อาร์กิวเมนต์แรกคือตำแหน่งระบบไฟล์ที่จะวิเคราะห์และอาร์กิวเมนต์ที่สองคือจำนวนผลลัพธ์ (บนสุด N ตามจำนวนหน้าในแคช)

#!/bin/bash
#Exit if a variable is not set
set -o nounset
#Exit on first error
set -o errexit

if [ $# -eq 0 ]; then
echo "Usage: $0 <root-dir> [number-of-results]"
echo
echo "Example $0 /var 10"
echo "will show top 10 files in /var which are loaded in cache"
exit
fi

ROOT=$1
#Number of results to show
HOW_MANY=50
[ -n ${2-} ] && HOW_MANY=$2


SCRIPT_DIR="$( cd -P "$( dirname "$0" )" && pwd )"
if [ ! -x $SCRIPT_DIR/pcstat ]; then
(
cd $SCRIPT_DIR
rm -f pcstat
curl -L -o pcstat https://github.com/tobert/pcstat/raw/2014-05-02-01/pcstat.x86_64
chmod +x pcstat
)
fi

FIND="find ${ROOT} -not ( -path /proc -prune ) -not ( -path /sys -prune ) -type f -size +0c -print0"
$FIND |  xargs -0 ${SCRIPT_DIR}/pcstat -terse -nohdr | sort --field-separator=, -r -n -k 6 | head -n ${HOW_MANY}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.