เหตุใด Linux จึงรายงานว่าหน่วยความจำ“ ฟรี” แปลก


44

นี่เป็นคำถามที่ยอมรับได้ว่าระบบปฏิบัติการ Unix รายงานการใช้หน่วยความจำอย่างไร
คำถามที่คล้ายกัน:

ฉันมีเซิร์ฟเวอร์ที่ใช้งานจริงซึ่งใช้Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

cronทุกวันจะเรียกใช้สคริปต์สำรองเป็น root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

ทุกอย่างทำงานได้อย่างสมบูรณ์ แต่ฉันสังเกตเห็นว่ากราฟหน่วยความจำของ Munin แสดงแคชและบัฟเฟอร์ที่เพิ่มขึ้นหลังจากการสำรองข้อมูล

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

นี่คือกราฟ Munin:

รูปภาพที่โฮสต์ภายนอกนั้นเป็นลิงค์ที่ตายแล้ว


3
ขอแสดงความยินดีคำถามนี้ได้รับการยกย่อง (เป็นคำถามที่ 6 ในวันนี้และมันมีตัวอย่างที่น่าสนใจและน่าสนใจที่สุด :-)
voretaq 7

คำตอบ:


27

นี่เป็น "ปัญหา" เดียวกันจากที่เซิร์ฟเวอร์ปฏิเสธที่จะใช้ swap partitionและคำถามที่คล้ายกันอื่น ๆ ในเว็บไซต์นี้ ( การใช้งานหน่วยความจำสูงบน Linux Server , การใช้งานหน่วยความจำใน Linux , เว็บเซิร์ฟเวอร์ทำงานในหน่วยความจำต่ำฯลฯ )

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

จากกราฟนี้การใช้หน่วยความจำที่มีประสิทธิภาพของคุณไม่ได้เปลี่ยนแปลงตลอดระยะเวลาของกราฟ


เป็นไปได้ไหมที่จะสั่งเซิร์ฟเวอร์ไม่ให้แคชไฟล์เหล่านี้? ฉันเดาฉันควรรันsync; echo 3 > /proc/sys/vm/drop_cachesหลังจากสำรอง?

13
@ stan31337 ใช่มันเป็นไปได้ไม่คุณไม่ควรทำอย่างนั้น การมีไฟล์นี้ในหน่วยความจำไม่มีค่าใช้จ่าย หากคุณล้างแคชทั้งหมดทุกไฟล์ที่ถูกแคชและต้องอ่านอีกครั้งจากดิสก์จะทำให้ระบบของคุณช้าลง ปล่อยให้มันทำในสิ่งที่ออกแบบมาให้ทำ
Jeff Ferland

2
@ stan31337 เมื่อคุณลบไฟล์สำรองข้อมูล OS จะเตะออกจากแคชโดยอัตโนมัติ (นั่นเป็นสาเหตุที่หน่วยความจำว่างของคุณกระโดดอีกครั้งหลังจากที่คุณลบ) - Linux ฉลาดพอที่จะรู้ว่าไฟล์ที่ไม่เปิดและไม่สามารถ เข้าถึงได้จากแผนผังระบบไฟล์จะไม่สามารถเข้าถึงได้อีก เช่นเดียวกับ Jeff กล่าวว่าคุณไม่ต้องการทิ้งแคช FS ทั้งหมดของคุณ (ระบบจะต้องอ่านและแคชข้อมูลนั้นใหม่จากดิสก์ซึ่งจะทำให้เซิร์ฟเวอร์ของคุณช้าลงชั่วขณะหนึ่ง)
voretaq7

61

คุณกำลังประสบลินุกซ์กินรามฉันปัญหา

อย่าตกใจ

นี่ไม่ใช่ปัญหา.

ระบบของคุณทำงานตามที่ออกแบบไว้

ปัญหาไม่ใช่ระบบปฏิบัติการของคุณ - ปัญหาคือคุณเข้าใจว่าหน่วยความจำ "ฟรี" คืออะไร


ระบบ Unix ใช้หน่วยความจำมากกว่าแค่การรันโปรแกรม อาจใช้หน่วยความจำสำหรับ:

  • โปรแกรมที่กำลังทำงาน (ใช้งาน / ใช้)
  • ข้อมูลบัฟเฟอร์ระหว่างทาง (บัฟเฟอร์)
  • ข้อมูลแคชเพิ่งอ่าน / เขียนไปยังดิสก์ (แคช)
  • ไม่มีอะไรแน่นอน (ฟรี)

