RAM ฟรีหายไป - หน่วยความจำรั่วใช่ไหม


11

บนระบบที่เริ่มต้นใหม่freeรายงานเกี่ยวกับ RAM ที่ใช้ 1.5G (RAM 8G ทั้งหมด, Ubuntu 12.04 พร้อม lightdm และพลาสมาเดสก์ท็อป, หนึ่งหน้าต่าง konsole เริ่มขึ้น) เมื่อใช้แอพที่ฉันใช้อยู่จะยังคงใช้งานได้ไม่เกิน 2G อย่างไรก็ตามการที่ระบบใช้งานได้สองสามวันแรมฟรีของฉันก็หายไปเรื่อย ๆ - โดยไม่แสดงในรายการแอพที่ใช้: ในขณะที่smem --pie=nameรายงานใช้น้อยกว่า 20% (และมี 80% ที่ใช้งานได้) ต่างกัน free -mเช่นรายงานเกี่ยวกับวันที่ 7:

             total       used       free     shared    buffers     cached
Mem:          7459       7013        446          0        178        997
-/+ buffers/cache:       5836       1623
Swap:         9536        296       9240

(เพื่อให้คุณสามารถมองเห็นมันไม่ใช่บัฟเฟอร์หรือแคช) วันนี้ในที่สุดก็จบลงด้วยระบบล้มเหลวอย่างสมบูรณ์: ตัวจัดการ windows หายไปแอพ "ห้อยอยู่ในอากาศ" (ไร้กรอบ) - และป๊อปอัพแจ้งเตือนฉันเกี่ยวกับ "ไฟล์ที่เปิดมากเกินไป" รายงาน Syslog:

kernel: [856738.020829] VFS: file-max limit 752838 reached

ดังนั้นฉันจึงปิดแอปพลิเคชันเหล่านั้นฉันสามารถปิดและฆ่า X โดยใช้ Ctrl-Alt-backspace X พยายามขึ้นมาอีกครั้งหลังจากนั้นด้วย failafeX แต่ไม่สามารถทำได้เนื่องจากไม่สามารถตรวจจับการกำหนดค่าได้อีกต่อไป ดังนั้นฉันจึงเปลี่ยนไปใช้คอนโซลโดยใช้ Ctrl-Alt-F2 บันทึกข้อมูลทั้งหมดที่ฉันนึกได้ (vmstat, ฟรี, smem proc/meminfo, lsof, ps aux) และรีบูตในที่สุด X กลับมาพร้อมกับ failafeX อีกครั้ง ครั้งนี้ฉันบอกให้ "กู้คืนจากการตั้งค่าการสำรองข้อมูลของฉัน" จากนั้นเปลี่ยนไปใช้คอนโซลและใช้startxเพื่อแสดงสภาพแวดล้อมแบบกราฟิกขึ้นมา

ฉันไม่มีเงื่อนงำที่แท้จริงว่าอะไรเป็นสาเหตุของปัญหานี้ - แม้ว่ามันจะต้องเกี่ยวข้องกับ X เองหรือด้วยกระบวนการผู้ใช้บางอย่างที่ทำงานบน X - หลังจากฆ่า X แต่free -mผลลัพธ์ดูเหมือนว่า:

             total       used       free     shared    buffers     cached
Mem:          7459       2677       4781          0         62        419
-/+ buffers/cache:       2195       5263
Swap:         9536         59       9477

(~ 3.5GB เป็นอิสระ) - เพื่อเปรียบเทียบกับเอาต์พุตหลังจากเริ่มต้นใหม่:

             total       used       free     shared    buffers     cached
Mem:          7459       1483       5975          0         63        730
-/+ buffers/cache:        689       6769
Swap:         9536          0       9536

มีเอาต์พุตที่เป็นประโยชน์เพิ่มเติมสองmemstat -uรายการ ไม่นานก่อนเกิดความผิดพลาด:

User     Count     Swap      USS      PSS      RSS
mail         1        0      200      207      616
whoopsie     1      764      740      817     2300
colord       1     3200      836      894     2156
root        62    70404   352996   382260   569920
izzy        80   177508  1465416  1519266  1851840

หลังจากฆ่า X แล้ว:

User     Count     Swap      USS      PSS      RSS
mail         1        0      184      188      356
izzy         1     1400      708      739     1080
whoopsie     1      848      668      826     1772
colord       1     3204      804      888     1728
root        62    54876   131708   149950   267860

และหลังจากรีสตาร์ทให้กลับมาใน X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      212      217      628
whoopsie     1        0     1536     1880     5096
colord       1        0     3740     4217     7936
root        54        0   148668   180911   345132
izzy        47        0   370928   437562   915056

