ทำไมวางแคชใน Linux?


84

ในเซิร์ฟเวอร์ของเราเรามีนิสัยในการปล่อยแคชเวลาเที่ยงคืน

sync; echo 3 > /proc/sys/vm/drop_caches

เมื่อฉันเรียกใช้รหัสดูเหมือนว่าจะเพิ่ม RAM จำนวนมาก แต่ฉันต้องทำอย่างนั้นจริงๆ แรมไม่เสียเปล่าหรือเปล่า


62
ค้นหาบุคคลที่ใส่สิ่งนี้และถามเขาว่าทำไมเขาถึงทำ ในขณะที่คุณเดาถูกต้องไม่มีเหตุผลที่ดีที่ชัดเจนสำหรับมัน
Michael Hampton

10
การดีบักเคอร์เนล เกี่ยวกับมัน. นี่ไม่ได้เพิ่ม RAM ใด ๆ เลย มันจะลดแคชตามที่ชื่อแนะนำและทำให้ประสิทธิภาพลดลง
Michael Hampton

28
@ รหัสแล้วคุณควรค้นหาและแก้ไขปัญหากับเซิร์ฟเวอร์นั้นแทนที่จะพยายามหลีกเลี่ยงเงื่อนไขที่ทำให้เกิดปัญหา หากรถของฉันจอดทุกครั้งที่ฉันเลี้ยวขวาแบบคมการหลีกเลี่ยงการเลี้ยวขวาที่คมชัดเป็นวิธีแก้ไขที่ไม่มีหมัด
David Schwartz

7
thedailywtf.com/Articles/Modern-Memory-Management.aspxที่เกี่ยวข้องเถียงกันอย่างรุนแรงว่าเป็นความคิดที่ไม่ดี
Drunix

7
ที่เกี่ยวข้องและคำอธิบายที่เป็นประโยชน์ของ "ปัญหา": linuxatemyram.com
Bill Weiss

คำตอบ:


86

คุณถูกต้อง 100% มันเป็นไม่ได้เป็นวิธีที่ดีเพื่อเพิ่มแรม นี่เป็นตัวอย่างของการบริหารระบบลัทธิขนส่งสินค้า


9
+1 สำหรับการกล่าวถึงการดูแลระบบ Cargo Cult ดูแลระบบใด ๆ ที่ไม่ทราบคำนั้นและความหมายนั้นควรถูกไล่ออก
Tonny

