มีบางอย่างที่กินหน่วยความจำทั้งหมด (ฉันสงสัยว่าหน่วยความจำรั่วในบางแอพ) วิธีการตรวจสอบอะไร


16

ฉันมีเซิร์ฟเวอร์ที่รัน liquidsoap + icecast bundle และเว็บไซต์ง่าย ๆ (httpd + mysqld) ไม่มีอะไรพิเศษ. ผู้เยี่ยมชมประมาณ 2000+ ต่อวันโดยมีประมาณ 50 คนกำลังออนไลน์พร้อมกันโดยเฉลี่ย

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

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

ป้อนคำอธิบายรูปภาพที่นี่

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


เหตุผลใดที่คุณไม่ลองเริ่มบริการบางอย่าง (apache, liquidsoap) แทนเซิร์ฟเวอร์
jamespo

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

@ jamespo ที่จริงฉันลองแล้ว แต่ก็ไม่มีผลอะไรดังนั้นการรีสตาร์ทจึงเป็นสิ่งเดียวที่ฉันรู้ว่าสามารถช่วยได้
jayarjo

แคช 4027092k ควรอธิบายการใช้งานหน่วยความจำใช่ไหม? ฉันกำลังทำงานในขณะนี้กับปัญหาที่คล้ายกันที่อื่น ๆ และจนถึงตอนนี้ฉันก็สามารถจัดการการถ่ายโอนหน่วยความจำด้วย params ต่อไปนี้: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio นี่ไม่ใช่การแก้ไขที่สมบูรณ์และข้อเสนอแนะใด ๆ ยินดีมากที่สุด. ฉันหวังว่ามันจะเป็นทิศทางที่ถูกต้อง

คำตอบ:


16

การทำงานtopในโหมดแบทช์เพื่อรายงานขนาดหน่วยความจำเป็นระยะสามารถใช้เพื่อดูว่าใครกำลังใช้หน่วยความจำเมื่อสิ่งต่าง ๆ ลงไปทางใต้ การรันsarในโหมดแบตช์ควรให้การวินิจฉัยที่ดีเกี่ยวกับการใช้หน่วยความจำและ I / O ที่เกี่ยวข้อง การวิ่งmuninเพื่อตรวจสอบระบบควรให้กราฟกับรายละเอียดที่ดีเกี่ยวกับการใช้หน่วยความจำ สิ่งนี้อาจช่วยได้มาก

คุณสามารถใช้ limits.conf เพื่อ จำกัด ขนาดแกนหลักสูงสุดของโปรแกรม การตั้งค่าอย่างถูกต้องนี้ควรฆ่าโปรแกรมใด ๆ ที่หน่วยความจำรั่ว สิ่งนี้ใช้ได้กับโมดูล pam_limits ข้อ จำกัด ยังสามารถตั้งค่าได้ด้วยulimitsคำสั่ง

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

  • แอปพลิเคชันที่ตั้งโปรแกรมไม่ดีที่ทำงานภายใต้apache2อาจทำให้หน่วยความจำรั่ว คุณจะเห็นขนาดหน่วยความจำเพิ่มขึ้นเมื่อสิ่งนี้เกิดขึ้น คุณสามารถปรับแต่ง apache2 เพื่อรีไซเคิลเด็ก ๆ หลังจากใช้งานไปตามจำนวนที่กำหนดโดยตั้งค่าMaxRequestsPerChildเป็น 100 หรือมากกว่านั้น หากวิธีนี้ช่วยแก้ไขปัญหาได้คุณต้องแก้ไขปัญหาการรั่วไหล ฉันจะดูมันก่อน
  • MySQL อาจพยายามโหลดข้อมูลลงในหน่วยความจำ หากคุณมีข้อมูลจำนวนมากในหน่วยความจำสิ่งนี้อาจทำให้เกิดการฟาดฟันบางอย่าง แต่ไม่ควรเร้าใจอย่างที่เห็น
  • หากคุณtmpfsติดตั้งระบบไฟล์ขนาดใหญ่คุณอาจทำให้หน่วยความจำรั่วหากไฟล์ไม่ถูกลบเมื่อใช้ ไฟล์ขนาดใหญ่ที่มีอายุการใช้งานยาวนานอาจเป็นปัญหาได้เช่นกัน
  • หากปัญหาเกิดขึ้นในเวลาประมาณเดียวกันของวันคุณอาจมีโปรแกรมที่กำหนดไว้ซึ่งหน่วยความจำรั่ว
  • หากคุณมีโปรแกรมที่จัดสรรหน่วยความจำที่ใช้ร่วมกัน แต่ไม่ได้ปล่อยออกมาก่อนที่จะออกคุณจะมีหน่วยความจำรั่วที่มองไม่เห็น หากหน่วยความจำที่ใช้ร่วมกันถูกล็อคในหน่วยความจำก็อาจบังคับให้แลกเปลี่ยน จำนวนหน่วยความจำที่ใช้ร่วมกันที่มีอยู่นั้นค่อนข้าง จำกัด
  • ชุด liquidsoap + icecast อาจพบปัญหาการบัฟเฟอร์ที่ใช้หน่วยความจำ ฉันไม่ได้ใช้ชุดค่าผสมนี้ดังนั้นฉันไม่แน่ใจว่าสิ่งนี้จะปรากฏขึ้นได้อย่างไร

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

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

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


