ฉันจะตรวจสอบการใช้งาน CPU โดยผู้ใช้ได้อย่างไร


15

ฉันต้องตรวจสอบการใช้งาน CPU โดยผู้ใช้เซิร์ฟเวอร์สองเครื่อง (Ubuntu และ CentOS) ตัวอย่างเช่น:

user1     5%
user2    10%
...

มีเครื่องมือคล้ายtopหรือhtopว่าสามารถทำเช่นนั้น?


คุณต้องการอันดับสูงสุดที่จะแสดงในเวลาจริงหรือไม่? มิฉะนั้นคุณสามารถพิจารณาtop -u userและเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์จากนั้นตรวจสอบผู้ใช้รายอื่น จากนั้นคุณจะมีการตรวจสอบการใช้ proc สำหรับผู้ใช้ของคุณในช่วงเวลาที่กำหนด
Laurent C.

เมื่อคุณพูดว่าตรวจสอบในช่วงเวลาใด? นาน ๆ ครั้งหรือต่อเนื่อง?
slm

ฉันหวังว่าจะสามารถตรวจสอบผู้ใช้แบบเรียลไทม์เหมือนบนสุด
แก้ไข Rustom

คำตอบ:


17

นี่คือสคริปต์สำหรับพิมพ์การใช้งาน CPU ทั้งหมดสำหรับผู้ใช้แต่ละคนที่เข้าสู่ระบบในปัจจุบันshowPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(who | awk '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

และนี่เป็นรุ่นที่ปรับเปลี่ยนเล็กน้อยสำหรับการพิมพ์การใช้งาน CPU ของผู้ใช้ที่มีอยู่ทั้งหมด (แต่ข้ามการใช้งาน CPU ที่มีค่าเป็นศูนย์), showAllPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(getent passwd | awk -F ":" '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { if (sum > 0.0) print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

คอลัมน์แรกแสดงถึงชื่อผู้ใช้คอลัมน์ที่สองของการใช้ CPU ที่รวบรวมและคอลัมน์ที่สามที่ CPU ที่ใช้เป็นมาตรฐานตามจำนวนแกน CPU

นอกจากนี้ยังมีสคริปต์ที่เกี่ยวข้องสำหรับการแสดงการใช้หน่วยความจำทั้งหมดสำหรับผู้ใช้แต่ละคน: showPerUserMem.sh

สำหรับการตรวจสอบสดเพียงแค่รันสคริปต์เหล่านี้เป็นระยะ ๆ ผ่านทาง watchคำสั่ง

สำหรับการเรียงลำดับตามการใช้งาน CPU sort -k2 -nrท่อออกไป


1
ทำไมคุณกำลังผสมตัวแปร bash env กับตัวแปรสคริปต์หมายความว่ามี $ USER อยู่แล้วแม้ตัวแปร caps ทั้งหมดจะเป็น env ไม่ใช่หรือ
ราหุลปาติล

ฉันไม่คิดว่าตัวแปรตัวพิมพ์ใหญ่ทั้งหมดจะต้องเป็นตัวแปรสภาพแวดล้อม แต่ฉันยอมรับว่าการเขียนทับตัวแปรที่มีอยู่แล้วนั้นไม่ใช่สไตล์ที่ดีมาก
scai

1
โดยทั่วไปแล้วมันเป็นความคิดที่ดีที่จะใช้ UPPERCASE ในการทุบตีเพราะเหตุผลที่ราหุลกล่าวถึง มันยิ่งเลวร้ายลงเมื่อคุณใช้ชื่อตัวแปรที่มีอยู่แล้วในสภาพแวดล้อม (n ทุบตี$USERเป็นชื่อผู้ใช้ของคุณแล้วดังนั้นจึงเหมือนกับid -nuคำสั่งที่คุณใช้อยู่ฉันแก้ไขโพสต์ของคุณเพื่อเปลี่ยนแปลงสิ่งนี้
terdon

การใช้ตัวแปรตัวพิมพ์ใหญ่ในเชลล์สคริปต์นั้นไม่ใช่ความคิดที่ผิดเนื่องจากเก้าในสิบสคริปต์ใน/etc/init.d/ไดเรกทอรีของฉันกำลังทำสิ่งนี้เช่นกัน ควรหลีกเลี่ยงการเขียนทับตัวแปรสภาพแวดล้อมที่มีอยู่ในทางตรงกันข้าม
scai

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