การใช้ระบบไฟล์เป็นเวลาหนึ่งสัปดาห์ การใช้เคอร์เนล / CPU เป็นเวลาหนึ่งสัปดาห์

แก้ไข: เพิ่งเพิ่มสองกราฟจากระบบตรวจสอบของฉัน น่าสนใจที่จะดู: ทุกครั้งที่มี "การกระโดด" ในการใช้หน่วยความจำ CPU จะมีค่าสูงสุด เพิ่งพบสิ่งนี้ในตอนนี้ - และมันทำให้ฉันนึกถึงตัวบ่งชี้อื่นที่ชี้ไปที่ตัว X: บ่อยครั้งเมื่อกลับไปที่เครื่องของฉันและปลดล็อกหน้าจอฉันพบสิ่งที่ทำงานหนักบน CPU ของฉัน ตรวจสอบกับมันก็จะกลายเป็นtop/usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none

ดังนั้นหลังจากคำอธิบายที่ยาวนานนี้ในที่สุดคำถามของฉัน:

  1. อะไรคือสาเหตุที่เป็นไปได้?
  2. ฉันจะระบุกระบวนการ / แอพพลิเคชั่นที่เกี่ยวข้องได้ดีขึ้นอย่างไร
  3. ขั้นตอนใดที่สามารถดำเนินการเพื่อหลีกเลี่ยงพฤติกรรมนี้ - ไม่สามารถทำการรีบูตเครื่องได้ทุกวัน

ฉันใช้งาน 8.04 (Hardy) เป็นเวลาประมาณ 5 ปีในเครื่องเก่าของฉันไม่เคยมีประสบการณ์เช่นนี้ (มักจะใช้เวลามากกว่า 100 วันก่อนที่จะรีบูตเครื่องเช่นอัพเดตเคอร์เนล) ตอนนี้เป็นเครื่องใหม่พร้อมติดตั้งใหม่ของ 12.04 ในกรณีที่มีความสำคัญรายละเอียดบางอย่าง:

AMD A4-3400 APU พร้อมกราฟิก Radeon (tm) HD โดยใช้ไดร์เวอร์ ati / radeon แบบโอเพ่นซอร์ส (ดังนั้นจึงไม่มีการติดตั้ง fglrx), RAM 8GB, WDC WD1002FAEX-0 hdd (1TB), Asus F1A75-V Evo Ubuntu 12.04 64- บิตพร้อม KDE4 / พลาสมา โดยปกติแล้วแอปจะเปิดมากหรือน้อยอย่างถาวร ได้แก่ Evolution, Firefox, konsole (โดยมี Midnight Commander ทำงานอยู่ภายใน, ประมาณ 4 แท็บ), และ LibreOffice - บวก Caliber, Gimp และ Moneyplex (ซอฟต์แวร์ธนาคารที่ฉันใช้มาเกือบ 20 ปีแล้ว) ในเวอร์ชันที่ทำได้ดีกับ Hardy)

แก้ไข: วันนี้ฉันพบหนึ่งใน "คนชั่ว": KDE4s plasma-desktop ใช้หน่วยความจำได้อีกครั้งถึง 5GB killall plasma-desktop && plasma-desktopเมื่อฉันได้ สิ่งนี้ปลดปล่อย RAM 1.3GB! psพูดว่า:

                             RSS    SIZE   VSZ
plasma usage before restart  120988 526472 1300816
plasma usage after restart   92352  495972 1263632

ดังนั้น 1.3GB เหล่านั้นอยู่ที่ไหน ความแตกต่างระหว่างค่าเหล่านั้นหากรวมกันจำนวน 96MB - ไม่ใช่ 1.3GB

และนี่สามารถเป็นส่วนเดียวเท่านั้นเนื่องจากยังใช้งาน 3.7GB อยู่ (ควรน้อยกว่า 2GB) ฉันตรวจสอบสิ่งนี้ในช่วง 6 วันที่ผ่านมาโดยใช้เครื่องมือหลายอย่าง: หน่วยความจำที่ใช้ (ไม่ได้พูดถึงแคชและบัฟเฟอร์) เพิ่มขึ้นอย่างช้าๆ แต่มั่นคง แม้ว่าฉันจะไม่ได้อยู่ที่โต๊ะเพื่อทำงานอะไรก็ตาม ...

ในการตรวจสอบกระบวนการด้วยไฟล์ที่เปิดฉันใช้ 1-liner ต่อไปนี้ (ฉันชอบเชลล์และโดยเฉพาะอย่างยิ่งทุบตี) เพื่อรับ top-5:

