Câu hỏi 'Real', 'user' và 'sys' có nghĩa là gì trong đầu ra của thời gian (1)?


$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

'Real', 'user' và 'sys' có nghĩa là gì trong đầu ra của thời gian?

Ý nghĩa nào có ý nghĩa khi đánh giá ứng dụng của tôi?


1345
2018-02-17 11:33


gốc


làm thế nào tôi có thể truy cập chỉ với một trong số họ? ví dụ như thời gian thực? - Mojtaba Ahmadi
@ConcernedOfTunbridgeWells - Mojtaba Ahmadi
@Casillass Real - stackoverflow.com/questions/2408981/… - ConcernedOfTunbridgeWells
Nếu chương trình của bạn thoát nhanh, không ai trong số đó có ý nghĩa, tất cả chỉ là phí khởi động. Nếu bạn muốn đo toàn bộ chương trình bằng time, hãy làm điều gì đó sẽ mất ít nhất một giây. - Peter Cordes


Các câu trả lời:


Thống kê thời gian thực, người dùng và Sys

Một trong những điều này không giống như người kia. Bất đề cập đến thời gian trôi qua thực tế; Người dùng và Sys tham khảo thời gian CPU được sử dụng chỉ bởi quá trình.

  • Thực là thời gian đồng hồ treo tường - thời gian từ lúc bắt đầu đến khi kết thúc cuộc gọi. Đây là tất cả thời gian trôi qua kể cả các lát thời gian được sử dụng bởi các quy trình khác và thời gian mà quá trình này bị chặn (ví dụ nếu nó đang đợi I / O hoàn tất).

  • Người dùng là lượng thời gian CPU đã sử dụng trong mã chế độ người dùng (bên ngoài hạt nhân) trong quá trình. Đây chỉ là thời gian CPU thực tế được sử dụng trong quá trình thực thi. Các quá trình và thời gian khác mà quá trình chi tiêu bị chặn không được tính vào con số này.

  • Sys là lượng thời gian CPU được sử dụng trong hạt nhân trong tiến trình. Điều này có nghĩa là thực hiện thời gian CPU dành cho các cuộc gọi hệ thống trong hạt nhân, trái với mã thư viện, vẫn đang chạy trong không gian người dùng. Giống như 'người dùng', đây chỉ là thời gian CPU được sử dụng bởi quá trình này. Xem bên dưới để biết mô tả ngắn gọn về chế độ hạt nhân (còn được gọi là chế độ 'người giám sát') và cơ chế gọi hệ thống.

User+Sys sẽ cho bạn biết lượng thời gian CPU thực tế mà quá trình của bạn đã sử dụng. Lưu ý rằng đây là trên tất cả các CPU, vì vậy nếu quá trình có nhiều luồng (và quá trình này đang chạy trên một máy tính có nhiều hơn một bộ xử lý) nó có khả năng vượt quá thời gian đồng hồ treo tường được báo cáo bởi Real (thường xảy ra). Lưu ý rằng trong đầu ra, các số liệu này bao gồm User và Sys thời gian của tất cả các quy trình con (và con cháu của chúng) cũng như khi chúng có thể được thu thập, ví dụ: bởi wait(2) hoặc là waitpid(2), mặc dù các cuộc gọi hệ thống cơ bản trả lại số liệu thống kê cho quy trình và các con của nó một cách riêng biệt.

Nguồn gốc của số liệu thống kê được báo cáo bởi time (1)

Số liệu thống kê được báo cáo bởi time được thu thập từ các cuộc gọi hệ thống khác nhau. 'Người dùng' và 'Sys' đến từ wait (2) hoặc là times (2), tùy thuộc vào hệ thống cụ thể. 'Real' được tính từ thời gian bắt đầu và kết thúc được thu thập từ gettimeofday (2) gọi điện. Tùy thuộc vào phiên bản của hệ thống, các thống kê khác nhau như số lượng các công tắc ngữ cảnh cũng có thể được thu thập bởi time.

Trên một máy đa xử lý, một quá trình đa luồng hoặc một quy trình rèn trẻ em có thể có thời gian trôi qua nhỏ hơn tổng thời gian của CPU - vì các luồng hoặc quy trình khác nhau có thể chạy song song. Ngoài ra, thống kê thời gian được báo cáo đến từ các nguồn gốc khác nhau, do đó thời gian được ghi lại cho các tác vụ chạy rất ngắn có thể bị lỗi làm tròn, như ví dụ được đưa ra bởi áp phích gốc cho thấy.

Giới thiệu tóm tắt về chế độ Kernel vs. User 

