การเพิ่มขนาดสวอปใน Linux และพื้นที่สว็อปอย่างต่อเนื่องไม่ถูกเรียกคืนหรือไม่


10

ฉันมีกล่อง 8GB RAM linux ที่เซิร์ฟเวอร์ Tomcat 4 ตัวกำลังทำงานอยู่ หนึ่งในนั้นถูกตั้งค่าเป็นหน่วยความจำ 3000MB (การตั้งค่า jvm -Xms และ -Xmx) และอื่น ๆ ตั้งไว้ที่ 1500MB การสลับพาร์ติชั่นถูกตั้งค่าเป็น 8Gigs เมื่อฉันเริ่มเซิร์ฟเวอร์เหล่านี้การใช้งานไฟล์ swap จะต่ำ แต่ในช่วงเวลาหนึ่งวันและในบางช่วงเวลาที่เซิร์ฟเวอร์หนึ่ง / ทั้งหมดกำลังทำงานอยู่ในระดับสูงสุดการใช้ swap จะเริ่มเพิ่มขึ้น นี่คือเอาต์พุต sar -r ทั่วไป

kbmemfree kbmemused% memused kbbuffers kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 99.41 196440 2761852 7197688 1190912 14.20 316044

75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032

มันแสดงให้เห็นถึงการแลกเปลี่ยน 14.2% ที่ใช้ในปัจจุบัน สิ่งที่ตลกคือ% นี้ไม่เคยลดลง มันยังคงเพิ่มขึ้นและเข้าถึงได้ถึง 30-40% เรารีสตาร์ทเซิร์ฟเวอร์ทุกสัปดาห์

ฉันคาดว่า% swpusedจะเพิ่มขึ้นในช่วงที่มีกิจกรรมสูงสุดและลดลงในช่วงที่มีกิจกรรมต่ำหรืออย่างน้อยก็คงที่ ดูเหมือนว่าพื้นที่สว็อปจะไม่ถูกเรียกคืนโดย OS

เอาต์พุตของฟรี: free -m รวมที่ใช้บัฟเฟอร์ที่แชร์ฟรีแคช Mem: 7982 7937 45 0 32 2088 - / + บัฟเฟอร์ / แคช: 5816 2166 Swap: 8191 1163 7028

ดังนั้นมี RAM อย่างน้อย 2 กรัม ดังนั้นคำถามคือทำไมพื้นที่สวอปเพิ่มขึ้นอย่างต่อเนื่องและไม่ถูกเรียกคืนโดยระบบปฏิบัติการ? หรือวิธีแก้จุดบกพร่องนี้เพื่อคิดออกว่าเกิดอะไรขึ้น ..

คำตอบ:


12

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

สลับการจัดสรรให้กับสิ่งต่าง ๆ ที่ถูกอ่านกลับเข้าไปในหน่วยความจำจะได้รับการปลดปล่อยอย่างใดอย่างหนึ่ง

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

ค้นหา/proc/meminfoบรรทัดที่ชื่อว่า "SwapCached" รายการนี้นับหน้าซึ่งพบได้ทั้งใน RAM และในพาร์ทิชันสลับ ตัวอย่างเช่นการเลือก VM ขนาดเล็กโดยการสุ่ม/proc/meminfoไฟล์เสมือนหนึ่งใน VMs ของฉันแสดง:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

ระบุว่ามีการจัดสรรพื้นที่แลกเปลี่ยน 74268K แต่มูลค่าหน้า 17232K ของหน้าเหล่านั้นก็ถูกแมปไปยัง RAM ด้วยเช่นกัน (ดังนั้นอาจถูกจัดสรรคืนจากการสลับที่แจ้งให้ทราบล่วงหน้าหากพื้นที่อื่นเป็นที่ต้องการ)

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

หากคุณต้องการล้างสิ่งที่อยู่ในการแลกเปลี่ยนตราบใดที่คุณมีอิสระและ / หรือว่างมากพอ (เช่น free + cache + buffers (ลดจำนวนส่วนของ c + b ที่ไม่นับเป็น RightThisInstant)) swapoff -a && swapon -aปิดและกลับมาอีกครั้งกับ

แน่นอนคุณอาจมีหน่วยความจำรั่วเช่นกัน แต่นั่นไม่ใช่คำอธิบายเดียวสำหรับพฤติกรรมที่คุณเห็น


คำตอบที่ดีเลิศขอบคุณ ดังนั้นระบบของฉันในขณะนี้แสดง SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB ดังนั้น Swap จริงที่แท้จริง = 7197688 + 595724 = 7793412 Actul Swap ใช้ = 8388600 - 7793412 = 595188 == 581MB ฉันเดาว่าการใช้ไฟล์ swap 581MB นั้นเหมาะสมสำหรับระบบ 8GB ที่มี 4 แอพทำงานอยู่ ให้ฉันตรวจสอบเรื่องนี้ในอีกสองสามวันข้างหน้าและดูว่ารูป swapCached ยังคงเพิ่มสัดส่วนเป็น% swapUs หรือไม่
Zenil

2

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


1
เป็นสิ่งสำคัญที่จะต้องทราบว่าทำไมการแลกเปลี่ยนถึงเพิ่มขึ้นและไม่ลดลง ... ถ้าเราปล่อยให้เซิร์ฟเวอร์ของเราทำงานต่อไปอีกหลายสัปดาห์ การแลกเปลี่ยนจะขยายเกินขีด จำกัด และส่งผลให้เกิดปัญหาด้านหน่วยความจำหรือไม่? swapin / swapout ดูเหมือนว่า "สมเหตุสมผล" .. ในช่วงเวลาของกิจกรรมที่สูงสุดมีการแลกเปลี่ยน / swapout สูง (และยังเพิ่มการแลกเปลี่ยน swap%) .. ในช่วงเวลาปกติ swapin / swapout น้อยที่สุด แต่การแลกเปลี่ยน% จะไม่ลดลง
Zenil

0

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


0

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

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

Java ไม่เสี่ยงต่อการรั่วไหลของหน่วยความจำ แต่สามารถเกิดขึ้นได้กับแอพที่ซับซ้อนโดยเฉพาะ

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