8
@Tonny: เราจะถูกทิ้งไว้โดยไม่มีแผนกดูแลระบบแล้ว :(
PlasmaHH

2
เช่นเดียวกับมนุษยชาติส่วนใหญ่ฉันชอบการยืนยันคำพูดสั้น ๆ ที่ได้รับการอนุมัติมากมาย แต่การกล่าวอ้างหรือการให้เหตุผลจะได้รับ +1 ซูเปอร์โกของฉัน
Aaron Hall

2
อธิบายการบริหารสินค้า - ลัทธิเช่นเดียวกับข้างต้นถ้าคุณไม่รังเกียจ อาจจะแก้ไขในการติดตาม? ฉันยังคงระงับ +1 ของฉัน ... : P
Aaron Hall

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

62

ใช่การล้างแคชจะทำให้ RAM ว่าง แต่จะทำให้เคอร์เนลค้นหาไฟล์บนดิสก์มากกว่าในแคชซึ่งอาจทำให้เกิดปัญหาประสิทธิภาพการทำงาน

โดยปกติเคอร์เนลจะล้างแคชเมื่อ RAM ที่มีอยู่หมดลง มันมักจะเขียนเนื้อหาสกปรกไปยังดิสก์โดยใช้ pdflush


20
+1 เพื่ออธิบายว่าทำไมมันเป็นความคิดที่ไม่ดี
Ogre Psalm33

35

สาเหตุที่ทำให้แคชแบบนี้มีไว้สำหรับการเปรียบเทียบประสิทธิภาพของดิสก์และเป็นเหตุผลเดียวที่มีอยู่

เมื่อรันเกณฑ์มาตรฐาน I / O คุณต้องการให้แน่ใจว่าการตั้งค่าต่างๆที่คุณพยายามทำคือการทำดิสก์ I / O ดังนั้น Linux จึงอนุญาตให้คุณวางแคชแทนที่จะรีบูตแบบเต็ม

อ้างจากเอกสาร :

ไฟล์นี้ไม่ได้หมายถึงการควบคุมการเจริญเติบโตของแคชเคอร์เนลต่างๆ (inodes, dentries, pagecache, ฯลฯ ... ) วัตถุเหล่านี้จะถูกเรียกคืนโดยอัตโนมัติโดยเคอร์เนลเมื่อจำเป็นต้องใช้หน่วยความจำที่อื่นในระบบ

การใช้ไฟล์นี้อาจทำให้เกิดปัญหาประสิทธิภาพการทำงาน เนื่องจากทิ้งวัตถุที่แคชไว้จึงอาจมีค่าใช้จ่าย I / O และ CPU จำนวนมากในการสร้างวัตถุที่ถูกทิ้งใหม่โดยเฉพาะอย่างยิ่งหากใช้งานหนัก ด้วยเหตุนี้จึงไม่แนะนำให้ใช้นอกสภาพแวดล้อมการทดสอบหรือการดีบัก


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

1
"วัตถุเหล่านี้จะถูกกู้คืนโดยอัตโนมัติโดยเคอร์เนลเมื่อจำเป็นต้องใช้หน่วยความจำ" เป็นเป้าหมายการออกแบบ แต่อาจไม่ได้เป็นพฤติกรรมจริงเสมอไป
Dan Pritts

@DanPritts อะไรที่ทำให้คุณคิดว่ามันไม่เป็นเช่นนั้น?
Joe

2
กรณีที่ชัดเจนคือเมื่อคุณต้องการล้าง RAM เพื่อให้สามารถจัดสรร hugepages ได้มากขึ้น (ไม่ใช่ trnsparent); อีกกรณีหนึ่งคือคอลเลกชันขยะ hugepage แบบโปร่งใสหยุดข้อบกพร่องชั่วคราว (ดูคำตอบ / ความเห็นของฉันที่อื่นในคำถามนี้) แต่ความคิดเห็นของฉันมีไว้สำหรับกรณีทั่วไป บางครั้งผู้ที่ใช้ระบบนี้ก็รู้ดีกว่าคนที่ออกแบบ / นำไปใช้งาน บ่อยครั้งที่ไม่ใช่ - นั่นคือสิ่งที่ความคิดเห็นของพวกเขาพยายามปกป้อง ฉันแค่ดีใจที่
Dan Pritts

26

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

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

ในสภาพแวดล้อมของฉันลินุกซ์เดาผิดบ่อยครั้งและเมื่อเริ่มต้นตลาดหุ้นยุโรปส่วนใหญ่ (ประมาณเวลาท้องถิ่น 0900) จะเริ่มทำสิ่งต่าง ๆ ที่พวกเขาทำเพียงครั้งเดียวต่อวันจำเป็นต้องสลับในหน่วยความจำที่เคยสลับกันเพราะการเขียน logfiles การบีบอัดการคัดลอกเป็นต้นกำลังเติมแคชจนถึงจุดที่สิ่งต่าง ๆ จะต้องถูกสับเปลี่ยน

แต่การวางแคชแก้ปัญหานี้หรือไม่ ไม่แน่นอน สิ่งที่จะเป็นวิธีแก้ปัญหาที่นี่คือการบอก linux ว่ามันไม่รู้อะไร: ไฟล์เหล่านี้จะไม่ถูกใช้อีกต่อไป สิ่งนี้สามารถทำได้โดยแอปพลิเคชันการเขียนโดยใช้สิ่งที่ต้องการposix_fadvise()หรือใช้เครื่องมือบรรทัด cmd เช่นvmtouch (ซึ่งสามารถใช้เพื่อค้นหาสิ่งต่าง ๆ รวมถึงไฟล์แคช)

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

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


แอพทั้งหมดบนเซิร์ฟเวอร์ของฉันกำลังทำงานในเวลาไม่บ่าย บางที nohup.out กำลังถูกแคชและกินหน่วยความจำใช่ไหม
ivcode

@ รหัส: อาจเป็นเหตุผลตรวจสอบว่า nohup.out ใหญ่แค่ไหน อาจใช้ vmtouch เพื่อหาว่าแคชนั้นมีจำนวนเท่าใด
PlasmaHH

ฉันมีงาน cron cat /dev/null > path/nohup.outในทุก ๆ 15 นาทีเนื่องจาก nohup.out เติบโตอย่างรวดเร็ว บางทีลินุกซ์กำลังแคช nohup.out แม้ว่าฉันจะล้างมันก็ตาม
ivcode

5
@ivcode ถ้าคุณไม่จำเป็นต้องส่งออกจากที่คุณควรอีกครั้งตรงไปยังnohup /dev/nullดูเหมือนว่าคุณมีผู้ดูแลระบบที่ไม่มีประสบการณ์ทำงานในระบบของคุณในบางจุด ดูstackoverflow.com/questions/10408816/วิธีการnohupส่งออกข้อมูลโดยตรงไปยัง/dev/null
David Wilkins

แม้ว่า nohup.out จะถูกล้างในช่วงเวลา 15 นาทีหากกระบวนการแอพถูกฆ่าด้วยเหตุผลบางอย่าง nohup.out จะถูกสำรองโดยอัตโนมัติจากสคริปต์อื่น ฉันลอง vmtouch มันเป็นเครื่องมือที่ดีมากอย่างแน่นอน
ivcode

16

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

หน้าขนาดใหญ่ใน Linux มักจำเป็นต้องจัดเรียง RAM เพื่อหา RAM ทางกายภาพที่ต่อเนื่องกัน 2MB เพื่อใส่ลงในหน้า การเพิ่มแคชไฟล์ทั้งหมดทำให้กระบวนการนี้ง่ายมาก

แต่ฉันเห็นด้วยกับคำตอบอื่น ๆ ส่วนใหญ่ว่าไม่มีเหตุผลที่ดีที่จะทิ้งแคชไฟล์ทุกคืน


1
ฉัน upvoted สำหรับการชี้อคติลำดับที่สองคือการตอบสนองต่อการวางแคช
Noah Spurrier

1
นอกจากนี้ในแอปพลิเคชัน HPC บนโหนดหน่วยความจำสูง (1Tb) การอ่านไฟล์ขนาดใหญ่สองสามครั้งจะส่งผลให้มีหน่วยความจำแคชจำนวนมาก เนื่องจากแอปพลิเคชัน HPC จำนวนมากทำงาน malloc ของหลายร้อย GB ระบบสามารถหยุดทำงานได้นานหลายชั่วโมงเมื่อกระบวนการย้ายข้อมูลย้ายหน่วยความจำที่กระจัดกระจายชิ้นเล็ก ๆ ไร้ผลข้ามโหน NUMA เมื่อระบบมาถึง "ชายแดน" ของหน่วยความจำแคช ที่แย่ไปกว่านั้นคือไม่มีสิ่งใดที่คุณสามารถทำได้ในยูสเซอร์แลนด์เพื่อให้แคชฟรียกเว้นหลอกระบบให้จัดสรรบล็อกขนาดเล็ก 2MB ทั้งหมดที่มันสามารถทำได้ในเวลาเดียวกันจากนั้นจึงปล่อย
user1649948

+1 คำสั่งในการสร้างหน้าขนาดใหญ่ ( sysctl -w vm.nr_hugepages=...) ปฏิเสธที่จะทำงานแม้กระทั่งถ้าฉันวางแคชครั้งแรก (Arch linux)
Aleksandr Dubinsky

8

เป็นไปได้ว่าสิ่งนี้ได้ถูกจัดทำขึ้นเพื่อเป็นแนวทางในการทำให้ระบบมีเสถียรภาพเมื่อไม่มีใครมีทักษะหรือประสบการณ์ในการค้นหาปัญหาอย่างแท้จริง

การปลดปล่อยทรัพยากร

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

การกินหน่วยความจำคืออะไร

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

บรรทัดล่าง

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


4

Linux / m68k มีข้อผิดพลาดเคอร์เนลซึ่งทำให้ kswapd บ้าคลั่งและกิน CPU 100% (50% ถ้ามีงานที่ผูกกับ CPU อื่น ๆ เช่น Debian binary autobuilder แพคเกจเดเบียน - บิวด์บิวด์ - ทำงานแล้ว) ซึ่งสามารถ ของเวลาไม่เสมอ) ถูกลดขนาดโดยเรียกใช้คำสั่งนี้ทุก ๆ สองสามชั่วโมง

