รับการใช้งานหน่วยความจำทั้งหมดของ chrome


28

เนื่องจาก Google Chrome / Chromium วางไข่หลายกระบวนการจึงยากที่จะเห็นจำนวนหน่วยความจำทั้งหมดที่กระบวนการเหล่านี้ใช้ทั้งหมด

มีวิธีที่ง่ายหรือไม่ในการดูว่ามีหน่วยความจำรวมทั้งหมดที่กระบวนการเชื่อมต่อใช้อยู่หรือไม่


ถ้าฉันแปลงตัวเลขที่พิมพ์จาก KiB เป็น GiB แล้วก็ถึงค่า Res หน่วยความจำฉันได้รับมากกว่าจำนวนแรมของเครื่องบวกกับการสลับ ดังนั้นดูเหมือนว่ามีบางสิ่งที่เกินความคาดหมาย
Ryan1729

คำตอบ:


30

เนื่องจากgoogle kill chrome: // memoryในเดือนมีนาคม 2559 ตอนนี้ฉันใช้smem :

# detailed output, in kB apparently
smem -t -P chrom
# just the total PSS, with automatic unit:
smem -t -k -c pss -P chrom | tail -n 1
  • เพื่อให้มีความแม่นยำมากขึ้นแทนที่chromด้วยเส้นทางแบบเต็มเช่น/opt/google/chromeหรือ/usr/lib64/chromium-browser
  • ใช้งานได้เหมือนกันสำหรับ multiprocess firefox (e10s) ด้วย -P firefox
  • ระวัง smem จะรายงานตัวเองในผลลัพธ์เพิ่มอีก ~ 10-20M ในระบบของฉัน
  • ซึ่งแตกต่างจากด้านบนมันต้องการการเข้าถึงรูทเพื่อตรวจสอบกระบวนการรูทอย่างแม่นยำ - ใช้sudo smemสำหรับสิ่งนั้น
  • ดูคำตอบ SO นี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสาเหตุที่ smem เป็นเครื่องมือที่ดีและวิธีอ่านเอาต์พุต

ฉันไม่แน่ใจว่าสิ่งนี้ใช้ได้กับฉัน 338.0Mเมื่อฉันเรียกใช้คำสั่งที่สองผมได้รับค่ากลับมาของ ต่ำเกินไป เมื่อฉันเรียกใช้การตรวจสอบระบบฉันจะเห็นว่ามีกระบวนการของโครเมียม 11 กระบวนการและแต่ละกระบวนการใช้ RAM ระหว่าง 70MB ถึง 400MB ไม่แน่ใจว่าการตรวจสอบระบบรายงานว่าไม่ถูกต้องหรือไม่
sixtyfootersdude

ปัญหาเดียวกันสำหรับ smem ในการกระจาย Kali Linux 2017.1 เอาต์พุตคือ 800Mo of ram ที่ใช้โดย chrome ที่มี 5 อินสแตนซ์และอย่างน้อย 30 แท็บ ... และการตรวจสอบระบบก็ไม่เห็นด้วยกับ smem มีใครพบวิธีแก้ปัญหานี้? (ขอบคุณสำหรับคำตอบและการอ้างอิง)
matthieusb

1
ความคิดเห็นของคุณสมควรได้รับคำถามแยกต่างหาก (ด้วยผลลัพธ์เต็มรูปแบบของโปรแกรมที่ขัดแย้งกัน) เพียงโพสต์ลิงค์ในความคิดเห็น
eddygeek

1
ฉันจะใช้chromeแทนเพียงchormเพราะถ้าคุณใช้ทั้งโครเมียมและโครเมียมคุณจะเห็นผลรวมทั้งคู่
RJ

1
คุณสามารถยกเว้นsmemจากการแสดงผลของตัวเองโดยใช้สิ่งที่ต้องการเช่น[c]hrome smem -tkP '[c]hrome'มันทำงานได้โดยการจับคู่cด้านในของวงเล็บเหลี่ยมและไม่ใช่วงเล็บเหลี่ยม
wjandrea

3

ฉันแน่ใจว่ามันไม่ใช่ทางออกที่ดีที่สุด แต่ก็ยังใช้งานได้สำหรับฉัน:

#!/bin/sh
ps aux | grep "[/]opt/google/chrome/chrome" | awk '{print $5}' | awk '{sum += $1 } END { print sum }' 
ps aux | grep "[/]opt/google/chrome/chrome" | awk '{print $6}' | awk '{sum += $1 } END { print sum }' 

หมายเหตุ: เปลี่ยนเป็น[/]opt/google/chrome/chromeสิ่งที่เหมาะสมสำหรับระบบของคุณเช่นหากคุณใช้ Mac OS X ( grep "chrome"จะใช้งานได้)


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

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

ทำไมสองawkคำสั่ง? นั่นคือเหตุผลที่ไม่ได้เป็นเพียง... | awk '{sum += $6} END {print sum}'?
wjandrea

