การใช้หน่วยความจำจริงของกระบวนการ


20

ต่อไปนี้เป็นการใช้หน่วยความจำของmysqlและapacheตามลำดับบนเซิร์ฟเวอร์ของฉัน ตามผลลัพธ์ของการpmapพูดmysqlใช้ประมาณ 379M และapacheใช้ 277M

[root@server ~]# pmap 10436 | grep total
 total           379564K

[root@server ~]# pmap 10515 | grep total
 total           277588K

เปรียบเทียบสิ่งนี้กับผลลัพธ์ของtopฉันเห็นค่าเกือบจะตรงกัน

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10515 apache    20   0  271m  32m 3132 S  0.0  6.6   0:00.73 /usr/sbin/httpd
10436 mysql     20   0  370m  21m 6188 S  0.0  4.3   0:06.07 /usr/libexec/mysqld --basedir=....

ตอนนี้ค่าเหล่านี้ไม่ใช่การใช้หน่วยความจำในปัจจุบันของทั้งสองกระบวนการเนื่องจากถ้าเป็นเพราะมันจะมีขนาดเกิน 512M ramบนระบบของฉันและฉันเข้าใจความจริงที่ว่าขนาดเหล่านี้เป็นขนาดของหน้าที่กำหนดให้กับกระบวนการทั้งสองนี้ ขนาดของหน่วยความจำที่ใช้โดยพวกเขา ตอนนี้เมื่อเราใช้pmap -xฉันเห็น coloumn พิเศษDirtyซึ่งแสดงการใช้หน่วยความจำน้อยกว่าสำหรับกระบวนการ ดังที่เห็นในตัวอย่างที่แสดงด้านล่างDirtycoloumn แสดง 15M เมื่อเทียบกับ 379M ใน coloumn แรก คำถามของฉันคือ: ค่าภายใต้ coloumn Dirtyคือจำนวนหน่วยความจำ 'จริง' ที่ใช้โดยกระบวนการนั้นหรือไม่? หากไม่เป็นเช่นนั้นเราจะทราบการใช้หน่วยความจำจริงของกระบวนการได้อย่างไร ไม่psและtopด้วยเหตุผลเดียวกันข้างต้น เรามีอะไรที่อยู่ภายใต้/proc ที่จะให้ข้อมูลนี้

[root@server ~]# pmap -x 10436 | grep total
total kB          379564   21528   15340
[root@server ~]#


[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           489        447         41          0         52        214
-/+ buffers/cache:        180        308
Swap:         1023          0       1023
[root@server ~]#

คำตอบ:


18

มีคำสั่งที่ให้“ใช้หน่วยความจำที่เกิดขึ้นจริงของกระบวนการ” เพราะไม่เป็นไม่มีสิ่งเช่นการใช้งานหน่วยความจำที่เกิดขึ้นจริงของกระบวนการ

แต่ละหน้าหน่วยความจำของกระบวนการอาจเป็น (ท่ามกลางความแตกต่างอื่น ๆ ):

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

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

ข้อมูลที่แสดงโดยpmapมาจากและ นั่นคือการใช้หน่วยความจำจริงของกระบวนการ - ไม่สามารถสรุปได้ด้วยตัวเลขเดียว/proc/PID/maps/proc/PID/smaps


6

ฉันจะอ้างอิงบางสิ่งที่ฉันเขียนไว้ใน man page สำหรับแอปพลิเคชันที่ทำการวิเคราะห์คล้ายกับด้านบนและดึงข้อมูลจากแหล่งเดียวกันกับpmap(เช่น/proc/[N]/maps):

พื้นที่ที่อยู่เสมือนจริง หน่วยความจำทางกายภาพ

สิ่งสำคัญคือต้องเข้าใจความแตกต่างระหว่างพื้นที่ที่อยู่เสมือนและหน่วยความจำกายภาพในการตีความสถิติข้างต้นบางอย่าง ตามที่บอกเป็นนัยว่าที่อยู่เสมือนนั้นไม่จริง มันเป็นแผนที่ของหน่วยความจำทั้งหมดที่จัดสรรให้กับกระบวนการในปัจจุบัน ขีด จำกัด ของขนาดของแผนที่นี้จะเหมือนกันสำหรับแต่ละกระบวนการ (โดยทั่วไป 2-4 GB) และไม่ได้สะสม (เช่นคุณอาจมีหลายสิบหรือหลายร้อยกระบวนการแต่ละที่มีที่อยู่เสมือน 2-4 GB ของตัวเอง พื้นที่บนระบบที่มีหน่วยความจำกายภาพจริง 512 MBเท่านั้น)

ข้อมูลไม่สามารถจัดเก็บหรือดึงข้อมูลจากพื้นที่ที่อยู่เสมือนได้ ข้อมูลจริงต้องการหน่วยความจำจริงจริง มันเป็นหน้าที่ของเคอร์เนลในการจัดการสิ่งที่เกี่ยวข้องกับสิ่งอื่น สถิติพื้นที่เสมือน (VirtualSz, Data + Stack และ Priv & Write) มีประโยชน์สำหรับการพิจารณาโครงสร้างของกระบวนการและความสัมพันธ์กับการใช้หน่วยความจำกายภาพ แต่สำหรับปริมาณ RAM ที่ใช้จริงสถิติหน่วยความจำกายภาพ (ResidentSz, Share, และ สัดส่วน) เป็นสิ่งที่นับ

pmapส่วนใหญ่จะรายงานข้อมูลเกี่ยวกับพื้นที่ที่อยู่เสมือนให้คุณ การสังเกตของคุณว่า "ค่าเกือบจะเข้าคู่กัน" ในtopเอาท์พุทน่าจะหมายถึงรูป VIRT ซึ่งแตกต่างจากรูป RES มาก สิ่งเหล่านี้สอดคล้องกับสิ่งที่ฉันได้ระบุไว้ข้างต้นว่า "VirtualSz" และ "ResidentSz" (VIRT สำหรับเสมือนจริง RES สำหรับผู้อาศัย)

ตอนนี้เมื่อเราใช้ pmap -x ฉันเห็น coloumn Dirty พิเศษซึ่งแสดงการใช้หน่วยความจำน้อยกว่าสำหรับกระบวนการ ดังที่เห็นในตัวอย่างที่แสดงด้านล่าง Dirty coloumn แสดง 15M เมื่อเทียบกับ 379M ใน coloumn แรก คำถามของฉันคือ: ค่าภายใต้ coloumn Dirty คือจำนวนหน่วยความจำ 'จริง' ที่ใช้โดยกระบวนการนั้นหรือไม่

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


ฉันเห็นด้วย. อย่างไรก็ตาม 2 ถึง 4GB สำหรับระบบ 32 บิต ระบบส่วนใหญ่ในปัจจุบันอาจเป็น 64 บิต
ctrl-alt-delor

3

หน่วยความจำเสมือนเป็นเหมือนหมายเลขโทรด่วนยกเว้นมีประมาณ 3 พันล้านหรือมากกว่านั้น (สำหรับระบบ 32 บิต, 4 พันล้านสำหรับแอป 32 บิตบนเคอร์เนล 64 บิต, มากขึ้นสำหรับแอปพลิเคชัน 64 บิต) และคุณไม่สามารถหมุนหมายเลขโดยตรงได้ ที่จะแมปกับการโทรด่วน

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

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

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