Linux ไม่ได้เพิ่มดิสก์แคชขนาดใหญ่เมื่อความต้องการหน่วยความจำเพิ่มขึ้น


24

ใช้งาน Ubuntu บนเคอร์เนล 2.6.31-302 x86-64 ปัญหาโดยรวมคือฉันมีหน่วยความจำในหมวดหมู่ 'แคช' ที่เพิ่มขึ้นเรื่อย ๆ และจะไม่ถูกปลดปล่อยหรือใช้งานแม้ว่าแอปพลิเคชันของเราต้องการ

ดังนั้นนี่คือสิ่งที่ฉันได้รับจากคำสั่ง 'ฟรี' สิ่งเหล่านี้ไม่ได้ดูออกมาจากภาพธรรมดาในครั้งแรก

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5750320    1608172          0       7848    1443820
-/+ buffers/cache:    4298652    3059840
Swap:            0          0          0

สิ่งแรกที่ใครบางคนจะพูดคือ "ไม่ต้องกังวล linux จัดการหน่วยความจำนั้นโดยอัตโนมัติ" ใช่ฉันรู้ว่าตัวจัดการหน่วยความจำควรทำงานอย่างไร ปัญหาคือว่ามันไม่ได้ทำในสิ่งที่ถูกต้อง "แคช" 1.4 GB ที่นี่ดูเหมือนว่าจะสงวนไว้และไม่สามารถใช้งานได้

ความรู้เกี่ยวกับ Linux ของฉันบอกฉันว่า 3 GB เป็น "ฟรี"; แต่พฤติกรรมของระบบพูดเป็นอย่างอื่น เมื่อใช้หน่วยความจำว่างจริง 1.6 GB ในระหว่างการใช้งานสูงสุดทันทีที่มีการร้องขอหน่วยความจำเพิ่มเติม (และ 'ฟรี' ในคอลัมน์แรกเข้าใกล้ 0) OOM killer ถูกเรียกใช้กระบวนการถูกฆ่าและปัญหาเริ่มเกิดขึ้นแม้ว่า 'ฟรี' ในแถว - / + บัฟเฟอร์ / แคชยังคงมี 'ฟรี' ประมาณ 1.4 GB

ฉันได้ปรับค่า oom_adj ในกระบวนการหลักดังนั้นมันจึงไม่นำระบบมาที่หัวเข่าของมัน แต่ถึงอย่างนั้นกระบวนการที่สำคัญก็จะถูกฆ่าและเราไม่ต้องการไปถึงจุดนั้น โดยเฉพาะอย่างยิ่งเมื่อในทางทฤษฎีแล้ว 1.4GB ยังคงเป็น "ฟรี" ถ้ามันจะขับไล่ดิสก์แคชเท่านั้น

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

สิ่งแรกที่โผล่เข้ามาในหัวของฉันคือการแลกเปลี่ยนนั้นปิด เรามีดูแลระบบที่ยืนกรานเกี่ยวกับมัน ฉันเปิดให้มีการอธิบายหากพวกเขาสำรอง อาจทำให้เกิดปัญหาได้หรือไม่

ที่นี่ฟรีหลังจากใช้งานecho 3 > /proc/sys/vm/drop_caches:

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5731688    1626804          0        524    1406000
-/+ buffers/cache:    4325164    3033328
Swap:            0          0          0

อย่างที่คุณเห็นจำนวนแคชขนาดจิ๋วนั้นเพิ่มขึ้นจริง แต่ประมาณ 1.4 GB ดูเหมือนจะ "ติดอยู่" ปัญหาอื่นคือค่านี้ดูเหมือนจะเพิ่มขึ้นเมื่อเวลาผ่านไป บนเซิร์ฟเวอร์อื่น 2.0 GB ค้างอยู่

ฉันต้องการความทรงจำนี้กลับมา ... ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมากที่สุด

นี่คือcat /proc/meminfoถ้ามันมีค่าอะไร:

# cat /proc/meminfo 
MemTotal:        7358492 kB
MemFree:         1472180 kB
Buffers:            5328 kB
Cached:          1435456 kB
SwapCached:            0 kB
Active:          5524644 kB
Inactive:          41380 kB
Active(anon):    5492108 kB
Inactive(anon):        0 kB
Active(file):      32536 kB
Inactive(file):    41380 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               320 kB
Writeback:             0 kB
AnonPages:       4125252 kB
Mapped:            42536 kB
Slab:              29432 kB
SReclaimable:      13872 kB
SUnreclaim:        15560 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3679244 kB
Committed_AS:    7223012 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        7696 kB
VmallocChunk:   34359729675 kB
DirectMap4k:     7340032 kB
DirectMap2M:           0 kB