2
FWIW ต่อไปนี้เป็นรุ่นที่สั้นลงและชัดเจนขึ้น:ps aux | grep "/opt/google/chrome/chrome" | awk '{vsz += $5; rss += $6} END { print "vsz="vsz, "rss="rss }'
wjandrea

1
@Rushi อย่าไปสนใจ วิธีนี้ไม่ได้ให้ตัวเลขที่มีความหมาย ใช้smemต่อคำตอบยอดนิยม แม้ว่า FWIW ฉันจะใช้มันเป็นสคริปต์หรือฟังก์ชั่นเนื่องจากมันซับซ้อนเกินไปสำหรับนามแฝง
wjandrea

2

ใช้สิ่งนี้:

perl -e '$a="x"x1000000000;sleep(10);print"done\n"'

ใช้ RAM 1.8GB ขึ้นไป ดังนั้นคุณคาดว่าจะใช้งานได้:

perl -e '$a="x"x1000000000;fork;fork;fork;fork;sleep(10);print"done\n"'

จะใช้เวลามากถึง 16 เท่า แต่มันไม่ได้

นี่เป็นเพราะการคัดลอก -on-write ที่ชาญฉลาดของ Linux kernel: เนื่องจากเนื้อหาของ '$ a' ไม่เปลี่ยนแปลงดังนั้นหน่วยความจำ '$ a' จึงสามารถแชร์ได้ แต่จะยังคงแชร์อยู่จนกว่าจะเปลี่ยน '$ a' เมื่อสิ่งนั้นเกิดขึ้นส่วนที่เปลี่ยนแปลงจะถูกคัดลอกและเริ่มรับแรม

ไม่ว่าคุณจะสามารถวัดจำนวนหน่วยความจำที่คัดลอกเมื่อเขียนเกินความมุ่งมั่นฉันไม่ทราบ แต่อย่างน้อยนี่ก็อธิบายการนับเกินกำลังของคุณ


0

เพียงคำนวณผลรวมของกระบวนการอย่างรวดเร็ว

บนMac :

  • ไปที่chrome://system/และเลือกรายงานทั้งหมดในmem_usage
  • วางในSublimeText
  • SelectAll (CMD + 'A') และ SelectAllLines (CMD + SHIFT + 'L')
  • CMD + ขวา (ไปที่ eol), Backspace, Backspace, Backspace, ALT + Left, CMD + Backspace
  • Backspace พิมพ์ '+', CMD + 'A', CMD + 'C'
  • เปิดTerminal , เรียกใช้python, CMD + V, Enter

และ voila! "ง่าย" ... 🤓😅

PS - นินจาทางลัด & 80s / 90s ผู้เล่นเกมต่อสู้ไม่ควรมีปัญหากับวิธีนี้🤖🕹💾


0

ฉันพบวิธีแก้ปัญหาด้วยเสียงเรียกเข้าและ awk เปิด chrome: // ระบบขยาย mem_usage คัดลอกไปยังกลุ่มและเรียกใช้ regexp:

:%s/\D*\(\d*\).MB.*/\1

ซึ่งจะทิ้งเฉพาะตัวเลขก่อน MB บันทึกไฟล์และดำเนินการ

cat file | awk '{sum += $1} END {print sum}'

ฉันไม่สามารถแปลง vim regexp code เป็น sed ได้


0

มีUSSซึ่งมีให้บริการข้ามแพลตฟอร์ม

USS (Unique Set Size) คือหน่วยความจำที่ไม่ซ้ำกับกระบวนการและจะเป็นอิสระหากกระบวนการถูกยกเลิกในตอนนี้

psutil> 4.0 Python library สามารถเข้าถึงได้

นี่ฉันจะใช้มัน

sudo python3 -c "import psutil;print(sum(p.memory_full_info().uss for p in psutil.Process(pid=292).children())/1024/1024);"

โดยที่ pid = 292 เป็น PID ของกระบวนการภายนอกส่วนใหญ่จากการตรวจสอบกิจกรรม


-1

ฉันรู้ว่า chrome / chromium มีตัวจัดการงาน แต่มันไม่ได้ให้หน่วยความจำทั้งหมดที่ใช้ ปรากฎว่าลิงก์ "สถิติสำหรับผู้สนใจ" ในตัวจัดการงานนำไปสู่ ​​chrome: // memory-redirect / ซึ่งแสดงรายการหน่วยความจำทั้งหมดที่ใช้ มันจะเป็นการดีถ้ามีการตรวจสอบความถูกต้องภายนอกของตัวเลขเหล่านี้รวมถึงวิธีการรับข้อมูลในบรรทัดคำสั่งเพื่อให้สามารถทำได้มากกว่านี้ แต่นี่น่าจะเป็นวิธีที่ดีที่สุดที่มีอยู่


2
คำตอบนี้ไม่ถูกต้องอีกต่อไป ดูbugs.chromium.org/p/chromium/issues/detail?id=588790
eddygeek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.