ในหน่วยความจำระบบ…โดยเฉพาะความแตกต่างระหว่าง `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.