ในระบบผู้ใช้หลายคนฉันต้องการวัดการใช้งาน CPU ของผู้ใช้แต่ละคนในไม่กี่วินาทีของเวลา cpu สำหรับจุดประสงค์ของการวัดนี้ฉันคิดว่าถ้า PID เป็นของผู้ใช้ผู้ใช้รายนี้ทำให้เวลา CPU - นั่นคือฉันไม่สนใจ daemons และเคอร์เนล
ขณะนี้ฉันกำลังทำเช่นนี้ทุกห้าวินาที:
- รับผู้ใช้แต่ละคนและ PID ที่พวกเขากำลังทำงานผ่าน
ps aux
- สำหรับ PID แต่ละอันจะได้รับ
x
ผลรวมของช่วงเวลาเวลาที่ใช้จำนวนเงินที่มีค่าจำนวนเงินค่าลงจำนวนและจำนวนครั้ง/proc/[pid]/stat
- คำนวณ
t = x / interval
(ช่วงเวลาไม่เสมอว่า 5 วินาทีเมื่อโหลดสูง)
ถ้าฉันทำสิ่งนี้ฉันจะได้รับค่าที่สมเหตุสมผล ตัวอย่างเช่น: ผู้ใช้ในระบบนี้หมุนเป็นไพ ธ อน ( while True: pass
) และระบบแสดงรอบเวลา CPU ประมาณ 750 มิลลิวินาทีต่อวินาที เมื่อระบบหยุดทำงานสักครู่ระบบจะรายงาน 1600 มิลลิวินาทีเป็นเวลา 1 วินาที ซึ่งดูเหมือนจะเกี่ยวกับสิ่งที่ถูกต้อง แต่ฉัน undestand ว่าค่าเหล่านี้สามารถหลอกลวงโดยเฉพาะอย่างยิ่งเมื่อฉันไม่เข้าใจพวกเขาจริงๆ
ดังนั้นคำถามของฉันคือ:
อะไรคือวิธีที่ยุติธรรมและถูกต้องในการวัดโหลดซีพียูตามจำนวนผู้ใช้
วิธีการนั้นค่อนข้างแม่นยำ อาจมีผู้ใช้หลายร้อยรายในระบบนี้ดังนั้นการดึงเปอร์เซ็นต์จากps aux
จะไม่แม่นยำพอโดยเฉพาะอย่างยิ่งสำหรับเธรดที่มีอายุสั้นซึ่งซอฟต์แวร์หลายชิ้นต้องการวางไข่
ขณะนี้อาจมีความซับซ้อนฉันรู้ว่ามันเป็นไปได้ นี่คือจุดเริ่มต้นของฉัน:
เคอร์เนลติดตามเวลาสร้างกระบวนการรวมถึงเวลา CPU ที่ใช้ในช่วงอายุการใช้งาน นาฬิกาติ๊กแต่ละตัวเคอร์เนลจะอัปเดตจำนวนเวลาเป็นระยะเวลาสั้น ๆ ซึ่งกระบวนการปัจจุบันใช้ในระบบและในโหมดผู้ใช้ - (จากโครงการเอกสารลินุกซ์ )
ค่าที่ฉันตามมาคือจำนวนวินาที (หรือระยะเวลาอันสั้น) ที่ผู้ใช้ใช้กับ CPU ไม่ใช่เปอร์เซ็นต์ของการโหลดระบบหรือการใช้งาน cpu
เป็นสิ่งสำคัญที่เราต้องวัดเวลาของ CPU ในขณะที่กระบวนการยังทำงานอยู่ กระบวนการบางอย่างจะใช้เวลาเพียงครึ่งวินาทีเท่านั้นกระบวนการบางอย่างจะใช้เวลานานหลายเดือนและเราจำเป็นต้องตรวจสอบทั้งสองประเภทเพื่อให้เราสามารถพิจารณาเวลา CPU ของผู้ใช้ด้วยความละเอียดระดับละเอียด
top
สามารถทำโหมดแบทช์? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
ควรแสดงโหลดสำหรับ {user} ในขณะนั้น