ปัญหาในกรณีของฉันแปลก ๆ แม้เมื่อโหลดมีขนาดใหญ่และเซิร์ฟเวอร์ทำการแลกเปลี่ยนอย่างหนักมีหน่วยความจำฟรีมากมาย (อย่างที่ฉันเข้าใจหลังจากที่ฉันอ่านเกี่ยวกับบัฟเฟอร์และแคช) ด้านบนไม่แสดงกระบวนการ hogging หน่วยความจำมากขึ้น แต่โหลดขึ้นและในบางจุดเซิร์ฟเวอร์จะไม่สามารถใช้งานได้: | ขอบคุณสำหรับการตอบรับอย่างละเอียด
jayarjo

2
@jayarjo: Munin และ sar ควรช่วยตรวจสอบสิ่งที่เกิดขึ้น หากคุณมีหน่วยความจำฟรีมากมายคุณไม่ควรเปลี่ยน คุณอาจมีปัญหา I / O ที่แตกต่างกัน sarจะช่วยระบุพาร์ทิชันที่มี I / O และอาจช่วยค้นพบปัญหา
BillThor

+1 สำหรับ MaxRequestsPerChild คำแนะนำ
jamespo

11

คุณสามารถใช้คำสั่งนี้เพื่อดูแอปพลิเคชัน 10 อันดับแรกที่เกี่ยวข้องกับการใช้ RAM:

ps -A --sort -rss -o comm,pmem | head -n 11

บางครั้งคำสั่งนี้ช่วยคุณได้หากมีการสร้างกระบวนการย่อยจำนวนมาก:

ps auxf

วิธีนี้คุณสามารถดูว่ากระบวนการใดอยู่ด้วยกัน


เหล่านี้เป็นคำสั่งที่มีประโยชน์ขอบคุณฉันจะบันทึกไว้สำหรับอนาคต แต่ปัญหาคือมีกระบวนการเดียวกันอยู่ด้านบนเสมอ (คุณสามารถดูได้ในภาพหน้าจอที่แนบมา) - apache, mysql, liquidsoap, icecast และพวกเขาใช้ (หรืออย่างน้อยก็แสดงให้เห็นถึงการใช้งาน) จำนวนหน่วยความจำเท่ากัน (เล็กน้อยจริง ๆ ) แม้เมื่อเซิร์ฟเวอร์กำลังจะโหลด: |
jayarjo

@jayarjo: จำนวนกระบวนการเปลี่ยนไปหรือไม่ คุณมีกระบวนการมากขึ้นหรือไม่? และมันเป็นเซิร์ฟเวอร์จริงหรือเซิร์ฟเวอร์เสมือนจริงหรือไม่?
Raffael Luthiger

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

2
ลองรับข้อมูลเพิ่มเติมด้วย "vmstat" (เช่น vmstat -s) หรือด้วยเครื่องมือที่กล่าวถึงแล้ว "sar" คุณอาจมีระบบไฟล์แบบ RAM หรือไม่? จากนั้นบางที "iostat" ก็สามารถให้ข้อมูลเพิ่มเติมได้เช่นกัน
Raffael Luthiger

1
ฉันมีข้อสงสัยว่าฟิลด์ "pmem" (% MEM) ในpsหรือtopเอาท์พุทเป็นสิ่งที่ถูกต้องหรือไม่หากพยายามตรวจหาการรั่วไหลของหน่วยความจำ: นี่เป็นเพียงเปอร์เซ็นต์ของหน่วยความจำกายภาพที่กระบวนการใช้อยู่ในปัจจุบันใช่หรือไม่ แต่ส่วนอื่น ๆ ของหน่วยความจำที่ใช้ (รวมถึงการรั่วไหล) ของกระบวนการอาจถูกสลับออก บางที "ขนาด" หรือ "vsize" จะเหมาะสมกว่าสำหรับการวัดขนาดของกระบวนการหรือไม่? เช่นps -A --sort -size -o comm,size | head -n 11หรือps -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zakharyaschev

8

ไม่มีสิ่งใดที่ใช้หน่วยความจำนั้นในแง่ของการใช้งานจริง ๆ

คุณต้องหักค่า 'แคช' ซึ่งแสดงถึงแคชหน้าเพื่อให้ได้แนวคิดที่ดีขึ้นเกี่ยวกับการใช้หน่วยความจำจริงของคุณในแง่ของการใช้งานโปรแกรม

นี่คือการจัดการหน่วยความจำที่ดีและนี่คือสิ่งที่คุณต้องการ

ดูลิงค์ที่นี่สำหรับข้อมูลเพิ่มเติม: http://www.linuxatemyram.com/


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

@jayarjo ฉันคิดว่าจะเข้าใจสิ่งที่เกิดขึ้นที่นั่นเราจะต้องมีสถิติแสดงให้เห็นถึงปัญหาแล้ว ตัวเลขที่คุณให้ไม่แสดงการสลับหรือการใช้งานหน่วยความจำจริงมาก
Matthew Ife

1

ฉันไม่ใช่มืออาชีพในเรื่องนี้ แต่สบู่เหลว + icecast เกี่ยวข้องกับมัลติมีเดีย เมื่อระบบว่างระบบจะแคชและ / หรือใช้หน่วยความจำเพื่อการใช้งานในอนาคต และหากปริมาณการใช้เพิ่มขึ้นในช่วงเวลาหนึ่งของวัน / ในช่วงระยะเวลาหนึ่งก็จะเริ่มทำการแลกเปลี่ยน ณ จุดนี้หากการร้องขอ (ผู้ใช้ที่ดูเนื้อหา) เพิ่มขึ้นทรัพยากรที่ต้องการนั้นจะมากกว่า RAM 8GB

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