สิ่งที่ตามมาคือการทัวร์สั้น ๆ (และส่วนใหญ่ไม่สมบูรณ์) ว่าระบบ Unix ที่ทันสมัยรายงานการใช้ RAM อย่างไร

หน่วยความจำว่าง(นิยามของระบบปฏิบัติการ)คืออะไร

เมื่อระบบ Unix รายงาน RAM ว่าฟรีหมายถึง "ฉันไม่ได้ใช้ RAM นี้เพื่ออะไร"
Free RAM นั้นไร้ค่าอย่างมีประสิทธิภาพ - มันไม่ได้ทำให้ระบบของคุณเร็วขึ้นมันแค่นั่งอยู่ที่นั่นว่า "ฟรี" ในกรณีที่มีบางสิ่งที่จำเป็น สิ่งนั้นอาจเป็นหนึ่งในสามรายการอื่น ๆ ที่ฉันได้กล่าวไว้ข้างต้น

หน่วยความจำแคชและบัฟเฟอร์คืออะไร

หน่วยความจำแคชและบัฟเฟอร์เป็น RAM ที่ระบบปฏิบัติการใช้เพื่อทำให้ระบบของคุณเร็วขึ้น
หน่วยความจำนี้ไม่จำเป็นสำหรับการเรียกใช้โปรแกรมในขณะนี้ดังนั้นระบบปฏิบัติการของคุณใช้เพื่อเก็บข้อมูลที่ต้องการบ่อย - ตัวอย่างเช่นไลบรารี C (ต้องการโดยทุกโปรแกรมที่คุณเรียกใช้) จะถูกเก็บไว้ในcacheหน่วยความจำเกือบตลอดเวลาระบบไม่จำเป็นต้องไปที่ดิสก์เพื่อค้นหาคำแนะนำที่จำเป็นในการพิมพ์ "Hello World" บนหน้าจอ
จริงๆแล้วมันซับซ้อนกว่านั้นมาก - มีหน่วยความจำที่แชร์ , หน่วยความจำแบบมีสายฯลฯ - แต่สำหรับวัตถุประสงค์ของเราคำอธิบายง่ายๆนี้ก็เพียงพอแล้ว

หน่วยความจำที่ใช้งานคืออะไร?

หน่วยความจำที่ใช้งานอยู่เป็นส่วนหนึ่งที่เราเข้าใจว่าเป็นหน่วยความจำ "ใช้แล้ว" - RAM ที่แอปพลิเคชันใช้สำหรับสิ่งที่ทำ - จัดเรียงสเปรดชีตให้บริการหน้าเว็บแก้ไขกราฟิก ฯลฯ
หน่วยความจำ "ใช้งานล่าสุด" - โปรแกรมที่อ้างว่าใช้ประโยชน์จากเนื้อหา (การอ่านหรือการเขียน) และไม่ถือว่าเป็นตัวเลือกที่ดีสำหรับการแลกเปลี่ยน

หน่วยความจำที่ไม่ใช้งานคืออะไร?

เช่นเดียวกับหน่วยความจำที่ใช้งานหน่วยความจำไม่ได้ใช้งานคือ RAM ที่แอปพลิเคชันใช้สำหรับสิ่งที่มันทำ ความแตกต่างคือหน่วยความจำนี้ยังไม่ได้รับการเข้าถึงในขณะที่ดังนั้นถ้าดันมาผลักระบบปฏิบัติการคิดว่ามันสามารถสลับออกไปยังดิสก์และ (มีโชคเล็กน้อย) โปรแกรมที่อ้างว่ามันจะไม่ถามอีกครั้งดังนั้นมัน จะไม่สังเกต

หน่วยความจำ "ใช้แล้ว" คืออะไร(คำจำกัดความของมนุษย์)

