ไม่มีความแตกต่างระหว่าง bmpeem tmpfs และ shm tmpfs เป็นชื่อใหม่สำหรับ shm SHM ย่อมาจาก SHaredMemory
ดู: tmpfs ลินุกซ์
เหตุผลหลักที่ใช้ tmpfs แม้กระทั่งทุกวันนี้ก็คือความคิดเห็นนี้ใน / etc / fstab ของฉันในกล่อง gentoo ของฉัน BTW Chromium จะไม่สร้างเมื่อสายขาดหายไป:
# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for
# POSIX shared memory (shm_open, shm_unlink).
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0
ซึ่งออกมาจากเอกสารเคอร์เนล linux
พิเศษ:
tmpfs มีประโยชน์ดังต่อไปนี้:
1) มักจะมีการติดตั้งเคอร์เนลภายในซึ่งคุณจะไม่เห็น
เลย ใช้สำหรับการแมปแบบไม่ระบุชื่อที่ใช้ร่วมกันและ
หน่วยความจำที่แชร์ของ SYSV
การเมาท์นี้ไม่ขึ้นอยู่กับ CONFIG_TMPFS หากไม่ได้ตั้งค่า CONFIG_TMPFS ส่วนที่ผู้ใช้มองเห็นได้ของ tmpfs จะไม่ถูกสร้าง แต่มี
กลไกภายในอยู่เสมอ
2) glibc 2.2 ขึ้นไปคาดว่าจะติดตั้ง tmpfs ที่ / dev / shm สำหรับ
POSIX หน่วยความจำที่แชร์ (shm_open, shm_unlink) การเพิ่ม
บรรทัดต่อไปนี้ใน / etc / fstab ควรดูแลสิ่งนี้:
tmpfs / dev / shm ค่าเริ่มต้นของ tmpfs 0 0
อย่าลืมสร้างไดเร็กทอรีที่คุณตั้งใจจะเมาท์ tmpfs หากจำเป็น
การเมานต์นี้ไม่จำเป็นสำหรับหน่วยความจำที่แชร์ของ SYSV
เมาท์ภายในถูกใช้สำหรับสิ่งนั้น (ในรุ่นเคอร์เนล 2.3
จำเป็นต้องเมานต์บรรพบุรุษของ tmpfs (shm fs) เพื่อใช้
หน่วยความจำที่แชร์ของSYSV )
3) บางคน (รวมถึงฉันด้วย) พบว่าสะดวกในการติดตั้ง
เช่นบน / tmp และ / var / tmp และมีพาร์ทิชัน swap ขนาดใหญ่ และตอนนี้การ
เมานต์ลูปของไฟล์ tmpfs ทำงานได้ดังนั้น mkinitrd ที่ส่งโดย
การกระจายส่วนใหญ่ควรประสบความสำเร็จด้วย tmpfs / tmp
4) และอาจจะมากขึ้นฉันไม่รู้เกี่ยวกับ :-)
tmpfs มีสามตัวเลือกเมานท์สำหรับการปรับขนาด:
ขนาด: ขีด จำกัด ของไบต์ที่จัดสรรสำหรับอินสแตนซ์ tmpfs นี้ ค่าเริ่มต้นคือครึ่งหนึ่งของ RAM จริงของคุณโดยไม่มีการสลับ หากคุณปรับขนาดอินสแตนซ์ tmpfs ของคุณเครื่องจะหยุดทำงานเนื่องจากตัวจัดการ OOM จะไม่สามารถเพิ่มหน่วยความจำนั้นได้
nr_blocks:เท่ากับขนาด แต่อยู่ในบล็อกของ PAGE_CACHE_SIZE
nr_inodes:จำนวน inodes สูงสุดสำหรับอินสแตนซ์นี้ ค่าเริ่มต้นคือครึ่งหนึ่งของจำนวนหน้า RAM ที่มีอยู่จริงของคุณหรือ (บนเครื่องที่มี highmem) จำนวนหน้า RAM ของ lowmem แล้วแต่จำนวนใดจะต่ำกว่า
จากเคอร์เนล Hugepage แบบโปร่งใส:
การสนับสนุน Hugepage แบบโปร่งใสช่วยเพิ่มประโยชน์สูงสุดของหน่วยความจำฟรีหากเปรียบเทียบกับวิธีการสำรองของ hugetlbfs โดยอนุญาตให้ใช้หน่วยความจำที่ไม่ได้ใช้ทั้งหมดเป็นแคชหรือสังหาริมทรัพย์อื่น ๆ (หรือหน่วยงานที่ไม่สามารถเคลื่อนย้ายได้) ไม่จำเป็นต้องมีการจองเพื่อป้องกันความล้มเหลวในการจัดสรร hugepage ให้สังเกตได้จาก userland ช่วยให้การเพจและคุณสมบัติขั้นสูงอื่น ๆ ของ VM พร้อมใช้งานบน hugepages มันไม่จำเป็นต้องมีการดัดแปลงสำหรับแอปพลิเคชันเพื่อใช้ประโยชน์จากมัน
อย่างไรก็ตามแอปพลิเคชันสามารถปรับให้เหมาะสมต่อไปเพื่อใช้ประโยชน์จากคุณลักษณะนี้เช่นตัวอย่างที่ได้รับการปรับให้เหมาะสมก่อนที่จะหลีกเลี่ยงการเรียกใช้ระบบ mmap สำหรับ malloc (4k) ทุกครั้ง การเพิ่มประสิทธิภาพ userland นั้นไม่ได้บังคับและ khugepaged สามารถจัดการการจัดสรรเพจที่ใช้งานได้ยาวนานแม้สำหรับแอปพลิเคชันที่ไม่รู้ตัว hugepage ที่จัดการกับหน่วยความจำจำนวนมาก
ความคิดเห็นใหม่หลังจากทำการคำนวณบางอย่าง:
ขนาดของ HugePage: 2MB
HugePages ที่ใช้: ไม่มี / ปิดตามหลักฐานของ 0 ทั้งหมด แต่เปิดใช้งานตาม 2Mb ด้านบน
DirectMap4k: 8.03Gb
DirectMap2M: 16.5Gb
DirectMap1G: 2Gb
การใช้ย่อหน้าด้านบนเกี่ยวกับการปรับให้เหมาะสมใน THS ดูเหมือนว่า 8Gb ของหน่วยความจำของคุณกำลังถูกใช้โดยแอปพลิเคชันที่ทำงานโดยใช้ mallocs ขนาด 4k, 16.5Gb ได้รับการร้องขอจากแอปพลิเคชันที่ใช้ mallocs ของ 2M แอปพลิเคชันที่ใช้ mallocs ของ 2M จำลองการสนับสนุน HugePage โดยการถ่ายโอนส่วน 2M ไปยังเคอร์เนล นี่เป็นวิธีที่ต้องการเนื่องจากเมื่อเคอร์เนล malloc ถูกปล่อยออกมาหน่วยความจำจะถูกปล่อยออกสู่ระบบในขณะที่การติดตั้ง tmpfs โดยใช้ hugepage จะไม่ส่งผลให้มีการทำความสะอาดเต็มรูปแบบจนกว่าระบบจะรีบูต สุดท้ายนี้โปรแกรมที่ง่ายคุณมี 2 โปรแกรมที่เปิด / รันซึ่งร้องขอ malloc ขนาด 1Gb
สำหรับคนที่อ่านว่าไม่รู้ malloc เป็นโครงสร้างมาตรฐานใน C ซึ่งหมายถึง Memory ALLOCation การคำนวณเหล่านี้เป็นเครื่องพิสูจน์ว่าค่าสหสัมพันธ์ของ OP ระหว่าง DirectMapping และ THS อาจถูกต้อง นอกจากนี้โปรดทราบว่าการติดตั้ง HUGEPAGE เฉพาะ fs เท่านั้นจะส่งผลให้ได้รับเพิ่มขึ้น 2MB ในขณะที่ให้ระบบจัดการหน่วยความจำโดยใช้ THS ส่วนใหญ่เกิดขึ้นในบล็อก 4k ซึ่งหมายถึงการจัดการหน่วยความจำทุกครั้งที่ malloc บันทึกระบบ 2044k (2048 - 4) ) สำหรับกระบวนการอื่นที่จะใช้
/proc/meminfo
ที่มีHugePage
(หรือรุ่นเคอร์เนลของคุณไม่ได้มี) สถาปัตยกรรมนี้คืออะไร (x86_64 ฉันคิดว่า)