อะไรคือวิธีที่ยุติธรรมที่สุดในการตรวจสอบเวลา CPU ทั้งหมด - ต่อผู้ใช้หนึ่งราย


25

ในระบบผู้ใช้หลายคนฉันต้องการวัดการใช้งาน CPU ของผู้ใช้แต่ละคนในไม่กี่วินาทีของเวลา cpu สำหรับจุดประสงค์ของการวัดนี้ฉันคิดว่าถ้า PID เป็นของผู้ใช้ผู้ใช้รายนี้ทำให้เวลา CPU - นั่นคือฉันไม่สนใจ daemons และเคอร์เนล

ขณะนี้ฉันกำลังทำเช่นนี้ทุกห้าวินาที:

  1. รับผู้ใช้แต่ละคนและ PID ที่พวกเขากำลังทำงานผ่าน ps aux
  2. สำหรับ PID แต่ละอันจะได้รับxผลรวมของช่วงเวลาเวลาที่ใช้จำนวนเงินที่มีค่าจำนวนเงินค่าลงจำนวนและจำนวนครั้ง/proc/[pid]/stat
  3. คำนวณt = x / interval(ช่วงเวลาไม่เสมอว่า 5 วินาทีเมื่อโหลดสูง)

ถ้าฉันทำสิ่งนี้ฉันจะได้รับค่าที่สมเหตุสมผล ตัวอย่างเช่น: ผู้ใช้ในระบบนี้หมุนเป็นไพ ธ อน ( while True: pass) และระบบแสดงรอบเวลา CPU ประมาณ 750 มิลลิวินาทีต่อวินาที เมื่อระบบหยุดทำงานสักครู่ระบบจะรายงาน 1600 มิลลิวินาทีเป็นเวลา 1 วินาที ซึ่งดูเหมือนจะเกี่ยวกับสิ่งที่ถูกต้อง แต่ฉัน undestand ว่าค่าเหล่านี้สามารถหลอกลวงโดยเฉพาะอย่างยิ่งเมื่อฉันไม่เข้าใจพวกเขาจริงๆ

ดังนั้นคำถามของฉันคือ:

อะไรคือวิธีที่ยุติธรรมและถูกต้องในการวัดโหลดซีพียูตามจำนวนผู้ใช้

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

ขณะนี้อาจมีความซับซ้อนฉันรู้ว่ามันเป็นไปได้ นี่คือจุดเริ่มต้นของฉัน:

เคอร์เนลติดตามเวลาสร้างกระบวนการรวมถึงเวลา CPU ที่ใช้ในช่วงอายุการใช้งาน นาฬิกาติ๊กแต่ละตัวเคอร์เนลจะอัปเดตจำนวนเวลาเป็นระยะเวลาสั้น ๆ ซึ่งกระบวนการปัจจุบันใช้ในระบบและในโหมดผู้ใช้ - (จากโครงการเอกสารลินุกซ์ )

ค่าที่ฉันตามมาคือจำนวนวินาที (หรือระยะเวลาอันสั้น) ที่ผู้ใช้ใช้กับ CPU ไม่ใช่เปอร์เซ็นต์ของการโหลดระบบหรือการใช้งาน cpu

เป็นสิ่งสำคัญที่เราต้องวัดเวลาของ CPU ในขณะที่กระบวนการยังทำงานอยู่ กระบวนการบางอย่างจะใช้เวลาเพียงครึ่งวินาทีเท่านั้นกระบวนการบางอย่างจะใช้เวลานานหลายเดือนและเราจำเป็นต้องตรวจสอบทั้งสองประเภทเพื่อให้เราสามารถพิจารณาเวลา CPU ของผู้ใช้ด้วยความละเอียดระดับละเอียด


1
500 ชื่อเสียง: โอกาสที่ดีสำหรับผู้เริ่มต้น
Tachyons

นิดหน่อยจากลีกของฉัน แต่เป็นคำถามที่น่าสนใจมากดังนั้นฉันจึงขุดและพบสิ่งที่ฉันหวังว่าอย่างน้อยก็มีประโยชน์ที่จะช่วยคุณแก้ปัญหานี้: stackoverflow.com/a/1424556/905573
kingmilo

1
คุณรู้หรือไม่topสามารถทำโหมดแบทช์? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'ควรแสดงโหลดสำหรับ {user} ในขณะนั้น
Rinzwind

คำตอบ:


11

ดูเหมือนว่าคุณต้องการบัญชีกระบวนการ

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

บน Ubuntu เครื่องมือการบัญชีกระบวนการอยู่ในacctแพ็คเกจ ติดตั้ง acct

หากต้องการรับรายงานต่อผู้ใช้ให้เรียกใช้

sa -m

น่าเสียดายที่วิธีนี้ใช้ไม่ได้สำหรับฉันเพราะ "sa" จะไม่นับกระบวนการที่ใช้เวลานาน สิ่งที่ฉันต้องการ (ฉันคิดว่า) เป็นวิธีการตรวจสอบกระบวนการที่กำลังเริ่มต้นและสิ้นสุดและเพื่อบันทึกเวลาซีพียูของพวกเขาเมื่อพวกเขาออกจากเช่นเดียวกับในขณะที่พวกเขากำลังทำงาน
Stefano Palazzo

@StefanoPalazzo ฉันเชื่อว่านี่เป็นสิ่งที่ดีที่สุดที่คุณจะได้รับ /proc/[pid]/statเพิ่มมันมีเวลาสำหรับกระบวนการทำงานจาก
ændrük

มันจะเปิดออกมันก็ดูเหมือนว่าส่วนใหญ่กระบวนการทั้งหมดจะนำมาใช้อย่างถูกต้องโดยsa (.ps.gz) และฉันก็มีวิธีที่ดีในการ "ประเมิน" กระบวนการที่ใช้เวลานานเหล่านั้นก่อนที่จะได้รับคุณค่าที่ถูกต้องสำหรับกระบวนการเหล่านั้นในที่สุด ดังนั้นเราจะใช้มันหลังจากทั้งหมดและฉันมีความสุขมากกว่าที่จะได้รับรางวัลเงินรางวัลสำหรับคำตอบของคุณ ขอบคุณมัด!
Stefano Palazzo

3

สิ่งนี้จะให้บรรทัดสำหรับผู้ใช้แต่ละคนที่แสดงชื่อผู้ใช้และเวลาซีพียูทั้งหมด:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done

2

หนึ่งในคำตอบที่ชัดเจนยิ่งขึ้นคือการขยายสิ่งที่คุณทำอยู่ในขณะนี้

ฉันเจอกระบวนการตรวจสอบนี้สำหรับการใช้ bash scripting และ mysql เพื่อติดตามเวลา cpu ของผู้ใช้ แต่มันขยายไปทั่วกรอบเวลาที่ใหญ่กว่าที่คุณพูดถึง

หวังว่านี่จะช่วยให้คุณมีแนวคิดเพิ่มเติมเกี่ยวกับทิศทางที่คุณต้องการจะเข้ามา

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm


0

สิ่งนี้จะจัดการกระบวนการที่ทำงานมาหลายวันแล้ว .. ไม่แน่ใจว่าจะขยายเป็นอย่างไรต่อสัปดาห์ / เดือน / ปี ..

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.