Phương pháp tiềm năng số 1 - F_DROP_CACHES
Tôi đã tìm thấy một phương pháp từ năm 2012 thảo luận về một bản vá được đề xuất cho nhân Linux trong chuỗi thư này có tiêu đề: Re: [RFC Patch] fs: hiện thực hiện bộ đệm thả trên mỗi tệp .
đoạn trích
Cong> Đây là một bản vá dự thảo về việc thực hiện bộ đệm thả trên mỗi tệp.
Hấp dẫn. Vì vậy, tôi có thể làm điều này từ bên ngoài một quá trình? Tôi là một SysAdmin, vì vậy POV của tôi không chú ý, tìm và khắc phục các sự cố về hiệu suất khi hệ thống chịu áp lực.
Cong> It introduces a new fcntl command F_DROP_CACHES to drop
Cong> file caches of a specific file. The reason is that currently
Cong> we only have a system-wide drop caches interface, it could
Cong> cause system-wide performance down if we drop all page caches
Cong> when we actually want to drop the caches of some huge file.
Làm thế nào tôi có thể biết bao nhiêu bộ đệm được sử dụng bởi một tập tin? Và tác động hiệu suất của việc này khi chạy trên một hệ thống bận rộn là gì? Và bản vá này mua gì cho chúng tôi vì tôi nghĩ VM nên bỏ bộ nhớ cache một khi hệ thống chịu áp lực mem ...
Cong> Dưới đây là trường hợp thử nghiệm nhỏ cho bản vá này:
Chuỗi này bao gồm cả một testcase và bản vá thực tế cho một số tệp trong nhân Linux, có thêm một chức năng bổ sung để fs/drop_caches.c
gọi drop_pagecache_file(struct file *filp)
. Chức năng này sau đó có thể truy cập thông qua công cụ frontend, fnctl.c
thông qua lệnh F_DROP_CACHES
. Trường hợp này gọi chức năng này:
file_drop_caches(filp, arg);
Mà xử lý việc bỏ tất cả các bộ nhớ cache liên quan đến tập tin đã cho. Từ tệp include/linux/mm.h
:
void file_drop_caches(struct file *filp, unsigned long which);
Vì vậy, điều này có thể được sử dụng?
Tôi không tìm thấy bằng chứng nào cho thấy bản vá này từng được đưa vào kho lưu trữ mã nhân Linux chính, vì vậy tùy chọn này sẽ xuất hiện, chỉ khi bạn sẵn sàng tự biên dịch lại nhân Linux.
Phương pháp tiềm năng số 2 - Sử dụng dd
Trong cùng một chủ đề, một người dùng khác đề cập đến một phương pháp hoàn toàn khác sử dụng dd
.
Sau đây là đoạn trích từ email đó
Đây là chức năng hữu ích. Mặc dù nó không được cung cấp
POSIX_FADV_DONTNEED
? Chức năng này đã được thêm vào GNU dd (8.11) một năm trước .
Dưới đây là các ví dụ từ bản vá đó:
Khuyên bạn nên bỏ cache cho toàn bộ tập tin
$ dd if=ifile iflag=nocache count=0
Đảm bảo thả bộ đệm cho toàn bộ tệp
$ dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
Thả bộ đệm cho một phần của tập tin
$ dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
Truyền dữ liệu chỉ bằng bộ đệm đọc trước
$ dd if=ifile of=ofile iflag=nocache oflag=nocache
Kiểm tra nó ra
Tôi đã không tích cực 100% làm thế nào để kiểm tra điều này nhưng tôi đã đưa ra cách tiếp cận sau.
tạo một tệp 100 MB
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
truy cập tệp theo dõi bằng cách sử dụng fatrace
$ sudo fatrace | grep sample.txt
chạy top
để chúng tôi có thể theo dõi việc sử dụng bộ nhớ, ghi chú số lượng miễn phí.
$ top
mở tập tin, lưu ý số lượng bộ nhớ miễn phí bây giờ. Lưu ý fatrace
các tập tin sample.txt
.
$ cat sample.txt > /dev/null
thả tập tin từ bộ nhớ, lưu ý số lượng bộ nhớ trống ngay bây giờ. Lưu ý đầu ra của fatrace
.
$ sudo dd of=/home/saml/tst/162600/sample.txt \
oflag=nocache conv=notrunc,fdatasync count=0
Thí dụ
Trong thiết bị đầu cuối số 1:
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 7.37996 s, 14.2 MB/s
$ ls -l sample.txt
-rw-rw-r--. 1 saml saml 104857600 Oct 17 22:54 sample.txt
Trong thiết bị đầu cuối số 2:
$ top
...
KiB Mem: 7968336 total, 6900956 used, 1067380 free, 267080 buffers
...
Trong thiết bị đầu cuối số 3:
$ sudo fatrace | grep sample.txt
Bây giờ hãy mở tệp sample.txt
và lưu ý dung lượng RAM. Trong thiết bị đầu cuối # 1.
$ cat sample.txt > /dev/null
Trong thiết bị đầu cuối số 2:
KiB Mem: 7968336 total, 7011896 used, 956440 free, 267336 buffers
Lưu ý đầu ra của fatrace
thiết bị đầu cuối số 3:
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): RC /home/saml/tst/162600/sample.txt
Bây giờ xóa tệp khỏi RAM, trong thiết bị đầu cuối # 4:
$ sudo dd of=/home/saml/tst/162600/sample.txt \
oflag=nocache conv=notrunc,fdatasync count=0
Lưu ý đầu ra của fatrace
thiết bị đầu cuối # 2:
dd(26229): O /home/saml/tst/162600/sample.txt
dd(26229): CW /home/saml/tst/162600/sample.txt
Lưu ý RAM trong thiết bị đầu cuối # 3:
KiB Mem: 7968336 total, 6908364 used, 1059972 free, 267364 buffers
Vì vậy, dường như tất cả những gì được sử dụng bởi tệp trong RAM đều được giải phóng.
Phương pháp tiềm năng # 3 - python-fadvise
Nhờ nhận xét của @frostchutz, có một công cụ khác, tập lệnh Python, được đặt tên [pyadvise][4]
cung cấp giao diện đơn giản hơn nhiều so với các dd
phương thức trên . Kịch bản này sử dụng cùng một posix_fadvise(2)
giao diện.
Thí dụ
$ sudo pyadvise --help
Usage:
pyadvise [options] [FILE]..
Options:
-h, --help show this help message and exit
-w, --willneed The specified files will be accessed in the near future
-s, --sequential The application expects to access the specified files
sequentially (with lower offsets read before higher ones)
-d, --dontneed The specified files will not be accessed in the near
future
-r, --random The specified files will be accessed in random order
-o, --noreuse The specified files will be accessed only once. Under
Linux, this operation is a no-op; see contrib/copyfileobj-
fadvise.py in the python-fadvise source tree for an
example on how to achieve approximately the same effect
-n, --normal Indicates that the application has no advice to give about
its access pattern for the specified files. If no advice
is given for an open file, this is the default assumption
-v, --verbose Explain what is being done
Và nếu chúng tôi lặp lại thử nghiệm trên và sử dụng pyadvise
thay cho dd
:
$ pyadvise -d /home/saml/tst/162600/sample.txt
Tôi nhận thấy sự sụt giảm RAM giống hệt nhau được tiêu thụ như trước đây khi tôi sử dụng dd
.