echo "$(for pid in $(ls -a /proc|egrep '^([0-9])*$'|sort -n 2>/dev/null); do \
if [ -e /proc/$pid/fd ]; then FHC=$(ls -l /proc/$pid/fd|wc -l); \
if [ $FHC -gt 0 ]; then PNAME="$(cat /proc/$pid/comm)"; \
echo "$FHC files opened by $pid ($PNAME)"; fi; fi; done)"|sort -r -n|head -n5

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

การใช้งาน VFS (2 วัน)

เห็นการลดลงของการจัดการไฟล์ในตอนท้าย? นั่นคือการเริ่มพลาสมาใหม่


ไม่sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'ล้างแกะพิเศษ? คุณสามารถดูไฟล์ที่เปิดอยู่ของโปรแกรมโดยใช้lsof
Savvas Radevic

นอกจากนี้คุณได้ลองเปลี่ยนผู้จัดการเดสก์ท็อปหรือไม่? เช่น lxde (หรือ lubuntu-desktop)? ในที่สุดคุณแน่ใจหรือว่าผลลัพธ์ไปยังดิสก์นั้นดี? คุณตรวจสอบข้อมูล SMART ของดิสก์และความเร็วในการคัดลอกไฟล์จาก / ไปยังดิสก์โดยใช้ live cd หรือไม่
Savvas Radevic

ตรวจสอบสิ่งนี้เพื่อทดสอบว่าคุณมีการรั่วไหลวิธีตรวจจับการรั่วไหลของหน่วยความจำหรือไม่
มิทช์

@medigeek: ตามที่ฉันชี้ให้เห็นแคชและบัฟเฟอร์ไม่ใช่ปัญหา freeดูการส่งออกของ ในความเป็นจริงการเปลี่ยนไปใช้ DE อื่นฉันได้พิจารณาแล้ว หาก KDE3.5 พร้อมใช้งานฉันไม่ได้ลงเอยด้วยพลาสมา นี่อาจเป็นเพียงชั่วคราวเพื่อดูว่ามีส่วนเกี่ยวข้องกับพลาสมาหรือไม่
Izzy

@ Mitch: ฉันเข้าใจว่า memprof นั้นจะใช้กับกระบวนการที่ทราบ (ซึ่งฉันยังไม่ได้แยก) แน่ใจว่ามันสามารถใช้งานได้ทั้งระบบ? ยิ่งไปกว่านั้นในขณะที่ข้อผิดพลาด "เปิดไฟล์มากเกินไป" แนะนำให้ฉันดูเหมือนว่าบางกระบวนการกำลังเปิดตัวจัดการไฟล์จำนวนมากอย่าปล่อยพวกเขา ไม่แน่ใจว่าจะถูกจับโดย memprof หรือไม่ ตอนนี้ฉันตั้งค่าสคริปต์เพื่อดักจับกระบวนการ 5 อันดับแรกด้วยการเปิดไฟล์หวังว่านี่จะเป็นการเปลี่ยนความชั่วร้าย
Izzy

คำตอบ:


6
  1. ไฟล์จำนวนมากที่เปิดอยู่เป็นสัญญาณที่ดีว่ามีบางอย่างผิดปกติ ฉันเดาว่าเป็น daemon ของระบบ KDE

  2. เปิดคอนโซลและเรียกใช้ "top" จากนั้นใช้ <และ> เพื่อเปลี่ยนคอลัมน์การเรียงลำดับเป็น VIRT หรือ RES และดูว่าโปรแกรมใดกำลังใช้หน่วยความจำมากที่สุด การรั่วไหลของหน่วยความจำจะปรากฏขึ้นเมื่อมีการใช้งานหน่วยความจำเสมือนที่พองโตอย่างมากเมื่อตัวชี้ไปยังหน่วยความจำที่รั่วไหลหายไปจะไม่ถูกใช้งานและจะถูกสลับออก เรียกใช้ "lsof" แล้วมองหากระบวนการที่มีไฟล์เปิดอยู่มากมายเนื่องจากสิ่งนี้ดูเหมือนจะเป็นไฟล์ descriptor รั่วไหลจริงๆ

  3. ติดตามโปรแกรมและรายงานข้อบกพร่อง


