เหตุใดจึงต้องใช้ Swap เมื่อมีหน่วยความจำว่างเหลืออยู่มาก


35

ฉันมีเว็บเซิร์ฟเวอร์ที่ดี (เฉพาะ) ที่มีทรัพยากรหน่วยความจำดี:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

อย่างที่คุณเห็นเซิร์ฟเวอร์ของฉันกำลังใช้ swap เมื่อมีหน่วยความจำว่างมากมาย

นี่เป็นเรื่องปกติหรือมีบางอย่างผิดปกติกับการกำหนดค่าหรือการเข้ารหัสหรือไม่

NB
กระบวนการ MySQL ของฉันใช้งาน CPU มากกว่า 160% ด้วยเหตุผลบางประการ ฉันไม่รู้ว่าทำไม แต่ฉันไม่มีผู้ใช้พร้อมกันมากกว่า 70 คน ...


แอปพลิเคชันสามารถใช้ CPU ได้มากกว่า 100% ใน Linux หรือไม่ เอิ่ม ...
BlueRaja

5
@BlueRaja: ใช่เพราะในการใช้งาน CPU CPU จะถูกวัดเทียบกับ CPU ตัวเดียวไม่ใช่ CPU ทั้งหมดในระบบของคุณ ดังนั้นในเครื่องที่มี 8 CPU คุณจะมี CPU มากถึง 800%
Daniel Pryden

คุณใช้ MySQL เวอร์ชันใด ???
RolandoMySQLDBA

@RolandoMySQLDBA เวอร์ชั่น 5.5
1179459

คำตอบ:


61

นี่เป็นเรื่องปกติอย่างสมบูรณ์

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

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

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

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


ในกรณีนั้นคุณสามารถอธิบายได้ว่าทำไมบางครั้งพื้นที่สว็อปไม่ได้ถูกใช้เลย Mem: ยอดรวม 49554484k, ใช้ 4087592k, ฟรี 45466892k, 349244k บัฟเฟอร์ Swap: รวม 94204k, 0k ใช้, 94204k ฟรี, 1113644k แคช
อนันต์

4
@ananthan: อาจมีหลายเหตุผล มีความเป็นไปได้สูงที่สุดที่ระบบไม่เคยอยู่ภายใต้ความกดดันของหน่วยความจำเลยแม้แต่น้อยเนื่องจากการเขียนบัฟเฟอร์ดังนั้นรหัส swap ที่ฉวยโอกาสอาจไม่เคยถูกเรียกใช้ นอกจากนี้ยังอาจเป็นไปได้ว่าคนที่คิดว่าการใช้งานแลกเปลี่ยนใด ๆ ที่ไม่ดีและผิดพลาดเพื่อปรับระบบไม่ให้มีโอกาสแลกเปลี่ยน (โดยการลดswappiness )
David Schwartz

6

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

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

สำหรับกระบวนการ mysql ของคุณ: ทั้งหมดนี้ขึ้นอยู่กับประเภทของการสืบค้นที่คุณเรียกใช้ ในทฤษฎี 2 แบบสอบถามที่ซับซ้อนมากอาจพอเพียงที่จะรับภาระดังกล่าวไม่ว่าผู้ใช้จะมีจำนวนเท่าใดก็ตาม คุณสามารถเปิดใช้งานบันทึกคิวรีช้าเพื่อให้เข้าใจมากขึ้นว่าคิวรีใดใช้โหลดมาก


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

ฉันเพียงกล่าวถึงสถานการณ์หนึ่งที่คุณสามารถใช้การแลกเปลี่ยนได้ แต่นี่อาจไม่แสดงอาการว่ามีหน่วยความจำกายภาพไม่เพียงพอ - ดังที่ David Schwartz อธิบายไว้ข้างต้น
brain99

3

นอกจากนี้คุณยังสามารถเปลี่ยนพฤติกรรมนี้ได้ด้วยsysctl -w vm.swappiness=10ซึ่งจะช่วยลดการใช้ swap ได้อย่างมากจนกว่าจะจำเป็นจริงๆ

สำหรับ MySQL อย่างน้อยคุณได้ทำการทดสอบการกำหนดค่าพื้นฐานโดยใช้สคริปต์tuning-primer.shหรือไม่?


1
สิ่งนี้จะเพิ่มแนวโน้มที่แคช / บัฟเฟอร์จะถูกเรียกคืน โชคไม่ดีที่มันไม่ชัดเจนจากคำถามต้นฉบับว่าตัวเลขของ 29.53% นั้นรวมถึงบัฟเฟอร์ / แคชหรือไม่ถ้าหากไม่ทำเช่นนั้นการเปลี่ยนแปลงที่คุณทำกับน้ำตาลจะส่งผลเสียต่อประสิทธิภาพการทำงาน หาก dbms นี้ใช้งาน Innodb อย่างกว้างขวางแสดงว่าอาจมีการกำหนดค่าที่ไม่ดี (แม้ว่ากล่อง 8 core 16gb เดียวสำหรับใช้ในเว็บเซิร์ฟเวอร์เป็นตัวเลือก BAD deisgn เพื่อเริ่มต้น)
symcbean

ทำไมคุณถึงบอกว่าเป็นตัวเลือกที่ไม่ดีสำหรับเว็บเซิร์ฟเวอร์ ฉันไม่ได้ใช้ innodb มากฉันยังคงชอบ myisam อยู่เพราะฉันอ่าน 70% และเขียนเพียง 30% ....
1179459

1

นี้อาจจะเป็นเดวิดอธิบายพฤติกรรมปกติของ Linux Kernel แต่ก็ยังสามารถเกิดขึ้นของMySQL“บ้าแลกเปลี่ยน” ปัญหา ในกรณีของคุณ (8 CPU, รวม RAM 16 GB, ใช้ 5 GB) เพื่อให้เกิดขึ้นคอมพิวเตอร์ของคุณควรเป็นระบบ NUMA ที่มี 4 โหนด (ซ็อกเก็ต) และ RAM ขนาด 4 GB ต่อโหนดและพูลบัฟเฟอร์ MySQL InnoDB 4 GB

ในระยะสั้น (คุณควรอ่านลิงค์ด้านบนเพื่อดูรายละเอียดทั้งหมด) นี่คือสิ่งที่เกิดขึ้น:

  1. เมื่อระบบของคุณเริ่มต้นกระบวนการจะถูกกระจายในโหนด NUMA ทั้งหมดโดยใช้หน่วยความจำบางส่วน
  2. เมื่อ MySQL เริ่มต้นมันจะจัดสรร 4 GB สำหรับพูลบัฟเฟอร์ InnoDB เติม RAM ของโหนด NUMA และใช้ RAM บางตัวบนโหนดอื่น
  3. จากนั้นเคอร์เนล Linux ซึ่งไม่สามารถย้าย RAM ที่จัดสรรจากโหนด NUMA หนึ่งไปยังอีกโหนดคิดว่าเป็นความคิดที่ดีที่จะสลับหน้าจากโหนดที่ติดดาว (หรือจำเป็นต้องสลับหน้าออกเพราะหน้าจำเป็นต้องสลับ)

เพื่อหลีกเลี่ยงปัญหานี้ให้เปลี่ยนการจัดสรรหน่วยความจำสำหรับ MySQL เพื่อจัดสรร RAM ในทุกคอร์ (ดูลิงค์ด้านบนสำหรับรายละเอียดเพิ่มเติม)

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