ที่ถูกกล่าวว่า ... เซิร์ฟเวอร์ของคุณน่าจะไม่ใช่ระบบ m68k (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ระบบ ;-)

ในกรณีนี้บุคคลที่ใส่สายอาจทำตามคำแนะนำที่น่าสงสัยหรือได้รับคำแนะนำที่ล้าสมัยหรือมีความคิดเกี่ยวกับวิธีที่ RAM ควรใช้ผิด (การคิดสมัยใหม่บอกว่า "RAM ว่างเปล่าเสีย RAM" และแนะนำการแคช) หรือ "ค้นพบ" ว่า "แก้ไข" [sic!] ปัญหาอื่นที่อื่น (และขี้เกียจเกินไปที่จะค้นหาวิธีแก้ไขที่เหมาะสม)


"ข้อผิดพลาดเคอร์เนลซึ่งทำให้ kswapd บ้าไปแล้ว" - ข้อผิดพลาดตัวนี้คืออะไร?
Ben

@ Ben ดูหัวข้อนี้ (ข้อความนี้และคู่ของ followups ซึ่งหนึ่งในนั้นรวมถึงการคาดเดาที่มันอาจจะมาจาก)
mirabilos

1
ฉันกำลังประสบปัญหาที่คล้ายกัน (แม้ว่ามัน x86_64) และทางออกเดียวในขณะนี้คือการวางแคชserverfault.com/questions/740790/...
เฟอร์นันโด

