จับเวลาโปรแกรม


2

ฉันกำลังเหลือโปรแกรมในเซิร์ฟเวอร์ลินุกซ์เช่นเดียวกับระยะเวลาการใช้งานในขณะนี้โดยคำสั่งเวลา

เมื่อดูผลลัพธ์สุดท้ายฉันสับสนเพราะฉันคิดว่า "real = sys + user" หรืออย่างน้อยก็เก็บไว้โดยประมาณ เอาท์พุทที่นี่มา

จริง 189m6.807s

ผู้ใช้ 1173m6.203s

sys 3m6.508s

"sys + user" วัดเป็นหน่วยต่างจาก "ของจริง" หรือไม่?

ทำไม "ผู้ใช้" จึงใหญ่กว่า "ของจริง" มาก? ไม่ควรเล็กกว่านี้หรือ

ฉันยอมรับว่าฉันไม่เข้าใจเวลาเหล่านั้นจริงอย่างที่คิด ดังนั้นคำอธิบายใด ๆ ที่ชื่นชม!

คำตอบ:


3

คุณมีอย่างน้อยเจ็ด (อาจแปด;) แกนในคอมพิวเตอร์ของคุณ มัน "เท่านั้น" ใช้เวลารวมทั้งหมด 189 นาที แต่ในช่วงเวลาเหล่านั้น 189 นาทีมันทำงานบนแกนจำนวนมากในเวลาเดียวกัน

นี่รวมอยู่ในบทความของโจ:

บนเครื่องที่มีโปรเซสเซอร์หลายตัวกระบวนการแบบมัลติเธรดหรือกระบวนการฟอร์กกิ้งเด็กอาจมีเวลาที่ผ่านไปน้อยกว่าเวลา CPU ทั้งหมด - เนื่องจากเธรดหรือกระบวนการต่าง ๆ อาจทำงานแบบขนาน


7

สถิติเวลาดำเนินการจริงผู้ใช้และ Sys

หนึ่งในสิ่งเหล่านี้ไม่เหมือนกัน จริงหมายถึงเวลาที่ผ่านไปจริง ผู้ใช้และ Sys อ้างถึงเวลา CPU ที่ใช้โดยกระบวนการเท่านั้น

* ของจริงคือเวลานาฬิกาแขวน - เวลาตั้งแต่ต้นจนจบการโทร นี่เป็นเวลาที่ผ่านไปทั้งหมดรวมถึงตัวแบ่งเวลาที่ใช้โดยกระบวนการอื่นและเวลาที่กระบวนการใช้บล็อก (ตัวอย่างเช่นถ้ารอ I / O ให้เสร็จ)

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

* Sysคือจำนวนเวลา CPU ที่ใช้ในเคอร์เนลภายในกระบวนการ นี่หมายถึงการประมวลผลเวลา CPU ที่ใช้ในการเรียกใช้ระบบภายในเคอร์เนลซึ่งตรงข้ามกับรหัสห้องสมุดซึ่งยังคงทำงานในพื้นที่ผู้ใช้ เช่นเดียวกับ 'ผู้ใช้' นี่เป็นเพียงเวลา CPU ที่ใช้โดยกระบวนการ ดูคำอธิบายสั้น ๆ ของโหมดเคอร์เนล (เรียกอีกอย่างว่าโหมด 'ผู้ควบคุม') และกลไกการเรียกระบบ

User + Sys จะบอกคุณว่า CPU ของคุณใช้เวลาเท่าไรในกระบวนการของคุณ

ต้นกำเนิดของสถิติที่รายงานตามเวลา (1)

สถิติที่รายงานตามเวลาจะถูกรวบรวมจากการเรียกใช้ระบบต่างๆ 'ผู้ใช้' และ 'Sys' มาจากการรอ (2) หรือเวลา (2) ขึ้นอยู่กับระบบเฉพาะ 'ของจริง' คำนวณจากเวลาเริ่มต้นและสิ้นสุดที่รวบรวมจากการโทร gettimeofday (2) ขึ้นอยู่กับรุ่นของระบบสถิติอื่น ๆ เช่นจำนวนของการสลับบริบทอาจถูกรวบรวมตามเวลา

บนเครื่องที่มีโปรเซสเซอร์หลายตัวกระบวนการแบบมัลติเธรดหรือกระบวนการฟอร์กกิ้งเด็กอาจมีเวลาที่ผ่านไปน้อยกว่าเวลา CPU ทั้งหมด - เนื่องจากเธรดหรือกระบวนการต่าง ๆ อาจทำงานแบบขนาน นอกจากนี้สถิติเวลาที่รายงานมาจากแหล่งกำเนิดที่แตกต่างกันดังนั้นเวลาที่บันทึกไว้สำหรับงานที่สั้นมากอาจมีข้อผิดพลาดในการปัดเศษตามตัวอย่างที่แสดงโดยผู้ลงประกาศดั้งเดิม

ไพรเมอร์แบบย่อใน Kernel vs. โหมดผู้ใช้