Trên Unix, hoặc bất kỳ hệ điều hành bộ nhớ được bảo vệ nào, 'Kernel' hoặc 'Supervisor' chế độ đề cập đến một chế độ đặc quyền CPU có thể hoạt động. Một số hành động đặc quyền có thể ảnh hưởng đến bảo mật hoặc sự ổn định chỉ có thể được thực hiện khi CPU đang hoạt động ở chế độ này; những hành động này không có sẵn cho mã ứng dụng. Một ví dụ về hành động như vậy có thể là thao tác của MMU để truy cập vào không gian địa chỉ của một tiến trình khác. Thông thường, chế độ người dùng mã không thể làm điều này (với lý do chính đáng), mặc dù nó có thể yêu cầu bộ nhớ dùng chung từ hạt nhân, có thể được đọc hoặc viết bởi nhiều quá trình. Trong trường hợp này, bộ nhớ chia sẻ được yêu cầu một cách rõ ràng từ hạt nhân thông qua một cơ chế bảo mật và cả hai quy trình phải đính kèm một cách rõ ràng vào nó để sử dụng nó.

Chế độ đặc quyền thường được gọi là chế độ 'hạt nhân' vì hạt nhân được thực thi bởi CPU đang chạy trong chế độ này. Để chuyển sang chế độ hạt nhân, bạn phải đưa ra một hướng dẫn cụ thể (thường được gọi là bẩy) chuyển CPU sang chế độ hạt nhân và chạy mã từ một vị trí cụ thể được tổ chức trong một bảng nhảy.  Vì lý do bảo mật, bạn không thể chuyển sang chế độ lõi và thực thi mã tùy ý - các bẫy được quản lý thông qua một bảng các địa chỉ không thể ghi vào trừ khi CPU đang chạy trong chế độ giám sát. Bạn bẫy với một số bẫy rõ ràng và địa chỉ được nhìn lên trong bảng nhảy; hạt nhân có một số điểm kiểm soát hữu hạn.

Các cuộc gọi 'hệ thống' trong thư viện C (đặc biệt là những người được mô tả trong Phần 2 của trang người đàn ông) có một thành phần chế độ người dùng, đó là những gì bạn thực sự gọi từ chương trình C của bạn. Phía sau hậu trường, họ có thể phát ra một hoặc nhiều cuộc gọi hệ thống tới hạt nhân để thực hiện các dịch vụ cụ thể như I / O, nhưng họ vẫn còn có mã đang chạy trong chế độ người dùng. Nó cũng khá có thể trực tiếp phát hành một cái bẫy để chế độ hạt nhân từ bất kỳ mã không gian người dùng nếu muốn, mặc dù bạn có thể cần phải viết một đoạn của ngôn ngữ lắp ráp để thiết lập các thanh ghi chính xác cho cuộc gọi. Một trang mô tả các cuộc gọi hệ thống được cung cấp bởi hạt nhân Linux và các quy ước để thiết lập sổ đăng ký có thể được tìm thấy đây.

Thông tin thêm về 'sys' 

Có những thứ mà mã của bạn không thể làm từ chế độ người dùng - những thứ như cấp phát bộ nhớ hoặc truy cập phần cứng (HDD, mạng, v.v.). Đây là dưới sự giám sát của hạt nhân, và nó một mình có thể làm chúng. Một số hoạt động mà bạn thực hiện (như malloc hoặc làfread/fwrite) sẽ gọi các hàm Kernel này và sau đó sẽ được tính là thời gian 'sys'. Thật không may nó không đơn giản như "mọi cuộc gọi đến malloc sẽ được tính trong thời gian 'sys'. Cuộc gọi đến malloc sẽ làm một số xử lý của riêng mình (vẫn được tính trong thời gian 'người dùng') và sau đó một nơi nào đó dọc theo cách nó có thể gọi các chức năng trong hạt nhân (tính trong thời gian 'sys'). Sau khi trở về từ cuộc gọi hạt nhân, sẽ có thêm thời gian trong 'người dùng' và sau đó malloc sẽ trở lại mã của bạn. Đối với khi chuyển đổi xảy ra, và bao nhiêu của nó được chi tiêu trong chế độ hạt nhân ... bạn không thể nói. Nó phụ thuộc vào việc thực hiện các thư viện. Ngoài ra, các chức năng dường như vô tội khác cũng có thể sử dụng malloc và những thứ tương tự trong nền, một lần nữa sẽ có thời gian trong 'sys'.


1613
2018-04-29 05:29



