ศักยภาพวิธี # 1 - F_DROP_CACHES
ผมพบว่าวิธีการจาก 2012 ที่กล่าวถึงแพทช์เสนอให้เคอร์เนลในหัวข้อจดหมายนี้หัวข้อ: Re: [RFC Patch] FS: ดำเนินการต่อไฟล์แคชลดลง
สิ่งที่สกัดมา
Cong> นี่เป็นแพตช์แบบร่างในการนำแคชแคชแบบดรอปต่อไฟล์
น่าสนใจ ดังนั้นฉันสามารถทำสิ่งนี้จากนอกกระบวนการได้หรือไม่? ฉันคือ SysAdmin ดังนั้น POV ของฉันจึงสังเกตเห็นค้นหาและแก้ไขปัญหาประสิทธิภาพเมื่อระบบอยู่ภายใต้แรงกดดัน
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.
ฉันจะบอกได้อย่างไรว่าไฟล์ถูกใช้ไปมากแค่ไหน? และประสิทธิภาพการทำงานของสิ่งนี้เมื่อทำงานบนระบบไม่ว่างคืออะไร? และแพทช์นี้ซื้ออะไรให้เราตั้งแต่ฉันคิดว่า VM ควรจะวางแคชไว้แล้วเมื่อระบบมาภายใต้ความกดดัน mem ...
Cong> ด้านล่างเป็นกรณีทดสอบขนาดเล็กสำหรับแพทช์นี้:
เธรดประกอบด้วยทั้ง testcase และ patch ที่แท้จริงไปยังหลาย ๆ ไฟล์ภายในเคอร์เนล Linux ซึ่งเพิ่มฟังก์ชันเพิ่มเติมเพื่อfs/drop_caches.c
เรียกdrop_pagecache_file(struct file *filp)
ใช้ ฟังก์ชั่นนี้เป็นแล้วสามารถเข้าถึงได้ผ่านเครื่องมือส่วนหน้า, ผ่านคำสั่งfnctl.c
F_DROP_CACHES
กรณีนี้เรียกใช้ฟังก์ชันนี้:
file_drop_caches(filp, arg);
ซึ่งจัดการกับการลดลงของแคชทั้งหมดที่เกี่ยวข้องกับไฟล์ที่กำหนด จากไฟล์include/linux/mm.h
:
void file_drop_caches(struct file *filp, unsigned long which);
ดังนั้นสิ่งนี้สามารถใช้?
ฉันไม่พบหลักฐานว่าแพตช์นี้เข้ามาในพื้นที่เก็บข้อมูลโค้ดเคอร์เนลหลักของ Linux ดังนั้นตัวเลือกนี้จะปรากฏขึ้นให้ใช้งานได้เฉพาะในกรณีที่คุณต้องการคอมไพล์เคอร์เนล Linux อีกครั้ง
ศักยภาพวิธี # 2 - การใช้ dd
dd
ในหัวข้อเดียวกันกับที่ผู้ใช้อื่นกล่าวถึงวิธีการที่แตกต่างอย่างสิ้นเชิงที่ทำให้การใช้
ข้อความต่อไปนี้เป็นข้อความที่ตัดตอนมาจาก
นี่คือฟังก์ชั่นที่มีประโยชน์ แม้ว่าจะไม่ได้บัญญัติไว้แล้วด้วย
POSIX_FADV_DONTNEED
? ฟังก์ชั่นนี้ถูกบันทึกGNU DD (8.11) ในปีที่ผ่านมา
นี่คือตัวอย่างจากแพทช์ที่:
แนะนำให้วางแคชสำหรับไฟล์ทั้งหมด
$ dd if=ifile iflag=nocache count=0
ตรวจสอบให้แน่ใจว่าวางแคชสำหรับไฟล์ทั้งหมด
$ dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
วางแคชสำหรับส่วนของไฟล์
$ dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
สตรีมข้อมูลโดยใช้แคชการอ่านล่วงหน้า
$ dd if=ifile of=ofile iflag=nocache oflag=nocache
ทดสอบมันออกมา
ฉันไม่ได้เป็นบวก 100% วิธีทดสอบสิ่งนี้ แต่ฉันคิดวิธีต่อไปนี้
ทำไฟล์ 100MB
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
ไฟล์การสืบค้นกลับเข้าถึงโดยใช้ fatrace
$ sudo fatrace | grep sample.txt
เรียกใช้top
เพื่อให้เราสามารถตรวจสอบการใช้งานหน่วยความจำทราบจำนวนฟรี
$ top
เปิดไฟล์บันทึกจำนวนหน่วยความจำว่างในขณะนี้ หมายเหตุของไฟล์fatrace
sample.txt
$ cat sample.txt > /dev/null
ปล่อยไฟล์จากหน่วยความจำจำนวนหน่วยความจำว่างในขณะนี้ หมายเหตุ: fatrace
การส่งออกของ
$ sudo dd of=/home/saml/tst/162600/sample.txt \
oflag=nocache conv=notrunc,fdatasync count=0
ตัวอย่าง
ในเทอร์มินัล # 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
ในเทอร์มินัล # 2:
$ top
...
KiB Mem: 7968336 total, 6900956 used, 1067380 free, 267080 buffers
...
ในเทอร์มินัล # 3:
$ sudo fatrace | grep sample.txt
ตอนนี้เปิดไฟล์sample.txt
และจดบันทึกจำนวน RAM ในเทอร์มินัล # 1
$ cat sample.txt > /dev/null
ในเทอร์มินัล # 2:
KiB Mem: 7968336 total, 7011896 used, 956440 free, 267336 buffers
สังเกตเห็นผลลัพธ์ของfatrace
ในเทอร์มินัล # 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
ตอนนี้ลบไฟล์ออกจาก RAM ใน terminal # 4:
$ sudo dd of=/home/saml/tst/162600/sample.txt \
oflag=nocache conv=notrunc,fdatasync count=0
บันทึกผลลัพธ์ของfatrace
ในเทอร์มินัล # 2:
dd(26229): O /home/saml/tst/162600/sample.txt
dd(26229): CW /home/saml/tst/162600/sample.txt
บันทึกแรมในเทอร์มินัล # 3:
KiB Mem: 7968336 total, 6908364 used, 1059972 free, 267364 buffers
ดังนั้นดูเหมือนว่าไฟล์ทั้งหมดใน RAM ที่ถูกใช้หมด
ศักยภาพวิธี # 3 - python-fadvise
ขอบคุณที่คอมเมนต์โดย @frostchutz มีเครื่องมืออีกอันสคริปต์ Python ชื่อ[pyadvise][4]
ซึ่งให้ส่วนต่อประสานที่ง่ายกว่าdd
วิธีการด้านบน สคริปต์นี้ใช้ประโยชน์จากposix_fadvise(2)
อินเทอร์เฟซเดียวกัน
ตัวอย่าง
$ 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
และถ้าเราทำซ้ำการทดสอบข้างต้นและใช้pyadvise
แทนdd
:
$ pyadvise -d /home/saml/tst/162600/sample.txt
dd
ฉันสังเกตเห็นการลดลงเหมือนกันในแรมถูกใช้เป็นมาก่อนเมื่อผมใช้