ในหน่วยความจำระบบ…โดยเฉพาะความแตกต่างระหว่าง `tmpfs,` `shm, 'และ' hugepages ... '


16

ฉันเพิ่งสงสัยเกี่ยวกับระบบไฟล์ที่ใช้หน่วยความจำเคอร์เนลลินุกซ์ต่างๆ

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

ท้ายที่สุดฉันคิดว่าฉันต้องการติดตั้งระบบไฟล์ที่ใช้งานได้hugepages,แม้ว่างานวิจัยเบา ๆ (และยังคงมีการแก้ไขเล็กน้อย) ทำให้ฉันเชื่อว่า a rewritable hugepage mountไม่ใช่ตัวเลือก ฉันเข้าใจผิด กลไกอะไรที่เล่นที่นี่?

ยังเกี่ยวกับ hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(นี่คือข้อความแบบเต็มของ/ proc / meminfoและ/ proc / cpuinfo )

เกิดอะไรขึ้นข้างต้น? ฉันกำลังจัดสรรhugepages?อยู่หรือไม่มีความแตกต่างระหว่างDirectMapหน้าหน่วยความจำและhugepages?

ปรับปรุงหลังจากที่บิตของดุนจาก @Gilles ผมได้เพิ่มอีก 4 สายเหนือและดูเหมือนว่าจะต้องมีความแตกต่างกัน แต่ผมไม่เคยได้ยินของDirectMapก่อนที่จะดึงที่tailเมื่อวานนี้ ... อาจจะDMIหรืออะไร?

เพียงเล็กน้อยเท่านั้น ...

ล้มเหลวในการประสบความสำเร็จกับhugepagesความพยายามและสมมติว่าการสำรองข้อมูลฮาร์ดดิสก์ของไฟล์ภาพใด ๆ ความเสี่ยงของการติดตั้งลูปจากtmpfs?ระบบไฟล์ของฉันเป็นswappedสถานการณ์ที่เลวร้ายที่สุดหรือไม่? ฉันเข้าใจว่าtmpfsไฟล์แคชของระบบไฟล์ถูกเมานต์ - ไฟล์ลูปที่ติดตั้งของฉันจะถูกกดดันจากหน่วยความจำได้ไหม มีมาตรการบรรเทาผลกระทบที่ฉันสามารถทำได้เพื่อหลีกเลี่ยงปัญหานี้หรือไม่?

สุดท้าย - มันคืออะไรกันแน่shm,? มันแตกต่างจากหรือรวมอย่างใดอย่างหนึ่งhugepagesหรือtmpfs?


1
สิ่งที่เกี่ยวกับบรรทัดก่อนหน้าใน/proc/meminfoที่มีHugePage(หรือรุ่นเคอร์เนลของคุณไม่ได้มี) สถาปัตยกรรมนี้คืออะไร (x86_64 ฉันคิดว่า)
— Gilles 'หยุดความชั่วร้าย'

ป่วยเพิ่มพวกเขา ฉันแค่กังวลว่ามันจะนานเกินไป
— mikeserv

@Gilles - ฉันเชื่อมโยงกับข้อความธรรมดาด้านบน ฉันหวังว่าไม่เป็นไร ขอบคุณที่ถาม - ฉันควรรวมไว้ในตอนแรก - ฉันไม่รู้ว่าฉันพลาดมันไปได้อย่างไร
— mikeserv

คำตอบ:


13

ไม่มีความแตกต่างระหว่าง 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) ) สำหรับกระบวนการอื่นที่จะใช้


2
นี่เป็นสิ่งที่ดีจริงๆ - THS ของฉันDirectMapคืออะไร?
— mikeserv

ที่ฉันไม่สามารถตอบได้เมื่อฉัน googled DirectMapping และพบว่าไม่มีอะไรเกี่ยวข้องกับ tmpfs เป็นต้นสิ่งเดียวที่ฉันทำได้คือการกำหนดค่า HugeMem Support สำหรับฐานข้อมูล Oracle ที่ทำงานบน Linux ซึ่งหมายความว่าพวกเขากำลังใช้ HugePages แทน THS ฉันเรียกว่า เมล็ดทั้งหมดใน 2.6 สาขาสนับสนุน THS เป็นลางสังหรณ์ให้ดูความคิดเห็นใหม่ของฉันด้านบน
— eyoung100

ใช่ฉันเปิดขึ้นน้อยมากเช่นกัน ฉันอ่าน HP, THP เสร็จแล้ว ฉันรู้สึกทึ่งกับความคิดเห็นของคุณ มันกำลังก่อร่างขึ้นจริงๆ ส่วนสุดท้ายนี้ - HP เท่านั้น - ฉันควรตีความสิ่งนี้ว่าหมายความว่าฉันสามารถเมาท์ระบบไฟล์อ่าน / เขียนบนเมาท์ hugepage ได้หรือไม่? เช่นเดียวกับไฟล์รูปภาพที่ติดตั้งแบบวนซ้ำจากจุดยึด hugepage หรือไม่ สามารถเขียนได้?
— mikeserv

ใช่และสามารถเขียนได้เมื่อติดตั้งอย่างถูกต้อง แต่ระวัง: 1. เนื่องจากเมื่อคุณติดตั้งคุณจะต้องรับผิดชอบในการล้างข้อมูล 2. มันสิ้นเปลือง: โดยใช้ตัวอย่างของคุณสมมติว่าลูปของคุณมีไฟล์ข้อความอยู่เท่านั้น ตัวละคร: สวัสดีฉันชื่อไมค์ สมมติว่าตัวละครแต่ละตัวเป็น 1k ไฟล์นั้นจะบันทึกเป็น 23k คุณเสีย 2025k เนื่องจาก Hugepage มอบ 2MB ให้คุณ พฤติกรรมที่สิ้นเปลืองนั่นคือสาเหตุที่การจัดการหน่วยความจำถูกสร้างขึ้นในเคอร์เนล นอกจากนี้ยังป้องกันไม่ให้เราต้องใช้ wrapper DLL เช่น kernel32
— eyoung100

และในที่สุด 3. คุณเสียการเมานต์เมื่อรีบูทหรือชน
— eyoung100 100

4

เพื่อแก้ไขปัญหา "DirectMap": เคอร์เนลมีการแมปเชิงเส้น ("โดยตรง") ของหน่วยความจำกายภาพแยกจากการแมปเสมือนที่จัดสรรให้กระบวนการของผู้ใช้แต่ละกระบวนการ

เคอร์เนลใช้หน้าที่เป็นไปได้มากที่สุดสำหรับการทำแผนที่นี้เพื่อลดความดัน TLB

DirectMap1G สามารถมองเห็นได้หากซีพียูของคุณรองรับ 1Gb หน้า (บาร์เซโลนาเป็นต้นไปสภาพแวดล้อมเสมือนบางอันจะปิดการใช้งาน) และหากเปิดใช้งานในเคอร์เนล - ค่าเริ่มต้นจะอยู่ที่ 2.6.29+


3

ไม่มีความแตกต่างระหว่างshmและtmpfs(จริง ๆ แล้วtmpfsเป็นเพียงชื่อใหม่ของอดีตshmfs) hugetlbfsเป็นtmpfsระบบไฟล์พื้นฐานที่จัดสรรพื้นที่ของมันจากหน้าเพจขนาดใหญ่ของเคอร์เนลและต้องการการกำหนดค่าเพิ่มเติมที่สามารถจ่ายได้ (วิธีใช้สิ่งนี้อธิบายไว้ในเอกสาร / vm / hugetlbpage.txt )


นี่เป็นความพยายามที่ดีและฉันได้อ่านเอกสารเหล่านั้นแล้วแน่นอน หรืออาจจะไม่แน่นอน - แต่ฉันคิดว่าฉันจะเอามันออกไปเพื่อความโปรดปราน 100rep แต่ก่อนที่ฉันจะทำฉันจะเสนอให้คุณถ้าคุณสามารถขยายได้ จนถึงตอนนี้คุณยังเพิ่มพูนความเข้าใจของฉัน - ฉันรู้ไปแล้วส่วนใหญ่ยกเว้นว่าทั้งสองเป็นเพียงคำพ้องความหมาย ไม่ว่าในกรณีใด ๆ หากคุณสามารถทำให้คำตอบนี้ดีขึ้นในวันพรุ่งนี้ตอนเช้าเงินรางวัล 100rep เป็นของคุณ น่าสนใจเป็นพิเศษสำหรับฉันคือฉันไม่พบการกล่าวถึงDirectMapเลยในprocfs manหน้านี้ มาทำไม
— mikeserv

1
@mikeserv - ฉันพบความแตกต่างนี้ซึ่งแสดงว่าฟังก์ชันใดคำนวณ DirectMaps จาก: lkml.org/lkml/2008/11/6/163
— slm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.