Có thể liệt kê các tập tin được lưu trữ?


29

Đây là đầu ra của free -m:

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

Tôi có thể thấy 6GBbộ nhớ gần như (5945 MB) 7GBđược sử dụng trong bộ nhớ đệm các tệp. Tôi biết làm thế nào để tuôn ra bộ đệm. Câu hỏi của tôi là: Có thể xem tập tin (hoặc inodes) nào đang được lưu trữ không?


Tôi không biết câu trả lời nhưng có hai điều đáng quan tâm: Làm thế nào để bạn xóa bộ nhớ cache? Tại sao điều đó lại đáng quan tâm, tôi không ngụ ý bất cứ điều gì ở đây - chỉ quan tâm đến trường hợp sử dụng
dị

2
Điều này tuôn ra cả bufferscached: sysctl -w vm.drop_caches=3. Bạn có thể muốn đọc thêm về nó, trước khi sử dụng. Đôi khi nó chỉ cần thiết. Nó có sẵn - đây sẽ là một lý do khác :)
ssapkota

Rất nhiều người đang yêu cầu nó . Cần có một số lý do.
ssapkota

thả bộ nhớ cache trở nên tiện dụng nếu bạn muốn thực hiện một số phép đo hiệu suất liên quan đến I / O và không muốn chúng bị "làm hỏng" bởi bộ nhớ đệm O / S
the-wợi

Câu trả lời:


25

Vâng, có một cách dễ dàng để có một cái nhìn tại bộ nhớ cache trang của hạt nhân nếu bạn xảy ra để có ftools - "fincore" cung cấp cho bạn một số thông tin tóm tắt về những gì trang files' là nội dung của bộ nhớ cache.

Bạn sẽ cần cung cấp một danh sách các tên tệp để kiểm tra sự hiện diện của chúng trong bộ đệm trang. Điều này là do thông tin được lưu trữ trong các bảng bộ đệm trang của kernel chỉ chứa các tham chiếu khối dữ liệu và không phải tên tệp. fincoresẽ giải quyết các khối dữ liệu của một tệp đã cho thông qua dữ liệu inode và tìm kiếm các mục tương ứng trong các bảng bộ đệm trang.

Không có cơ chế tìm kiếm hiệu quả để thực hiện ngược lại - để có được một tên tệp thuộc một khối dữ liệu sẽ yêu cầu đọc tất cả các nút và khối gián tiếp trên hệ thống tệp. Nếu bạn cần biết về các khối của mỗi tệp được lưu trong bộ đệm trang, bạn sẽ cần cung cấp danh sách tất cả các tệp trên (các) hệ thống tệp của mình fincore. Nhưng điều đó một lần nữa có khả năng làm hỏng phép đo vì một lượng lớn dữ liệu sẽ được đọc qua các thư mục và nhận tất cả các nút và khối gián tiếp - đưa chúng vào bộ đệm của trang và xóa dữ liệu bộ đệm của trang mà bạn đang cố kiểm tra.


fincore không thông báo nếu một tập tin có trong bộ nhớ cache hay không. Tuy nhiên, có công cụ nào sẽ liệt kê tất cả các tệp được lưu trong bộ nhớ cache không (fincore lấy tên tệp làm đầu vào và tìm kiếm. Tôi muốn xem xét tất cả các mục hiện đang được lưu trong bộ nhớ cache)
Joe

@Joe Tôi cho rằng thông tin được lưu trữ trong các bảng bộ đệm trang của kernel chỉ chứa các tham chiếu khối dữ liệu và không phải tên tệp. fincoresẽ giải quyết các khối dữ liệu của một tệp đã cho thông qua dữ liệu inode và tìm kiếm các mục tương ứng trong các bảng bộ đệm trang. Không có cơ chế tìm kiếm hiệu quả nào làm ngược lại - để có được một tên tệp thuộc một khối dữ liệu sẽ yêu cầu đọc tất cả các nút và khối gián tiếp trên hệ thống tệp. Do đó, về mặt thuật toán, bạn sẽ tốt hơn khi cung cấp danh sách tất cả các tệp trên hệ thống tệp của mình fincorenếu bạn thực sự cần mức thông tin này.
the-wợi

@ the-wợi Cảm ơn. Ngoài các tệp, có những thứ khác là một phần của bộ đệm, chẳng hạn như bộ mô tả, bộ nhớ dùng chung, v.v.
Joe

@Joe Thật không may, tôi không đi sâu vào nội bộ Kernel để đưa ra câu trả lời có thẩm quyền về chủ đề này. Bộ đệm trang dường như đủ chung để lưu trữ các loại dữ liệu khác ngoài khối dữ liệu hệ thống tệp, nhưng tôi không biết bất kỳ ví dụ nào.
the-wợi

1
Lập trường StackExchange về những gì cần làm với câu trả lời lỗi thời là hơi mơ hồ. Xóa hoặc thay đổi đáng kể các câu trả lời được chấp nhận được nhăn mặt. Thay đổi câu trả lời này để đề xuất vmtouch sẽ nhân đôi câu trả lời hiện có của @ ewwhite, có số lượng upvote tương tự. Vì vậy, chỉ đơn giản là nâng cao hơn nữa câu trả lời của ewwhite nên thực hiện các mẹo, phải không?
ngày

19

Bạn có thể sử dụng tiện ích vmtouch để xem tệp hoặc thư mục có tên có trong bộ đệm không. Bạn cũng có thể sử dụng công cụ để buộc các mục vào bộ đệm hoặc khóa chúng vào bộ đệm.

[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

Bây giờ tôi có thể "chạm" nó vào bộ nhớ cache.

[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

Bây giờ để xem bao nhiêu được lưu trữ ...

[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

Tôi viết một kịch bản shell rất đơn giản để hiển thị các tệp được lưu trong bộ nhớ cache bằng cách sử dụng linux-fincore. Vì bộ đệm là một phần của bộ nhớ, mã của tôi tìm thấy 10 quy trình sử dụng RSZ hàng đầu và sử dụng lsof để tìm ra các tệp được xử lý, cuối cùng sử dụng linux-fincore để tìm hiểu xem các tệp này có được lưu trong bộ nhớ cache hay không.

Xin hãy sửa tôi nếu tôi nghĩ sai.

#!/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
Tập hợp các tệp trong bộ đệm thường sẽ lớn hơn tập hợp con nhỏ của các tệp hiện đang mở (trừ khi không gian bộ đệm nhỏ). Các tệp hiện đang mở rất có thể có trong bộ đệm (trừ khi các tệp không hoạt động lâu hoặc bộ đệm đã được xóa gần đây). Lưu ý: lsofcũng báo cáo các tệp được ánh xạ vào không gian địa chỉ tiến trình (và không nhất thiết phải được lưu trong bộ nhớ cache). Cũng có khả năng phần lớn các tệp sẽ chỉ được lưu trữ một phần / thưa thớt ...
Vlad


2

Tôi đã viết đoạn script sau đây in tất cả các tệp và trạng thái bộ đệm của chúng bằng lệnh pcstat. Nó là tập lệnh độc lập cho các hệ thống linux x86_64. Nó tải pcstat nếu cần.

Đối số đầu tiên là vị trí hệ thống tệp để phân tích và đối số thứ hai là số kết quả (Top N theo số trang trong bộ đệm).

#!/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}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.