ในยูนิกซ์หรือระบบปฏิบัติการหน่วยความจำที่ได้รับการป้องกันโหมด 'Kernel' หรือ 'Supervisor' หมายถึงโหมดสิทธิพิเศษที่ CPU สามารถใช้งานได้การดำเนินการพิเศษที่อาจส่งผลต่อความปลอดภัยหรือเสถียรภาพสามารถทำได้เฉพาะเมื่อ CPU ทำงานใน โหมดนี้ การกระทำเหล่านี้ไม่สามารถใช้ได้กับรหัสแอปพลิเคชัน ตัวอย่างของการกระทำดังกล่าวอาจเป็นการจัดการ MMU เพื่อเข้าถึงพื้นที่ที่อยู่ของกระบวนการอื่น โดยทั่วไปรหัสโหมดผู้ใช้ไม่สามารถทำได้ (ด้วยเหตุผลที่ดี) แม้ว่าจะสามารถขอหน่วยความจำที่ใช้ร่วมกันจากเคอร์เนลซึ่งสามารถอ่านหรือเขียนได้มากกว่าหนึ่งกระบวนการ ในกรณีนี้หน่วยความจำที่ใช้ร่วมกันจะถูกร้องขออย่างชัดเจนจากเคอร์เนลผ่านทาง mechansm ที่ปลอดภัยและกระบวนการทั้งสองจะต้องแนบกับมันอย่างชัดเจนเพื่อที่จะใช้มัน

โหมดสิทธิพิเศษมักจะเรียกว่าโหมด 'เคอร์เนล' เนื่องจากเคอร์เนลจะถูกดำเนินการโดย CPU ที่ทำงานในโหมดนี้ ในการเปลี่ยนไปใช้โหมดเคอร์เนลคุณต้องออกคำสั่งเฉพาะ (มักเรียกว่ากับดัก ) ซึ่งจะเปลี่ยน CPU ให้ทำงานในโหมดเคอร์เนลและเรียกใช้รหัสจากตำแหน่งที่ระบุ เพื่อเหตุผลด้านความปลอดภัยคุณไม่สามารถเปลี่ยนไปใช้โหมดเคอร์เนลและเรียกใช้รหัสโดยพลการ - กับดักถูกจัดการผ่านตารางที่อยู่ที่ไม่สามารถเขียนได้เว้นแต่ว่า CPU กำลังทำงานในโหมดผู้ดูแล

การเรียก 'system' ใน C libary (โดยเฉพาะที่อธิบายไว้ในส่วนที่ 2 ของ man pages) มีองค์ประกอบโหมดผู้ใช้ซึ่งเป็นสิ่งที่คุณเรียกจากโปรแกรม C ของคุณ เบื้องหลังอาจมีการเรียกใช้ระบบหนึ่งครั้งหรือมากกว่าไปยังเคอร์เนลเพื่อทำบริการเฉพาะเช่น I / O แต่พวกเขายังคงมีรหัสที่ใช้ในโหมดผู้ใช้ นอกจากนี้ยังเป็นไปได้ค่อนข้างที่จะออกกับดักโดยตรงไปยังโหมดเคอร์เนลจากรหัสพื้นที่ผู้ใช้ใด ๆ หากต้องการแม้ว่าคุณอาจจะต้องเขียนตัวอย่างของภาษาประกอบเพื่อตั้งค่าการลงทะเบียนอย่างถูกต้องสำหรับการโทร หน้าอธิบายสายระบบที่มีให้โดยเคอร์เนลลินุกซ์และการประชุมสำหรับการตั้งค่าการลงทะเบียนสามารถพบได้ที่นี่

ข้อมูลเพิ่มเติม

เพื่อชี้แจงเกี่ยวกับ 'sys': มีบางสิ่งที่รหัสของคุณไม่สามารถทำได้จากโหมดผู้ใช้ - สิ่งต่าง ๆ เช่นการจัดสรรหน่วยความจำหรือการเข้าถึงฮาร์ดแวร์ (HDD, เครือข่าย ฯลฯ ) สิ่งเหล่านี้อยู่ภายใต้การดูแลของเคอร์เนล การดำเนินการบางอย่างที่คุณทำ (เช่น malloc หรือ fread / fwrite) จะเรียกใช้ฟังก์ชันเคอร์เนลเหล่านี้และจากนั้นจะนับเป็นเวลา 'sys' น่าเสียดายที่มันไม่ง่ายเหมือน "การเรียกไปที่ malloc ทุกครั้งจะถูกนับในเวลา 'sys'" การเรียกใช้ malloc จะทำการประมวลผลของตัวเอง (ยังคงนับในเวลา 'ผู้ใช้') และจากนั้นบางแห่งระหว่างการเรียกใช้ฟังก์ชันในเคอร์เนล (นับในเวลา 'sys') หลังจากกลับมาจากการเรียกเคอร์เนลจะมีเวลาอีกใน 'ผู้ใช้' แล้ว malloc จะกลับไปที่รหัสของคุณ เมื่อสวิตช์เกิดขึ้นและใช้ไปเท่าใดในโหมดเคอร์เนลคุณไม่สามารถพูดได้ มันขึ้นอยู่กับการใช้งานของห้องสมุด นอกจากนี้ฟังก์ชั่นไร้เดียงสาอื่น ๆ ที่ดูเหมือนว่าจะใช้ malloc และสิ่งที่คล้ายกันในพื้นหลังซึ่งจะมีเวลาอีกครั้งใน 'sys'

ที่มา: ที่นี่

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