3
ฉันไม่มีคำอธิบายใด ๆ สำหรับแคชของคุณ (แม้ว่าฉันสงสัยว่าไฟล์ mmap'd อาจเข้ามา) แต่เพื่อประโยชน์ของมนุษยชาติลองใช้พลั่วและปูนขาวและกำจัด "คุณไม่จำเป็นต้องสลับ ถ้าคุณมี RAM เยอะ! " ผู้สนับสนุน พวกเขามีภูมิคุ้มกันต่อการอภิปรายอย่างมีเหตุผลและพวกเขากำลังผิดอย่างอันตราย ความจริงที่ว่านักฆ่า OOM กำลังสะกดรอยตามคุณเป็นเพียงอาการเดียวของสิ่งนี้
womble

ความคิดของฉันอย่างแน่นอน ขอบคุณสำหรับคำแนะนำ. คุณรู้บทความหรือข้อโต้แย้งที่ดีอื่น ๆ เกี่ยวกับสาเหตุที่จำเป็นต้องสลับหรือไม่
trisweb

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

ยอดเยี่ยมขอบคุณสำหรับเคล็ดลับ คุณถูกต้องเกี่ยวกับไฟล์ mmap'd ตามวิธี - lsof อย่างรวดเร็วแสดงให้เห็นว่ากิ๊กของไฟล์บันทึกการใช้หน่วยความจำ การล้างข้อมูลออกสามารถแก้ไขปัญหาได้
trisweb

ปัญหาคือการที่ไม่มี swap การเขียนทับผลลัพธ์ใน OOM killer ทำงานและไม่ให้ overcommitting ผลลัพธ์ในระบบที่ไม่สามารถเปิดใช้งานกระบวนการ คุณต้องสลับเพื่อใช้ RAM อย่างมีประสิทธิภาพ
David Schwartz

คำตอบ:


8

ฉันได้ค้นพบคำตอบสำหรับคำถามของฉันเอง - ขอบคุณความช่วยเหลือของ womble (ส่งคำตอบถ้าคุณต้องการ)

lsof -s แสดงการจัดการไฟล์ที่ใช้งานและปรากฎว่ามีไฟล์บันทึก mmap'd หลายกิกะไบต์ที่มีการบันทึกแคช

การใช้ logrotate ควรแก้ไขปัญหาให้สมบูรณ์และให้ฉันใช้ประโยชน์จากหน่วยความจำได้มากขึ้น

ฉันจะเปิดใช้งานการสลับอีกครั้งดังนั้นเราจึงไม่มีปัญหากับ OOM killer ในอนาคต ขอบคุณ


2
หน้า mmap'd นั้นถูกละทิ้งดังนั้นจึงไม่ควรทำให้แคชถูกตรึง คุณกำลังใช้ ramfs หรือไม่?
psusi

สวัสดีขออภัยที่ต้องขุดเธรดเก่า แต่ฉันกำลังเผชิญปัญหาเดียวกันในขณะนี้และlsof -sไม่แสดงการใช้งานที่ผิดปกติใด ๆ อย่างไรก็ตามฉันใช้ ramfs เหมือนที่คุณพูด [และเคอร์เนล 2.6.10 ซึ่งไม่มีคุณสมบัติ drop_caches] คุณคิดว่าผู้ต้องสงสัยเป็นอย่างไร
ราม

1
ขอบคุณสำหรับทิป! ฉันกำลังเพิ่มlsof -s | sort -rnk 7 | lessลงในกล่องเครื่องมือของฉันตอนนี้ หมายเหตุสำหรับผู้อ่านอื่น ๆ : รายการนี้อาจมีขนาดใหญ่เช่น/proc/net/rpc/nfs4.nametoid/channelแต่พวกเขาไม่ได้กลายเป็นผู้ร้ายในกรณีของฉัน
Nickolay

ตรวจสอบให้แน่ใจว่าไฟล์หรือโปรแกรมขนาดใหญ่ของคุณไม่ได้ใช้ mlock ใน/proc/meminfoลักษณะที่หน้า "Unevictable"
Michael Martinez

1

เห็นได้ชัดว่า postgres ' shared_buffersสามารถแสดงขึ้นมาได้ในcachedขณะที่ไม่สามารถทิ้งได้อย่างง่ายดาย ... ดูOOM แม้จะมีหน่วยความจำ (แคช)


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