中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Linux上使用Time統計程序運行時間

發布時間:2021-09-16 22:20:38 來源:億速云 閱讀:166 作者:chen 欄目:系統運維

這篇文章主要講解了“在Linux上使用Time統計程序運行時間”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“在Linux上使用Time統計程序運行時間”吧!

1 基礎用法詳解

先來看下最基礎的用法,也可能是大家最常見的用法了

root@chopin:~$ time find . -name "chopin.txt" ...... real   0m0.174s user   0m0.084s sys    0m0.084s

可以很清楚看到,find 命令執行的時間為 0.174s,是不是很簡單,很方便呢

不過,time 命令輸出了三個參數,我們只用到了第一個參數,其它兩個參數代表什么含義呢?

這里我來解釋一下:

  • real:表示的是墻上時間,說白了,其實就是從程序運行開始到結束所經歷的時間;

  • user:表示程序運行期間,cpu 在用戶態所花費的時間;

  • sys:表示程序運行期間,cpu 在內核態所花費的時間;

細心的讀者會發現,上述案例中的 user + sys 不等于 real,這是怎么回事呢?

其實上邊解釋的 user 和 sys,是 cpu 執行指令所消耗的時間,并不包含:進程阻塞 IO、調度排隊,這些非 cpu 運行時間。

案例中 find 執行查找文件過程中,會有磁盤 IO 讀取,這時 cpu 會被釋放出來干別的事情,這些 IO 消耗的時間,是不包含在 user 和 sys  統計數據中,所以就出現了 real 時間大于 user + sys 了。

再通過一個示例來驗證并加強我們的理解

root@chopin:~$ time sleep 2 real   0m2.001s user   0m0.000s sys    0m0.000s

可以清楚地看到,sleep 命令基本上沒有消耗 cpu,程序真實的運行時間就是 2 秒

那我們是不是可以得出如下結論了呢:

real >= user + sys

其實這個結論在單個 cpu 情況下,是正確的。

如果服務器是多個 cpu,你的程序正好可以將多個 cpu 充分利用起來,程序運行期間是多核心并行的,那么 user + sys 統計的 cpu  時間可能就會大于 real 時間啦

所以這 3 個時間之間的關系并不是恒定的,你需要清楚的了解服務器是否為多個核心。

通過統計到的 cpu 消耗時間,我們也可以大概知道,程序運行期間 cpu 利用情況。對于單核,計算密集型的程序,real 會很接近 user 和 sys  時間之和的。

Tips:有些同學可能對操作系統可能不太熟悉,這里簡單科普下內核態和用戶態的基本概念

Linux 為使系統更穩定,采取了隔離保護的措施,運行狀態分為內核態和用戶態:

  • 用戶態:用戶代碼不具備直接訪問底層資源的能力,需要借助內核提供的系統調用 API。在這種隔離保護下,即使用戶程序崩潰,也不會影響整個系統的功能。

  • 內核態:內核代碼具備最大權限,可執行任意 cpu  指令,不受任何限制。內核態通常是操作系統提供的最底層、最可靠的代碼運行的,內核態的代碼崩潰是災難性的,影響整個系統的正常運行。

2 你運行的可能是假time

time 還有其它功能嗎?看一下幫助文檔吧

root@chopin:~$ time --help --help: command not found real 0m0.129s user 0m0.084s sys 0m0.036s

竟然報錯,將 --help 當成了命令來執行了,難道 time 就這么點能耐嗎?

好吧,我也不賣關子了,直接說答案:你運行的可能是假time。你可能有點懵逼,怎么就假的了。

其實在 Linux 系統上,使用 time 時,你可能會遇到三種版本:

# 1. Bash time is a shell keyword # 2. Zsh time is a reserved word # 3. GNU time time is /usr/bin/time

我們當前 Shell 是 Bash,可以通過 type 命令

root@chopin:~$ type time time is a shell keyword

可以看到,我們剛才執行的 time 是 Shell 的內置命令,如果你用的是 zsh,默認使用的 time 也是對應內置命令。

GNU time 命令路徑是 /usr/bin/time,一般的 Linux 發行版都帶有這個命令,它才是我們今天的豬腳。

3 更強大的功能

GNU time 命令提供了更強大的功能:

更詳細的統計信息

更豐富的格式輸出

支持保存統計數據到文件

下邊我們來學習寫 GNU time 的使用

1. 最簡單的用法