2
@ Fernando ฉันมี "วางแคช" cronjob บนกล่อง
m68k

3

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

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

ดังนั้นแม้ว่าการสันนิษฐานของฉันจะเป็นจริงการทำความสะอาดแคชไม่ใช่สิ่งที่สมเหตุสมผล แต่เป็นการแก้ปัญหาของผู้ที่ไม่สามารถแก้ไขปัญหาหลักได้


3

ฉันคิดได้ว่ามีเหตุผลที่น่าเชื่อถือเพียงข้อเดียวที่จะทำสิ่งนี้ในงาน cron ทุกคืน

ในระบบขนาดใหญ่อาจเป็นประโยชน์ในการปล่อยแคชเป็นระยะเพื่อให้คุณสามารถลบการกระจายตัวของหน่วยความจำ

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

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


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

ฉันไม่รู้ว่าซอฟต์แวร์คุณธรรมใดที่ทำสิ่งนี้จริงหรือไม่


1
คุณมีแหล่งที่มาสำหรับสิ่งนี้หรือไม่? ดูเหมือนว่าสิ่งที่ควรได้รับการแก้ไขในเคอร์เนลหากเป็นปัญหาดังกล่าว
g

3
ฉันมีประสบการณ์ส่วนตัวกับการหยุดด้วย hugepages โปร่งใส RHEL6, Dell R810, 4CPUs, 64GB RAM ปิดใช้งาน hugepages แบบโปร่งใส (มีไฟล์ / proc ให้ทำ) แก้ไขการหยุดทันที ฉันไม่ได้ลองใช้เทคนิคการปล่อยแคชในเวลานั้น แทนฉันกำหนดค่าแอป Java ของเราใหม่เพื่อใช้ hugepages ที่ไม่โปร่งใสและปล่อย hugepages แบบโปร่งใสออก IIRC เราตรวจสอบสถานการณ์มากพอที่จะตระหนักว่าเราไม่ใช่คนเดียวที่ได้รับผลกระทบและ Red Hat รู้เกี่ยวกับปัญหานี้
Dan Pritts

