一、Linux下有什么工具可以分析出一個程序的運算時間分布
最近在使用?time?命令時,無意間發現了一些隱藏的小秘密和強大功能,今天分享給大家。
time在Linux下是比較常用的命令,可以幫助我們方便的計算程序的運行時間,對比采用不同方案時程序的運行性能。看似簡單的命令,其實蘊藏著很多細節和技巧,來跟著肖邦一起學習吧。
先來看下最基礎的用法,也可能是大家最常見的用法了
root@chopin:~$?time?find?.?-name?“chopin.txt”……real???0m0.174suser???0m0.084ssys????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?2real???0m2.001suser???0m0.000ssys????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 指令,不受任何限制。內核態通常是操作系統提供的最底層、最可靠的代碼運行的,內核態的代碼崩潰是災難性的,影響整個系統的正常運行。延伸閱讀:
二、MongoDB是什么
MongoDB 是文檔型數據庫的代表,數據模型基于 Bson,而 Elasticsearch 的文檔數據模型是 Json,Bson 本質是 Json 的一種擴展,可以相互直接轉換,且它們的數據模式都是可以自由擴展的,基本無限制。MongoDB 本身定位與關系型數據庫競爭,支持嚴格的事務隔離機制,在這個層面實際上與 Elasticsearch 產品定位不一樣,但實際工作中,幾乎沒有公司會將核心業務數據放在 MongoDB 上,關系型數據庫依然是名列前茅選擇。