root@chopin:~$ /usr/bin/time sleep 2 0.00user 0.00system 0:02.00elapsed 0%CPU (0avgtext+0avgdata 1784maxresident)k 0inputs+0outputs (0major+72minor)pagefaults 0swaps

使用 GNU time 命令,直接使用絕對路徑即可,我們可以看到輸出信息更多了,不過格式有點丑,后邊會講如何自定義格式。

2. 保持內置 time 的輸出樣式

有同學會問,能輸出內置 Shell 那種的格式么?可以的,使用 -p 選項即可

root@chopin:~$ /usr/bin/time -p sleep 2 real 2.00 user 0.00 sys  0.00

3. 輸出更詳細的信息

還可以輸出更加詳細的信息,讓你對程序運行信息一目了然。請使用 -v 選項

root@chopin:~$ /usr/bin/time -v sleep 2 Command being timed: "sleep 2" User time (seconds): 0.00 System time (seconds): 0.00 Percent of CPU this job got: 0% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.00 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1804 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 71 Voluntary context switches: 1 Involuntary context switches: 1 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0

這里詳細介紹下 time 命令輸出各項指標

(一)時間相關

在Linux上使用Time統計程序運行時間

(二)內存相關

在Linux上使用Time統計程序運行時間

(三)IO 相關

在Linux上使用Time統計程序運行時間

4. 統計信息輸出到文件

如果你希望將 time 統計的信息輸出到文件,可以使用 -o 選項

root@chopin:~$ /usr/bin/time -v -o a.txt sleep 2

統計信息直接保存到了 a.txt,如果你希望統計信息能夠追加到文件,可以額外加 -a 選項

5. 自定義格式輸出

如果命令中內置的輸出格式,不符合你的需求,GNU time 可以支持自定義輸出格式,通過選項 -f 可以各種指標參數

/usr/bin/time -f "real %e\nuser %U\nsys %S\n" sleep 1 real 1.00 user 0.00 sys  0.00

具體支持的格式,貼心的肖邦已經幫你整理好了

在Linux上使用Time統計程序運行時間

這些格式參數太多了,平時大部分情況用不到,可以收藏起來,以便后期使用時可以快速參考。

4 在性能分析中的作用

看到這么多系統參數指標,難免會有同學會感到疑惑,這些參數能干什么呀?

其實這些指標,對應到操作系統 cpu、內存、IO  這幾方面。深刻的理解了這些指標參數,可以幫助你從本質上把握程序的運行情況,甚至可以協助你分析程序的性能瓶頸。

下邊我簡單解釋幾個概念,希望能起到拋磚引玉的作用。

(一)CPU 時間

cpu 時間包括:real、user、sys,當 user + sys >= real 時,說明該程序是計算密集型;當 user + sys 遠小于  real 時,說明存在較多的 IO 等待。

(二)上下文切換

平時所說的上下文,是指進程的運行環境,包括當時的寄存器值、內存堆棧等信息,內核可以根據上下文完全恢復一個被打斷的進程任務。

當執行系統調用、進程切換時,都會產生上下文切換。切換上下文時,操作系統需要為進程保存和恢復上下文信息。

上下文切換分為主動和被動兩種,主動上下文切換多,說明存在較多的阻塞調用;被動上下文切換說明 cpu 使用率高。

當上下文切換過多時,意味著較多的 cpu 時間花費在上下文切換上,導致 cpu 處理進程任務的有效時間大大減少。

(三)缺頁異常

次缺頁異常較多,說明程序的內存布局相對合理,命中率高;當主缺頁異常較多時,說明程序對內存的訪問跳躍性大,命中率低。

處理缺頁異常和切換上下文的時間,不包含在 user 和 sys 中,當發現 user + sys 遠小于 real  時,則很可能大部分時間都消耗在這些地方,需要重點分析這兩點。

感謝各位的閱讀,以上就是“在Linux上使用Time統計程序運行時間”的內容了,經過本文的學習后,相信大家對在Linux上使用Time統計程序運行時間這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

怀集县| 红原县| 溆浦县| 远安县| 梧州市| 平顺县| 达孜县| 东丰县| 获嘉县| 兴义市| 教育| 阜南县| 保靖县| 凤翔县| 新河县| 滦平县| 涟水县| 朝阳市| 如东县| 陵水| 康马县| 中山市| 溧阳市| 大田县| 阜平县| 曲水县| 拜泉县| 会宁县| 沙田区| 海阳市| 新乐市| 邹城市| 乌鲁木齐县| 盐津县| 乌兰浩特市| 巍山| 沛县| 平顶山市| 芷江| 宁蒗| 刚察县|