ในเซิร์ฟเวอร์ของเราเรามีนิสัยในการปล่อยแคชเวลาเที่ยงคืน
sync; echo 3 > /proc/sys/vm/drop_caches
เมื่อฉันเรียกใช้รหัสดูเหมือนว่าจะเพิ่ม RAM จำนวนมาก แต่ฉันต้องทำอย่างนั้นจริงๆ แรมไม่เสียเปล่าหรือเปล่า
ในเซิร์ฟเวอร์ของเราเรามีนิสัยในการปล่อยแคชเวลาเที่ยงคืน
sync; echo 3 > /proc/sys/vm/drop_caches
เมื่อฉันเรียกใช้รหัสดูเหมือนว่าจะเพิ่ม RAM จำนวนมาก แต่ฉันต้องทำอย่างนั้นจริงๆ แรมไม่เสียเปล่าหรือเปล่า
คำตอบ:
คุณถูกต้อง 100% มันเป็นไม่ได้เป็นวิธีที่ดีเพื่อเพิ่มแรม นี่เป็นตัวอย่างของการบริหารระบบลัทธิขนส่งสินค้า
ใช่การล้างแคชจะทำให้ RAM ว่าง แต่จะทำให้เคอร์เนลค้นหาไฟล์บนดิสก์มากกว่าในแคชซึ่งอาจทำให้เกิดปัญหาประสิทธิภาพการทำงาน
โดยปกติเคอร์เนลจะล้างแคชเมื่อ RAM ที่มีอยู่หมดลง มันมักจะเขียนเนื้อหาสกปรกไปยังดิสก์โดยใช้ pdflush
สาเหตุที่ทำให้แคชแบบนี้มีไว้สำหรับการเปรียบเทียบประสิทธิภาพของดิสก์และเป็นเหตุผลเดียวที่มีอยู่
เมื่อรันเกณฑ์มาตรฐาน I / O คุณต้องการให้แน่ใจว่าการตั้งค่าต่างๆที่คุณพยายามทำคือการทำดิสก์ I / O ดังนั้น Linux จึงอนุญาตให้คุณวางแคชแทนที่จะรีบูตแบบเต็ม
อ้างจากเอกสาร :
ไฟล์นี้ไม่ได้หมายถึงการควบคุมการเจริญเติบโตของแคชเคอร์เนลต่างๆ (inodes, dentries, pagecache, ฯลฯ ... ) วัตถุเหล่านี้จะถูกเรียกคืนโดยอัตโนมัติโดยเคอร์เนลเมื่อจำเป็นต้องใช้หน่วยความจำที่อื่นในระบบ
การใช้ไฟล์นี้อาจทำให้เกิดปัญหาประสิทธิภาพการทำงาน เนื่องจากทิ้งวัตถุที่แคชไว้จึงอาจมีค่าใช้จ่าย I / O และ CPU จำนวนมากในการสร้างวัตถุที่ถูกทิ้งใหม่โดยเฉพาะอย่างยิ่งหากใช้งานหนัก ด้วยเหตุนี้จึงไม่แนะนำให้ใช้นอกสภาพแวดล้อมการทดสอบหรือการดีบัก
แนวคิดพื้นฐานที่นี่อาจไม่เลว (แค่ไร้เดียงสาและเข้าใจผิด): อาจมีไฟล์ที่ถูกแคชซึ่งมีโอกาสน้อยมากที่จะเข้าถึงได้ในอนาคตอันใกล้เช่นล็อกไฟล์ ram "eat up" เหล่านี้จะต้องได้รับการปลดปล่อยในภายหลังเมื่อจำเป็นโดยระบบปฏิบัติการไม่ทางใดก็ทางหนึ่ง
รูปแบบการเข้าถึงไฟล์รูปแบบการจัดสรรหน่วยความจำและสิ่งอื่น ๆ ที่คาดเดาไม่ได้อาจเกิดขึ้นได้เมื่อคุณไม่ปล่อยแคชเหล่านี้พวกเขาจะถูกบังคับให้นำกลับมาใช้ใหม่ในภายหลังซึ่งใช้เวลานานกว่า การจัดสรรหน่วยความจำจากพูลของหน่วยความจำที่ไม่ได้ใช้ ในกรณีที่แย่ที่สุดการตั้งค่า swappiness ของ linux จะทำให้โปรแกรมหน่วยความจำของโปรแกรมถูกสลับเนื่องจาก linux คิดว่าไฟล์เหล่านั้นอาจมีแนวโน้มที่จะถูกใช้ในอนาคตอันใกล้กว่าหน่วยความจำของโปรแกรม
ในสภาพแวดล้อมของฉันลินุกซ์เดาผิดบ่อยครั้งและเมื่อเริ่มต้นตลาดหุ้นยุโรปส่วนใหญ่ (ประมาณเวลาท้องถิ่น 0900) จะเริ่มทำสิ่งต่าง ๆ ที่พวกเขาทำเพียงครั้งเดียวต่อวันจำเป็นต้องสลับในหน่วยความจำที่เคยสลับกันเพราะการเขียน logfiles การบีบอัดการคัดลอกเป็นต้นกำลังเติมแคชจนถึงจุดที่สิ่งต่าง ๆ จะต้องถูกสับเปลี่ยน
แต่การวางแคชแก้ปัญหานี้หรือไม่ ไม่แน่นอน สิ่งที่จะเป็นวิธีแก้ปัญหาที่นี่คือการบอก linux ว่ามันไม่รู้อะไร: ไฟล์เหล่านี้จะไม่ถูกใช้อีกต่อไป สิ่งนี้สามารถทำได้โดยแอปพลิเคชันการเขียนโดยใช้สิ่งที่ต้องการposix_fadvise()
หรือใช้เครื่องมือบรรทัด cmd เช่นvmtouch
(ซึ่งสามารถใช้เพื่อค้นหาสิ่งต่าง ๆ รวมถึงไฟล์แคช)
ด้วยวิธีนี้คุณสามารถลบข้อมูลที่ไม่ต้องการออกจากแคชได้อีกต่อไปและเก็บข้อมูลที่ควรเก็บไว้เพราะเมื่อคุณวางแคชทั้งหมดสิ่งต่าง ๆ มากมายจะต้องถูกอ่านซ้ำจากดิสก์ และในช่วงเวลาที่เลวร้ายที่สุดที่เป็นไปได้: เมื่อจำเป็น ทำให้เกิดความล่าช้าในแอปพลิเคชันของคุณซึ่งสังเกตได้และมักจะยอมรับไม่ได้
สิ่งที่คุณควรมีคือระบบที่ตรวจสอบรูปแบบการใช้หน่วยความจำของคุณ (เช่นหากมีการแลกเปลี่ยน) แล้ววิเคราะห์ตามนั้นและดำเนินการตามนั้น วิธีแก้ปัญหาอาจจะเป็นการขับไล่ไฟล์ขนาดใหญ่ในตอนท้ายของวันโดยใช้ vtouch มันอาจจะเป็นการเพิ่ม ram มากขึ้นเพราะการใช้งานสูงสุดประจำวันของเซิร์ฟเวอร์เป็นเพียงแค่นั้น
cat /dev/null > path/nohup.out
ในทุก ๆ 15 นาทีเนื่องจาก nohup.out เติบโตอย่างรวดเร็ว บางทีลินุกซ์กำลังแคช nohup.out แม้ว่าฉันจะล้างมันก็ตาม
nohup
/dev/null
ดูเหมือนว่าคุณมีผู้ดูแลระบบที่ไม่มีประสบการณ์ทำงานในระบบของคุณในบางจุด ดูstackoverflow.com/questions/10408816/วิธีการnohup
ส่งออกข้อมูลโดยตรงไปยัง/dev/null
ฉันได้เห็นแคชดร็อปมีประโยชน์เมื่อเริ่มต้นเครื่องเสมือนจำนวนมาก หรือสิ่งอื่นใดที่ใช้หน้าใหญ่เช่นเซิร์ฟเวอร์ฐานข้อมูลบางตัว
หน้าขนาดใหญ่ใน Linux มักจำเป็นต้องจัดเรียง RAM เพื่อหา RAM ทางกายภาพที่ต่อเนื่องกัน 2MB เพื่อใส่ลงในหน้า การเพิ่มแคชไฟล์ทั้งหมดทำให้กระบวนการนี้ง่ายมาก
แต่ฉันเห็นด้วยกับคำตอบอื่น ๆ ส่วนใหญ่ว่าไม่มีเหตุผลที่ดีที่จะทิ้งแคชไฟล์ทุกคืน
sysctl -w vm.nr_hugepages=...
) ปฏิเสธที่จะทำงานแม้กระทั่งถ้าฉันวางแคชครั้งแรก (Arch linux)
เป็นไปได้ว่าสิ่งนี้ได้ถูกจัดทำขึ้นเพื่อเป็นแนวทางในการทำให้ระบบมีเสถียรภาพเมื่อไม่มีใครมีทักษะหรือประสบการณ์ในการค้นหาปัญหาอย่างแท้จริง
การปล่อยแคชจะทำให้ทรัพยากรบางอย่างว่างเปล่า แต่สิ่งนี้มีผลข้างเคียงที่ทำให้ระบบทำงานหนักขึ้นเพื่อทำสิ่งที่มันพยายามทำอยู่ หากระบบกำลังทำการสลับ (พยายามอ่านและเขียนจากพาร์ทิชันดิสก์สว็อปเร็วกว่าความสามารถจริง ๆ ) จากนั้นการปล่อยแคชเป็นระยะ ๆ สามารถบรรเทาอาการได้ แต่ไม่ทำอะไรเลยเพื่อรักษาสาเหตุสาเหตุ
คุณควรพิจารณาว่าอะไรเป็นสาเหตุของการใช้หน่วยความจำจำนวนมากที่ทำให้แคชที่ทิ้งดูเหมือนจะทำงานได้ ซึ่งอาจเกิดจากจำนวนของการกำหนดค่าที่ไม่ดีหรือเพียงแค่กระบวนการเซิร์ฟเวอร์ที่ใช้ผิดอย่างธรรมดา ตัวอย่างเช่นในเซิร์ฟเวอร์เดียวฉันเห็นการใช้หน่วยความจำสูงสุดเมื่อเว็บไซต์ Magento เข้าถึงผู้เยี่ยมชมจำนวนหนึ่งภายในช่วงเวลา 15 นาที สิ่งนี้เกิดจาก Apache ถูกกำหนดค่าให้อนุญาตให้กระบวนการมากเกินไปที่จะทำงานพร้อมกัน มีกระบวนการมากเกินไปโดยใช้หน่วยความจำจำนวนมาก (บางครั้ง Magento เป็นสัตว์ร้าย) = การแลกเปลี่ยน
อย่าเพิ่งคิดว่ามันเป็นสิ่งที่จำเป็น เป็นเชิงรุกในการหาสาเหตุว่ามีทำไมมีความกล้าที่จะปิดการใช้งานถ้าคนอื่น ๆ แนะนำว่ามันผิดและสังเกตระบบ - เรียนรู้ว่าปัญหาที่แท้จริงคืออะไรและแก้ไขได้
Linux / m68k มีข้อผิดพลาดเคอร์เนลซึ่งทำให้ kswapd บ้าคลั่งและกิน CPU 100% (50% ถ้ามีงานที่ผูกกับ CPU อื่น ๆ เช่น Debian binary autobuilder แพคเกจเดเบียน - บิวด์บิวด์ - ทำงานแล้ว) ซึ่งสามารถ ของเวลาไม่เสมอ) ถูกลดขนาดโดยเรียกใช้คำสั่งนี้ทุก ๆ สองสามชั่วโมง
ที่ถูกกล่าวว่า ... เซิร์ฟเวอร์ของคุณน่าจะไม่ใช่ระบบ m68k (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ระบบ ;-)
ในกรณีนี้บุคคลที่ใส่สายอาจทำตามคำแนะนำที่น่าสงสัยหรือได้รับคำแนะนำที่ล้าสมัยหรือมีความคิดเกี่ยวกับวิธีที่ RAM ควรใช้ผิด (การคิดสมัยใหม่บอกว่า "RAM ว่างเปล่าเสีย RAM" และแนะนำการแคช) หรือ "ค้นพบ" ว่า "แก้ไข" [sic!] ปัญหาอื่นที่อื่น (และขี้เกียจเกินไปที่จะค้นหาวิธีแก้ไขที่เหมาะสม)
เหตุผลหนึ่งอาจเป็นเพราะไซต์กำลังทำการตรวจสอบบางอย่างซึ่งตรวจสอบจำนวนหน่วยความจำว่างและส่งคำเตือนไปยังผู้ดูแลระบบเมื่อหน่วยความจำว่างลดลงต่ำกว่าเปอร์เซ็นต์ที่แน่นอน หากเครื่องมือการตรวจสอบนั้นโง่พอที่จะไม่รวมแคชในการคำนวณ ram ฟรีอาจส่งคำเตือนที่ผิด การล้างแคชเป็นประจำสามารถยับยั้งคำเตือนเหล่านี้ได้ในขณะที่ยังอนุญาตให้เครื่องมือสังเกตได้เมื่อ ram "จริง" เหลือน้อย
แน่นอนในสถานการณ์เช่นนี้ทางออกที่แท้จริงคือการแก้ไขเครื่องมือตรวจสอบเพื่อรวมแคชในการคำนวณ ram ฟรี การทำความสะอาดแคชเป็นเพียงวิธีแก้ปัญหาและสิ่งที่ไม่ดีเช่นกันเนื่องจากแคชจะเติมอย่างรวดเร็วเมื่อกระบวนการเข้าถึงดิสก์
ดังนั้นแม้ว่าการสันนิษฐานของฉันจะเป็นจริงการทำความสะอาดแคชไม่ใช่สิ่งที่สมเหตุสมผล แต่เป็นการแก้ปัญหาของผู้ที่ไม่สามารถแก้ไขปัญหาหลักได้
ฉันคิดได้ว่ามีเหตุผลที่น่าเชื่อถือเพียงข้อเดียวที่จะทำสิ่งนี้ในงาน cron ทุกคืน
ในระบบขนาดใหญ่อาจเป็นประโยชน์ในการปล่อยแคชเป็นระยะเพื่อให้คุณสามารถลบการกระจายตัวของหน่วยความจำ
การสนับสนุน hugepage แบบโปร่งใสของเคอร์เนลจะทำการกวาดหน่วยความจำเป็นระยะเพื่อรวมหน้ากระดาษขนาดเล็กเข้าไว้ใน hugepages ภายใต้สภาวะที่เลวร้ายนี้อาจส่งผลให้ระบบหยุดชั่วคราวหนึ่งหรือสองนาที (ประสบการณ์ของฉันกับสิ่งนี้คือ RHEL6 หวังว่ามันจะดีขึ้น) การปล่อยแคชอาจปล่อยให้ตัวกวาด hugepage มีที่ว่างสำหรับทำงาน
คุณอาจยืนยันว่านี่เป็นเหตุผลที่ดีที่จะปิดการใช้งาน hugepages แบบโปร่งใส OTOH คุณอาจเชื่อว่าการปรับปรุงประสิทธิภาพโดยรวมจาก hugepages แบบโปร่งใสนั้นคุ้มค่าที่จะได้รับและคุ้มค่าที่จะจ่ายราคาให้กับการสูญเสียแคชของคุณวันละครั้ง
ฉันคิดถึงเหตุผลอื่นที่คุณอยากทำแม้ว่าจะไม่ใช่งาน cron ก่อนที่ระบบเวอร์ชวลไลเซชันจะย้าย VM ไปยังฮาร์ดแวร์ใหม่จะเป็นช่วงเวลาที่ดีสำหรับเรื่องนี้ หักเนื้อหาหน่วยความจำเพื่อคัดลอกไปยังโฮสต์ใหม่ ในที่สุดคุณจะต้องอ่านจากที่จัดเก็บแทนแน่นอน แต่ฉันอาจใช้ข้อเสียนั้น
ฉันไม่รู้ว่าซอฟต์แวร์คุณธรรมใดที่ทำสิ่งนี้จริงหรือไม่
เพียงเพื่อเพิ่มสองเซ็นต์ของฉัน: ระบบรู้ดีว่าหน้าหน่วยความจำเหล่านี้แคชและจะลดลงเท่าที่จำเป็นเมื่อแอปพลิเคชันขอหน่วยความจำ
การตั้งค่าที่เกี่ยวข้องคือ/proc/sys/vm/swappiness
ซึ่งบอกเคอร์เนลในระหว่างการจัดสรรหน่วยความจำใหม่เพื่อต้องการปล่อยแคชหน่วยความจำหรือสลับหน้าหน่วยความจำที่จัดสรร "ไม่ได้ใช้งาน"
คำถามคือจากปี 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 ของคุณ
ดังนั้นอาจไม่ใช่ลัทธิผู้ดูแลระบบการขนส่งสินค้า แต่การดีบั๊กที่ดีก็เป็นเหตุผล
สิ่งนี้อาจสมเหตุสมผลในระบบ NUMA (การเข้าถึงหน่วยความจำไม่สม่ำเสมอ) ซึ่งโดยทั่วไปแล้ว CPU (ซ็อกเก็ต) แต่ละตัวสามารถเข้าถึงหน่วยความจำทั้งหมดได้อย่างโปร่งใส แต่หน่วยความจำของตัวเองสามารถเข้าถึงได้เร็วกว่าหน่วยความจำของซ็อกเก็ตอื่น ๆ
แอ็พพลิเคชันแบบขนานจำนวนมากมีแนวโน้มที่จะทำไฟล์ I / O จากกระบวนการเดียวดังนั้นออกจากหน่วยความจำขนาดใหญ่บนโหนด NUMA เดียวที่จัดสรรให้กับแคชดิสก์ในขณะที่โหนด NUMA อื่น ๆ หน่วยความจำอาจว่างมากที่สุด ในสถานการณ์เหล่านี้เนื่องจากกระบวนการเรียกคืนแคชในเคอร์เนล Linux เท่าที่ฉันรู้ยังไม่ทราบ NUMA กระบวนการที่ทำงานบนโหนด NUMA ซึ่งมีหน่วยความจำที่จัดสรรให้แคชถูกบังคับให้จัดสรรหน่วยความจำในโหนด NUMA อื่น ๆ ตราบใดที่มี RAM ว่างบนโหนดอื่น ๆ ดังนั้นจึงฆ่าการแสดง
อย่างไรก็ตามในระบบ HPC มันจะฉลาดในการล้างแคชก่อนที่จะเริ่มงานผู้ใช้ใหม่ไม่ใช่ในเวลาที่กำหนดด้วย cron
สำหรับการใช้งานที่ไม่ขนานปัญหานี้ไม่น่าจะเกิดขึ้น
เมื่อแคชหน้าของคุณมีขนาดใหญ่ (มีขนาดใหญ่กว่าการใช้ swap ปัจจุบันของคุณ) และการสลับในและสลับเกิดขึ้นในรอบต่อไปนี้คือเมื่อคุณจำเป็นต้องวางแคช ฉันเคยเห็นกรณีที่การใช้หน่วยความจำเพิ่มขึ้นในหนึ่งในเซิร์ฟเวอร์ฐานข้อมูล MariaDB ของฉันที่ใช้ Ubuntu 16.04LTS และ Linux เลือกที่จะเพิ่มการใช้ swap แทนการลบแคชเพจที่ไม่ได้ใช้ hugepages แบบโปร่งใสถูกปิดใช้งานในระบบของฉันเพราะ TokuDB ต้องการให้ปิดการใช้งาน อย่างไรก็ตามบางทีมันอาจไม่ใช่ข้อผิดพลาด แต่ linux ยังคงทำพฤติกรรมนี้ค่อนข้างงงสำหรับฉัน หลายแหล่งกล่าวว่า Linux จะลบหน้าแคชเมื่อแอปพลิเคชันร้องขอ:
แต่ความจริงไม่ง่ายอย่างนั้น วิธีแก้ปัญหาคือ:
ตัวอย่างการวิ่งวว:
dd if=/var/log/apache2/access_log.1 iflag=nocache count=0
ตัวอย่าง python-fadvise:
pyadvise -d /var/log/apache2/access_log.1
ฉันมีเครื่องเดสก์ท็อปที่มี RAM ขนาด 16GB ที่รันบนเคอร์เนล PAE หลังจากหนึ่งหรือสองชั่วโมงประสิทธิภาพของดิสก์จะลดลงอย่างรวดเร็วจนกระทั่งฉันวางแคชดังนั้นฉันจึงใส่มันลงใน cron ฉันไม่รู้ว่านี่เป็นปัญหาของเคอร์เนล PAE หรือการใช้แคชนั้นช้ามากหากมีหน่วยความจำมากมาย