สวัสดีแดนฉันยังคงพฤติกรรมเดียวกันบนเซิร์ฟเวอร์ของฉัน ฉันทำงานกับข้อมูลจำนวนมากและมีประสิทธิภาพลดลงอย่างมากหลังจากการคำนวณของโปรแกรมหลาม 10+ รายการ (x2-3 ของการคำนวณครั้งแรก) ถ้าฉันดูขนาดแคชหน่วยความจำมีขนาดใหญ่มาก 100 + GB และถ้าฉันล้างแคชหน่วยความจำนี้และเรียกใช้โปรแกรมของฉันอีกครั้งฉันจะกลับไปใช้เวลาคำนวณครั้งแรก คุณมีเอกสารหรือข้อมูลใด ๆ ที่จะแบ่งปันเกี่ยวกับปรากฏการณ์นี้หรือไม่? ขอขอบคุณ.
Axel Borja

1
access.redhat.com/solutions/46111อธิบาย คุณสามารถปิดการใช้งาน hugepages แบบโปร่งใสเพื่อดูว่าเป็นปัญหาในกรณีของคุณหรือไม่
Dan Pritts

2

เพียงเพื่อเพิ่มสองเซ็นต์ของฉัน: ระบบรู้ดีว่าหน้าหน่วยความจำเหล่านี้แคชและจะลดลงเท่าที่จำเป็นเมื่อแอปพลิเคชันขอหน่วยความจำ

การตั้งค่าที่เกี่ยวข้องคือ/proc/sys/vm/swappinessซึ่งบอกเคอร์เนลในระหว่างการจัดสรรหน่วยความจำใหม่เพื่อต้องการปล่อยแคชหน่วยความจำหรือสลับหน้าหน่วยความจำที่จัดสรร "ไม่ได้ใช้งาน"


1

คำถามคือจากปี 2014 แต่เนื่องจากปัญหามาจนถึงทุกวันนี้ในแบ็กเอนด์ที่ซ่อนอยู่เซนโตร 6.8 6.8 มันอาจจะเป็นประโยชน์สำหรับใครบางคน

https://github.com/zfsonlinux/zfs/issues/1548 อธิบายปัญหาของ zfs ที่นั่นพื้นที่ดิสก์ไม่ได้ถูกปล่อยให้ว่างสำหรับไฟล์ที่ถูกลบเพราะถ้าใช้ nfs ที่ด้านบนของ zfs inodes ของไฟล์จะไม่หลุดจากแคช inode ของเคอร์เนล

อ้างจากเธรดข้อบกพร่อง, behlendorf, 6 ม.ค. 2558 เขียนว่า:

การเก็งกำไรในปัจจุบันคือด้วยเหตุผลบางอย่างเซิร์ฟเวอร์ NFS กำลังรักษาเวอร์ชันของแคชของการจัดการไฟล์ จนกว่าเซิร์ฟเวอร์ NFS จะลดลงไฟล์นี้จะจัดการกับ ZFS ไม่สามารถยกเลิกการเชื่อมโยงไฟล์นี้ การทดสอบแสงบางอย่างแสดงให้เห็นว่าการวางแคชบนเซิร์ฟเวอร์จะทำให้การอ้างอิงนี้ลดลง (เช่นหมายเลขอ้างอิงไฟล์ NFS) ที่จุดว่างถูกปล่อยอย่างถูกต้อง ความดันหน่วยความจำยังสามารถทำให้มันลดลง

เช่น echo 3> / proc / sys / vm / drop_caches ทุกคืนเป็นการแก้ไขที่ง่ายที่สุดสำหรับข้อผิดพลาดนั้นถ้าคุณไม่ต้องการหยุดทำงานเพื่อปรับโครงสร้าง zfs ของคุณ

ดังนั้นอาจไม่ใช่ลัทธิผู้ดูแลระบบการขนส่งสินค้า แต่การดีบั๊กที่ดีก็เป็นเหตุผล


0

สิ่งนี้อาจสมเหตุสมผลในระบบ NUMA (การเข้าถึงหน่วยความจำไม่สม่ำเสมอ) ซึ่งโดยทั่วไปแล้ว CPU (ซ็อกเก็ต) แต่ละตัวสามารถเข้าถึงหน่วยความจำทั้งหมดได้อย่างโปร่งใส แต่หน่วยความจำของตัวเองสามารถเข้าถึงได้เร็วกว่าหน่วยความจำของซ็อกเก็ตอื่น ๆ