สิ่งที่คุณและฉันคิดว่าเป็น "ใช้" หน่วยความจำคือหลักผลรวมของหน่วยความจำที่ใช้งานและไม่ใช้งาน RAM ทั้งหมดที่อ้างสิทธิ์ในขณะนี้โดยแอปพลิเคชันสำหรับการใช้งาน
ตราบใดที่คุณมี RAM ติดตั้งมากกว่าผลรวมของหน่วยความจำที่ใช้งานและไม่ใช้งาน (บวกกับขอบความปลอดภัยที่ดีที่ 512-1024MB อยู่ด้านบน) คุณอยู่ในตำแหน่งที่ถูกต้อง: ระบบปฏิบัติการของคุณอาจไม่ได้แลกเปลี่ยนประสิทธิภาพ .

"ฟรี" ความทรงจำคืออะไร(ความคมชัดของมนุษย์) ?

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

  • หากมีหน่วยความจำว่าง (นั่งรอบทำอะไร) RAM ที่จะถูกจัดสรร
  • หากไม่มีหน่วยความจำว่างระบบปฏิบัติการจะใช้พื้นที่แคชและบัฟเฟอร์: สิ่งที่เข้าถึงได้น้อยที่สุด / อย่างน้อยที่สุดในบัฟเฟอร์พูลจะถูกโยนออกและ RAM ที่มอบให้กับโปรแกรม
  • หากไม่มี Buffer / Cache RAM ในการเปลี่ยน swapper จะดูหน่วยความจำที่ไม่ได้ใช้งานและเลือกพื้นที่ที่คิดว่าน่าจะเข้าถึงได้น้อยที่สุด ข้อมูลนั้นจะถูกเพจเอาต์เพื่อแลกเปลี่ยน (ดิสก์) และ RAM ที่เพิ่งได้รับใหม่ที่มอบให้กับโปรแกรม
  • หาก Inactive RAM ทั้งหมดถูกสลับเป็น Swapper จะเริ่มวาง Active RAM บนดิสก์
    (นี่คือเกี่ยวกับการที่ผลการดำเนินงานมักจะไปที่สุนัข: ทุกครั้งที่โปรแกรมที่ได้รับการเปิดบน CPU บิตสลับออกมันจะต้องถูกนำกลับเข้ามาใน RAM ซึ่งหมายความว่าหน่วยความจำที่ใช้งานโปรแกรมอื่น ๆ จะต้องมีสลับออก - The อัตราการแลกเปลี่ยนที่สูงในการสลับเรียกว่าthrashing )
  • หากระบบเปลี่ยนทุกอย่างที่ทำได้ (และเติมพาร์ติชั่นสว็อป) หรือถ้าคุณใช้ระบบที่ไม่มีพาร์ติชั่นสว็อป, สิ่งต่าง ๆ จะเกิดขึ้น ณ จุดนี้หนึ่งในสองสิ่งจะเกิดขึ้น:
    • malloc()จะล้มเหลว นี่เป็นพฤติกรรมที่สอดคล้องกับ POSIX - ระบบปฏิบัติการจะบอกโปรแกรมที่ขอ RAM ว่าไม่สามารถตอบสนองคำขอได้
      โปรแกรมสามารถขอ RAM น้อยลงหรือถ้ามันไม่สามารถทำอะไรกับหน่วยความจำขนาดเล็กก็สามารถล้างและออก (หากโปรแกรมเขียนไม่ดีจะทำให้เกิดข้อผิดพลาด)
    • หากคุณอยู่ในกล่อง Linux OOM-Killerอาจไปในรูปแบบไดรฟ์โดยการฆ่าความสนุกสนานยุติกระบวนการอื่น ๆ เพื่อพยายามเพิ่ม RAM ให้เพียงพอเพื่อตอบสนองคำขอ
      ในกรณีที่คุณไม่สามารถบอกได้ด้วยคำอธิบายของฉันที่นี่และคำตอบของฉันสำหรับคำถามที่เชื่อมโยงฉันคิดว่านี่เป็นวิธีที่น่ากลัวในการจัดการกับปัญหา

ทำไม Free RAM ถึงสูงขึ้นเมื่อคุณลบไฟล์

