ด้านบนและ ps ไม่แสดงผลลัพธ์ cpu เดียวกัน


54

นี้มีการเชื่อมโยงนี้คำถาม

เมื่อฉันเรียกใช้topฉันได้รับผลลัพธ์ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

pid 3038ใช้ 18% cpu อย่างไรก็ตามเมื่อทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์ที่ได้คือ 5.5% และจำนวนนี้ดูเหมือนจะไม่เปลี่ยนแปลงตามเวลา (เช่นเมื่อใช้คำสั่งเดียวกันในภายหลัง) ...

เป็นpsคำสั่งอย่างใดค่าเฉลี่ยการใช้งาน CPU?

คำตอบ:


87

man psในNOTESส่วน

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

และเดาว่าคุณรู้ แต่คุณสามารถทำได้:

top -p <PID>

แก้ไข : เป็นความคิดเห็นของคุณในคำตอบอื่น ๆ ;

" อืมใช่ฉันสงสัยว่าจะได้รับ (เปอร์เซ็นต์ CPU ทันที) จาก ps "

คำตอบสั้น ๆ : คุณทำไม่ได้

ทำไมถึงเป็นเช่นนั้น

มันเหมือนกับการขอให้ใครบางคนคำนวณความเร็วของรถจากภาพ

ในขณะที่topเป็นเครื่องมือตรวจสอบpsเป็นเครื่องมือภาพรวม ลองคิดแบบนี้: เมื่อใดก็ตามที่กระบวนการใช้ CPU หรือไม่ ดังนั้นคุณมีโหลด 0% หรือ 100% ในช่วงเวลาที่แน่นอน

การให้: หากpsควรให้การใช้งาน CPU แบบทันทีมันจะเป็น 0% หรือ 100%

top ในทางกลับกันเก็บตัวเลขการสำรวจและคำนวณภาระเมื่อเวลาผ่านไป

psอาจมีการใช้งานในปัจจุบัน - แต่มันจะต้องอ่านข้อมูลหลาย ๆ ครั้งและพักระหว่างการอ่านแต่ละครั้ง มันไม่ได้

การคำนวณ ps% cpu

ps คำนวณการใช้ CPU ในลักษณะดังต่อไปนี้:

uptime = ระบบเวลาทั้งหมดกำลังทำงาน
ps_time = เวลาเริ่มต้นกระบวนการวัดเป็นวินาทีจากการบูต
pu_time = กระบวนการเวลาทั้งหมดใช้ CPU

;; กระบวนการวินาทีทำงานแล้ว:
วินาที = เวลาทำงาน - ps_time
;; การใช้งาน:
cpu_usage = pu_time * 1,000 / วินาที

พิมพ์: cpu_usage / 10 "." cpu_usage% 10


ตัวอย่าง: uptime = 344,545 ps_time = 322,462 pu_time = 3,383 วินาที = 344,545 - 322,462 = 22,083 cpu_usage = 3,383 * 1,000 / 22,083 = 153 พิมพ์: 153/10 "." 153% 10 => 15.3

ดังนั้นจำนวนที่พิมพ์คือเวลากระบวนการที่ใช้ CPU ในช่วงอายุการใช้งาน ดังในตัวอย่างข้างต้น มันทำเช่นนั้นใน 15.3% ของอายุการใช้งาน ใน 84,7% ของเวลาที่ไม่ได้ทำการบั๊กกับ CPU

การดึงข้อมูล

psเช่นเดียวกับการtopใช้ข้อมูลจากไฟล์ที่เก็บไว้ภายใต้/proc/- หรือประมวลผลข้อมูลระบบไฟล์หลอก

คุณมีไฟล์บางไฟล์ในรูท/proc/ซึ่งมีข้อมูลต่าง ๆ เกี่ยวกับสถานะโดยรวมของระบบ นอกจากนี้แต่ละกระบวนการมีโฟลเดอร์ย่อยของตัวเอง/proc/<PID>/ที่จัดเก็บข้อมูลเฉพาะของกระบวนการ /proc/3038/ดังนั้นสำหรับตัวอย่างเช่นการดำเนินการจากคำถามของคุณมีโฟลเดอร์ที่

เมื่อpsคำนวณการใช้ CPU จะใช้สองไฟล์:

/ proc / uptime เวลาทำงานของระบบ (วินาที) และจำนวนเวลาที่ใช้ในกระบวนการว่าง (วินาที)
/ proc / [PID] / สถิติข้อมูลสถานะเกี่ยวกับกระบวนการ
  • จากuptimeนั้นใช้ค่าแรก ( uptime )
  • จาก[PID]/statมันใช้ต่อไปนี้:
 # ชื่อคำอธิบาย