ฉันพยายามใช้ประโยชน์สูงสุด / htop สำหรับสิ่งนี้แล้ว ปัญหาคือมันไม่พบผลลัพธ์ใด ๆ สำหรับหน่วยความจำ RESident (ตามที่อธิบายไว้ข้างต้นมีเพียงส่วนเล็ก ๆ ของหน่วยความจำที่ใช้เท่านั้นที่สามารถเชื่อมต่อกับแอพที่รันอยู่) และสำหรับหน่วยความจำ VIRTual มันยากที่จะ interprete (แม้หลังจากเริ่มต้นแล้วหน่วยความจำเสมือนที่ใช้ผลรวมถึง 3TB ที่นี่ - ขนาดแม้ harddrive ของฉันไม่สามารถจัดการได้) ดังนั้นในปัจจุบันเช่น Evolution ใช้ 1.9GB VIRT ตามลำดับสูงสุดในขณะที่หน่วยความจำโดยรวมที่ใช้อยู่มีจำนวนมากถึง 1.2GB (ไม่รวมแคชและบัฟเฟอร์) และใช่ความตั้งใจแรกของฉันคือการติดตามลงโปรแกรมดังนั้นฉันสามารถยื่นข้อผิดพลาด ...
อิซซี่

เพิ่งเพิ่ม 2 imgs จากระบบตรวจสอบของฉัน ดูเหมือนว่า "การข้าม" เกิดขึ้นเสมอในเวลาเดียวกันของวัน (ยกเว้น 1 ข้อ) น่าเสียดายที่ imgs ไม่มีการประทับเวลาเพื่อตรวจสอบกับ cron Btw: มีวิธีใดบ้างในการตรวจสอบว่ากระบวนการใดมีไฟล์เปิดกี่ไฟล์?
Izzy

1
คุณเดาว่าเป็นคนดี แม้ว่าจะไม่ใช่ภูต แต่ส่วนใหญ่เป็นองค์ประกอบของ KDE: plasma-desktop (ดูด้านบน) สิ่งที่ตลกเกี่ยวกับมัน: ฉันเพิ่งคิดออกและโพสต์ไว้ที่นี่ - และ 10 นาทีต่อมาในชีวิตประจำวันของฉันapt-get update && apt-get upgradeมีการอัพเดตสำหรับพลาสมาเดสก์ท็อป; พวกนั้นเร็ว X) ตอนนี้ฉันเพิ่งดูไปซักพักเพื่อดูว่าปัญหาได้รับการแก้ไขหรือไม่ก่อนที่ฉันจะประกาศเช่นนั้น ถึงตอนนี้สิ่งที่ดูค่อนข้างสดใส
Izzy

ยังคงดูมีเสถียรภาพ แม้ว่าค่าlsofมิได้topชี้ให้ฉันไป "กระบวนการชั่วร้าย" เดาของคุณเกี่ยวกับภูต KDE ชี้ให้ฉันในทิศทางของการก่อเหตุนั้น ดังนั้นขอขอบคุณอีกครั้ง - เวลาที่เครื่องของฉันใช้งานได้ประมาณ 14 d และทุกอย่างยังคงดูดีแม้ว่าฉันจะใช้งานสิ่งต่างๆเช่น VirtualBox, การคอมไพล์และอื่น ๆ ในแบบคู่ขนาน ดังนั้นผมคิดว่าการแก้ไขนี้และทำเครื่องหมายการจับคู่ที่ใกล้เคียงที่สุด :)
อิซซี่

0

ฉันคิดว่านั่นเป็นระบบปกติ ทุกอย่างเป็นไปได้ดี

คุณอาจอ่านกระดาษที่ยอดเยี่ยมนี้ (linux กิน ram ของฉัน) เพื่อทำความเข้าใจวิธีที่ linux จัดการกับ ram ของคุณและทำไมไม่ต้องกังวล:

http://www.linuxatemyram.com/


4
โอ้ - ฉันไม่เคยได้ยินมาก่อนว่าเป็น "พฤติกรรมของระบบปกติ" หากระบบล่มหลังจาก 7 วันโดยมีข้อผิดพลาด "เปิดไฟล์มากเกินไป" ฉันใช้งาน Linux มาประมาณ 15 ปีแล้วตอนนี้ไม่เคยมีสิ่งนี้มาก่อน และใช่ฉันเข้าใจอย่างถ่องแท้ว่า Linux ใช้ "free RAM" (ใช้เพื่อการแคชเป็นต้น) ตามที่กล่าวไว้ข้างต้น: แคชและบัฟเฟอร์ไม่ใช่ปัญหาที่นี่ ฉันไม่ได้พูดถึงการใช้ RAM ด้วยเหตุผลที่ดี - Linux จะไม่ติดแคชสำหรับราคาการแลกเปลี่ยน
Izzy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.