Thời gian của các quá trình con có được tính vào thực tế / sys không? - ron
@ron - Theo trang người dùng Linux, nó tổng hợp thời gian 'c' với thời gian xử lý, vì vậy tôi nghĩ là vậy. Thời gian cha mẹ và thời gian con có sẵn riêng biệt với thời gian (2) cuộc gọi, mặc dù. Tôi đoán phiên bản Solaris / SysV của thời gian (1) làm một cái gì đó tương tự. - ConcernedOfTunbridgeWells
User + Sys cho phép bạn đo mức sử dụng CPU của một quá trình. Bạn có thể sử dụng nó để chuẩn hiệu suất. Điều này đặc biệt hữu ích đối với mã đa luồng có nhiều hơn một lõi CPU có thể đang làm việc trên một tính toán. - ConcernedOfTunbridgeWells
Không chính xác về chủ đề, tuy nhiên: Chạy "\ time <cmd>" là thú vị - nó cung cấp thêm chi tiết: (tha thứ cho định dạng kém trong nhận xét): $ time ps PID TTY THỜI GIAN CMD 9437 pts / 19 00:00:00 bash 11459 pts / 19 00:00:00 ps 0m0.025s thực sự của người dùng 0m0.004s sys 0m0.018s $ \ thời gian ps PID THỜI GIAN TỪ CMD 9437 pts / 19 00:00:00 bash 11461 pts / 19 00:00:00 thời gian 11462 pts / 19 00:00:00 ps 0.00user 0.01system 0: 00.02elapsed 95% CPU (0avgtext + 0avgdata 2160maxresident) k 0inputs + 0outputs (0major + 103minor) pagefaults 0swaps $ - kaiwan
(Ran ra khỏi ký tự trong bình luận trước như vậy): Chi tiết hơn? Sử dụng perf [1], [2]. [1] perf.wiki.kernel.org/index.php/Main_Page [2] brendangregg.com/perf.html - kaiwan


Mở rộng trên câu trả lời được chấp nhận, Tôi chỉ muốn cung cấp một lý do khác tại sao real ≠ user + sys.

Hãy nhớ rằng real đại diện cho thời gian trôi qua thực tế, trong khi user và sys giá trị đại diện cho thời gian thực hiện CPU. Kết quả là, trên một hệ thống đa lõi, user và / hoặc sys thời gian (cũng như số tiền của họ) có thể thực sự quá thời gian thực. Ví dụ, trên một ứng dụng Java tôi đang chạy cho lớp tôi nhận được tập hợp các giá trị này:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

214
2017-11-05 04:34



Tôi luôn tự hỏi về điều này. Vì tôi biết rằng các chương trình của tôi là đơn luồng, sự khác biệt giữa người dùng và thời gian thực phải là VM overhead, đúng không? - Quantum7
không cần thiết; Sun JVM trên các máy Solaris cũng như JVM của Apple trên Mac OS X quản lý sử dụng nhiều hơn một lõi ngay cả trong các ứng dụng đơn luồng. Nếu bạn làm một mẫu của một quá trình java, bạn sẽ thấy rằng những thứ như bộ sưu tập rác chạy trên chủ đề riêng biệt (và một số công cụ khác quá mà tôi không nhớ ra khỏi đỉnh đầu của tôi). Tôi không biết nếu bạn thực sự muốn hạn rằng "VM trên không" mặc dù. - lensovet
Tôi đoán số lượng phiếu bầu đã cho bạn đủ danh tiếng bây giờ: D. Vậy bạn nghĩ gì về real vượt quá user và sys toàn bộ ? Phí trên hệ điều hành như chuyển đổi ngữ cảnh luồng có thể là? - Muhammad Gelbana
Một vấn đề tiềm năng khác có thể là I / O: nếu ứng dụng của bạn dành nhiều thời gian chờ đợi để nhận tệp hoặc luồng, thì rõ ràng thời gian thực sẽ vượt quá thời gian người dùng / sys vì không có thời gian CPU nào được sử dụng trong khi chờ truy cập vào một tập tin hoặc một cái gì đó tương tự. - lensovet
@MuhammadGelbana - điều này có thể xảy ra nếu ứng dụng bị chặn thực thi vì bất kỳ lý do gì. Ví dụ, nếu nó đang chờ đợi trên I / O, IPC hoặc kết nối socket nó sẽ ngồi nhàn rỗi, tích lũy không có thời gian CPU cho đến khi cuộc gọi chặn trả về. - ConcernedOfTunbridgeWells


Real hiển thị tổng thời gian quay vòng cho một quá trình; trong khi Người dùng hiển thị thời gian thực hiện cho các hướng dẫn do người dùng xác định và Sys là thời gian để thực hiện các cuộc gọi hệ thống!

Thời gian thực bao gồm thời gian chờ đợi (thời gian chờ đợi cho I / O, v.v.)


14
2017-11-24 19:05





thực: Thời gian thực tế dành cho việc chạy quá trình từ đầu đến cuối, như thể nó được đo bởi một người có đồng hồ bấm giờ

người dùng: Thời gian tích luỹ của tất cả các CPU trong quá trình tính toán

sys: Thời gian tích lũy của tất cả các CPU trong các tác vụ liên quan đến hệ thống chẳng hạn như cấp phát bộ nhớ.

Lưu ý rằng đôi khi người dùng + sys có thể lớn hơn thực, như   nhiều bộ xử lý có thể hoạt động song song.


6



sys là thời gian CPU dành cho cuộc gọi hệ thống (và trình xử lý lỗi trang?) - Peter Cordes
real thường được mô tả là "đồng hồ treo tường" thời gian. - Peter Cordes