เวลา CPU ที่ใช้งาน 14 ครั้งในรหัสผู้ใช้วัดเป็นระยะเวลาสั้น ๆ
เวลา CPU 15 ครั้งที่ใช้ในเคอร์เนลโค้ดวัดในระยะเวลาอันสั้น
เวลาซีพียู 16 ครั้งที่ใช้ในรหัสผู้ใช้รวมถึงเวลาจากเด็ก ๆ
เวลา CPU 17ststime ที่ใช้ในโค้ดเคอร์เนลรวมถึงเวลาจากชายด์ 
22 เวลาเริ่มต้นเวลาที่กระบวนการเริ่มต้นวัดในระยะเวลาอันสั้น

jiffieเป็นเห็บนาฬิกา ดังนั้นนอกจากนี้ยังใช้วิธีการต่าง ๆ เช่น., sysconf(_SC_CLK_TCK)เพื่อให้ได้ระบบของเฮิร์ตซ์ (จำนวนเห็บต่อวินาที) - ในที่สุดใช้ 100 เป็นตัวเลือกถอยกลับหลังจากหมดทางเลือกอื่น ๆ

ดังนั้นถ้าutime1234 และเฮิรตซ์เท่ากับ 100 แล้ว:

seconds = utime / Hertz = 1234 / 100 = 12.34

การคำนวณจริงทำได้โดย:

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

ตัวอย่าง (ผลลัพธ์จากสคริปต์ Bash ที่กำหนดเอง):

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

การคำนวณโหลด"ปัจจุบัน"ด้วย ps

นี่คือ (บิต?) ความพยายามที่ร่มรื่น แต่ก็โอเค ให้มีไป

หนึ่งสามารถใช้เวลาให้psและคำนวณการใช้ CPU จากนี้ เมื่อคิดเกี่ยวกับมันจริง ๆ แล้วมันอาจจะมีประโยชน์ค่อนข้างมีข้อ จำกัด บางอย่าง

นี่อาจเป็นประโยชน์ในการคำนวณการใช้ CPU ในระยะเวลานาน นั่นคือคุณต้องการตรวจสอบโหลด CPU โดยเฉลี่ยของplugin-containerใน Firefox ขณะทำงานที่เกี่ยวข้องกับ Firefox

โดยใช้ผลลัพธ์จาก:

$ ps -p -o cputime, etimes

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

ฉันใช้etimeไปetimesในตัวอย่างนี้เพื่อคำนวณให้ชัดเจนยิ่งขึ้น นอกจากนี้ฉันเพิ่ม% cpu สำหรับ "ความสนุก" ในเช่นสคริปต์ทุบตีอย่างเห็นได้ชัดจะใช้etimes- หรืออ่านได้ดีขึ้นจาก/proc/<PID>/ฯลฯ

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

กระบวนการใช้ CPU 38% ของเวลาในระหว่างช่วงเวลานี้

ดูรหัส

ถ้าคุณต้องการที่จะรู้ว่าpsมันเป็นอย่างไรและรู้ว่า C น้อยทำอย่างไร (ดูเหมือนว่าคุณเรียกใช้ Gnome Debain deriavnt) - ทัศนคติที่ดีในรหัสที่เกี่ยวกับความคิดเห็น ฯลฯ :

apt-get source procps
cd procps*/ps
vim HACKING

ฉันอาจอัปเดตด้วยข้อมูลเพิ่มเติมtopและการตรวจสอบอย่างต่อเนื่อง - หรือสแนปโดยล่าช้า aka " ps" ด้วยโหลด CPU ปัจจุบัน
Runium

2
คำตอบที่ดีจริงๆ!
Theodor

สิ่งที่เกี่ยวกับการคำนวณการใช้งาน CPU ทั้งหมดในระบบทั้งหมด เครื่องมือพยายามรับการใช้งาน CPU ผ่านสแนปชอตหรือทำการเฉลี่ยตลอดเวลาหรือไม่?
CMCDragonkai

4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).

อืมใช่ฉันสงสัยว่าจะได้รับ (เปอร์เซ็นต์ CPU ทันที) จากps
Theodor

2
คุณสามารถแยกจากตัวอย่างด้านบนtop -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil

1
น่ากลัว ฉันพบว่าawk: ไอเอ็นจีเพื่อการpidทำงานที่ดีขึ้นเช่นเดียวกับในtop -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor

1
ขอบคุณ "top -p" ดีมากฉันไม่เคยสังเกตเห็นตัวเลือกนี้เลย! อย่างไรก็ตามฉันไม่ชอบการค้นหา PID จะเกิดอะไรขึ้นถ้ามีโอกาสตัวเลขที่เหมือนกันปรากฏในส่วนหน่วยความจำฟรีหรือบางอย่าง ในระบบของฉันข้อมูลอยู่ในบรรทัดที่ 8 และคอลัมน์ที่ 9 ดังนั้นฉันจะทำอย่างไร:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.