กระบวนการที่ซ้ำซ้อนและพิเศษของ Linux ในเอาต์พุต ps


0

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

นี่คือpsผลลัพธ์ทั้งหมดจากภายในคอนเทนเนอร์นักเทียบท่า

 PID %CPU      RSS Threads COMMAND
   1  0.0     2616       1 sh /test/Build/unittest.sh
   7  3.3    44240       1   /usr/bin/Xvfb :1 -screen 0 ...
  17  1.5    10824       1   /usr/bin/fluxbox
 357  690  6292244     324   java -server -Xmx2g ...
 490  0.4     7852       1     /usr/bin/python /usr/bin/dstat ...
 491  0.7     7812       1     /usr/bin/python /usr/bin/dstat ...
1331  0.0     3040       1     /usr/bin/ps -AHww --format ...
1332  0.0      380       1     /usr/bin/ls --all ...
1333  0.0  6292248       1     [NDR-347]

กระบวนการ Java (pid: 357) สร้างกระบวนการลูกที่มีอายุสั้น ในเอาต์พุตข้างต้นคุณสามารถดูกระบวนการ Python 2 dstat, ps, ls และ [NDR-347] "สิ่งเหล่านี้สร้างขึ้นโดยกระบวนการ Java

บางครั้งฉันเห็นกระบวนการลูกที่ซ้ำกัน (เช่นคำสั่งเดียวกัน) แต่รหัสกระบวนการที่แตกต่างกัน (ไม่แสดง) เหตุใดฉันจึงเห็นกระบวนการลูกที่ซ้ำกัน ฉันคิดว่านี่เป็นสิ่งประดิษฐ์ Linux หรือ Docker สิ่งประดิษฐ์นั้นคืออะไร?

ฉันได้รับการตรวจสอบpsผลลัพธ์มานานกว่าหนึ่งปีแล้ว เป็นครั้งแรกที่ฉันเห็นกระบวนการพิเศษ "[NDR-347]" (pid: 1333) ด้วย RSS เกือบเหมือนกัน กระบวนการ Java (pid: 357) ตั้งชื่อเธรด "NDR- #" ดังนั้นฉันจึงพบว่าแปลกที่คำสั่งของกระบวนการลูกจะเป็นชื่อของเธรดจากกระบวนการ Java กระบวนการพิเศษสองเท่าของ RSS และก่อให้เกิดปัญหา ปัญหาไม่สามารถทำซ้ำได้ นี้แสดงให้เห็นว่าฉันว่า pid 1333 เป็นอย่างมากช่วงสั้น ๆ psและไม่ได้มีการจับโดย RSS ทั้งหมดคือ 12.07 GB และไม่มีกระบวนการพิเศษคือ 6.07 GB กระบวนการพิเศษนี้คืออะไร? ทำไมถึงมี RSS ขนาดใหญ่เช่นนี้?

แก้ไข: psคำสั่งที่แน่นอนคือ ...

ps -Ahww --format pid,%cpu,rss:8,nlwp=Threads,command

คำตอบ:


1

คุณมีกระบวนการ java ที่รันโปรแกรมอื่น

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

ขั้นตอนต่อไปforkคือexecveกระบวนการใหม่ การexecveปล่อยหน่วยความจำทั้งหมดและแมปหน่วยความจำจากโปรแกรมใหม่

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

ในกรณีของคุณโดยเฉพาะถ้าคุณรู้ว่ากระบวนการ Java ที่ถูกแยกประกอบด้วยชื่อNDR-คุณควรละเว้นกระบวนการเหล่านี้


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