แอ็พพลิเคชันแบบขนานจำนวนมากมีแนวโน้มที่จะทำไฟล์ I / O จากกระบวนการเดียวดังนั้นออกจากหน่วยความจำขนาดใหญ่บนโหนด NUMA เดียวที่จัดสรรให้กับแคชดิสก์ในขณะที่โหนด NUMA อื่น ๆ หน่วยความจำอาจว่างมากที่สุด ในสถานการณ์เหล่านี้เนื่องจากกระบวนการเรียกคืนแคชในเคอร์เนล Linux เท่าที่ฉันรู้ยังไม่ทราบ NUMA กระบวนการที่ทำงานบนโหนด NUMA ซึ่งมีหน่วยความจำที่จัดสรรให้แคชถูกบังคับให้จัดสรรหน่วยความจำในโหนด NUMA อื่น ๆ ตราบใดที่มี RAM ว่างบนโหนดอื่น ๆ ดังนั้นจึงฆ่าการแสดง

อย่างไรก็ตามในระบบ HPC มันจะฉลาดในการล้างแคชก่อนที่จะเริ่มงานผู้ใช้ใหม่ไม่ใช่ในเวลาที่กำหนดด้วย cron

สำหรับการใช้งานที่ไม่ขนานปัญหานี้ไม่น่าจะเกิดขึ้น


0

เมื่อแคชหน้าของคุณมีขนาดใหญ่ (มีขนาดใหญ่กว่าการใช้ swap ปัจจุบันของคุณ) และการสลับในและสลับเกิดขึ้นในรอบต่อไปนี้คือเมื่อคุณจำเป็นต้องวางแคช ฉันเคยเห็นกรณีที่การใช้หน่วยความจำเพิ่มขึ้นในหนึ่งในเซิร์ฟเวอร์ฐานข้อมูล MariaDB ของฉันที่ใช้ Ubuntu 16.04LTS และ Linux เลือกที่จะเพิ่มการใช้ swap แทนการลบแคชเพจที่ไม่ได้ใช้ hugepages แบบโปร่งใสถูกปิดใช้งานในระบบของฉันเพราะ TokuDB ต้องการให้ปิดการใช้งาน อย่างไรก็ตามบางทีมันอาจไม่ใช่ข้อผิดพลาด แต่ linux ยังคงทำพฤติกรรมนี้ค่อนข้างงงสำหรับฉัน หลายแหล่งกล่าวว่า Linux จะลบหน้าแคชเมื่อแอปพลิเคชันร้องขอ:

แต่ความจริงไม่ง่ายอย่างนั้น วิธีแก้ปัญหาคือ:

  1. ดำเนินการแคชแคชเป็นระยะ
  2. เรียกใช้งานแคชที่ปล่อยทิ้งเมื่อจำเป็น (มอนิเตอร์โดยใช้ vmstat 1 เพื่อสลับกิจกรรม)
  3. แนะนำให้ linux ลบไฟล์บางไฟล์ออกจากแคช (เช่นไฟล์บันทึก apache) โดยใช้ยูทิลิตี้เช่น dd หรือ python-fadvise ดูhttps://unix.stackexchange.com/questions/36907/drop-a-specific-file-from-the-linux-filesystem-cache

ตัวอย่างการวิ่งวว:

dd if=/var/log/apache2/access_log.1 iflag=nocache count=0

ตัวอย่าง python-fadvise:

pyadvise -d /var/log/apache2/access_log.1


-5

ฉันมีเครื่องเดสก์ท็อปที่มี RAM ขนาด 16GB ที่รันบนเคอร์เนล PAE หลังจากหนึ่งหรือสองชั่วโมงประสิทธิภาพของดิสก์จะลดลงอย่างรวดเร็วจนกระทั่งฉันวางแคชดังนั้นฉันจึงใส่มันลงใน cron ฉันไม่รู้ว่านี่เป็นปัญหาของเคอร์เนล PAE หรือการใช้แคชนั้นช้ามากหากมีหน่วยความจำมากมาย


9
นี่คือตัวอย่างสำคัญของการบริหารระบบ "ลัทธิการขนส่งสินค้า": แทนที่จะค้นหาและแก้ปัญหาคุณเพียงแค่ทำการพรางมัน
Michael Hampton

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

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