ในตัวอย่างจากคำถามที่นี่คุณสังเกตเห็นว่าเป็นไปได้ที่จะ "ฟรี" แรมโดยการลบไฟล์สำรอง - คำอธิบายสำหรับที่ค่อนข้างง่าย: เนื่องจากไม่มีการใช้ไฟล์นั้น (ไม่มีการจัดการไฟล์ที่เปิด) และไม่สามารถเข้าถึงได้จาก ระบบไฟล์ (ยกเลิกการเชื่อมโยง) ระบบปฏิบัติการรู้ว่าไม่มีใครสามารถเข้าถึงข้อมูลนั้นได้อีกและจะทำการล้างข้อมูลจากแคชของระบบไฟล์
สิ่งนี้ทำให้ระบบปฏิบัติการรายงานหน่วยความจำว่างมากขึ้น แต่ไม่มีผลกระทบต่อประสิทธิภาพของระบบ


ตอนนี้มันชัดเจนอย่างสมบูรณ์แบบสำหรับฉัน ... ประสบการณ์ Linux ของฉันค่อนข้าง 2 เดือนทุกอย่างเริ่มจากเซิร์ฟเวอร์ Debian นี้ หนึ่งเดือนที่ผ่านมาฉันติดตั้ง Gentoo บนแล็ปท็อปที่บ้านและรู้สึกทึ่งกับประสิทธิภาพของมันที่เปลี่ยนจากผู้ใช้ Windows เป็นผู้ใช้ Linux อย่างสมบูรณ์แม้ในคอมพิวเตอร์ที่ทำงานของฉัน เป็นเรื่องดีที่จะเรียนรู้ Linux กับ Gentoo และยังมีอะไรอีกมากมายให้เรียนรู้

@ stan31337 คุณไม่ใช่คนเดียวที่ไม่ชัดเจน - เป็นเรื่องยากโดยเฉพาะอย่างยิ่งสำหรับผู้ที่มาจากพื้นหลังของ Windows เพราะถ้าคุณเจาะลึกลงไป Windows จะไม่รายงานการใช้หน่วยความจำด้วยรายละเอียดในระดับนี้ - เป็น "ใช้แล้ว" (ตามโปรแกรม ) และ "ฟรี" (สำหรับโปรแกรมที่จะใช้) ผู้ใช้ Mac ทำได้ง่ายขึ้นเล็กน้อยเนื่องจาก Activity Monitor เป็นรุ่นกราฟิกtopและรายงาน RAM ที่ว่าง / ใช้งาน / ไม่ทำงาน
voretaq7

ฉันเคยทำงานกับProcess Explorerบน Windows มีหลายสิ่งที่หน่วยความจำที่จะแสดง แต่ส่วนใหญ่ไม่ชัดเจนสำหรับฉันที่จริงฉันไม่ได้ดูพวกเขา ...

2
นอกจากนี้ควรสังเกตว่าในขณะที่ Windows มักไม่แสดงรายละเอียดมาก แต่ก็มีการตั้งค่าที่คล้ายกันมาก
Joachim Sauer

คุณจะรู้ว่าแม้ใน Windows การอ่านหน่วยความจำจะทำให้เกิดความสับสน นี่คือสิ่งที่ผู้ผลิตระบบปฏิบัติการอาจต้องการให้ความสำคัญมากขึ้นหรือมากกว่าสิ่งที่ผู้ใช้ควรใส่ใจน้อยกว่าที่พวกเขาทำในปัจจุบัน
gparent

2

อย่างอื่นเพื่อตรวจสอบว่าข้างต้นล้มเหลว:

ตรวจสอบการใช้งานของแคชแผ่น ( Slab:, SReclaimable:และ SUnreclaim:ใน/proc/meminfo) freeนี่คือแคชในเคอร์เนลโครงสร้างข้อมูลและแยกออกจากแคชหน้ารายงานโดย

หากแคชแผ่นมีความรับผิดชอบสำหรับส่วนใหญ่ของ "หน่วยความจำหาย" ของคุณให้ตรวจสอบ/proc/slabinfoเพื่อดูว่ามันหายไปไหน ถ้ามันเป็นฟันหรือ inodes คุณสามารถใช้sync ; echo 2 > /proc/sys/vm/drop_cachesเพื่อกำจัดพวกเขา

คุณยังสามารถใช้slabtopเครื่องมือเพื่อแสดงการใช้งานปัจจุบันของแคช Slab ในรูปแบบที่เป็นมิตร cจะเรียงลำดับรายการตามขนาดแคชปัจจุบัน

จาก: https://stackoverflow.com/a/5467207

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.